Мой подход. Ядро - Движок. - страница 7

 
Самый лучший способ упорядочивания свойств, объектов и элементов - создать таблицу.

Ядро элементов и есть таблица.

Мы создали модель прото-ядра, предназначенного для хранения исходных параметров объектов конкретного элемента.

Далее, мы должны создать главное Ядро и записать в него столько элементов, сколько нам нужно.

Потом, мы установим новые значения каждому элементу внутри главного ядра.

После, - мы создадим элементы.

Потом будем работать с ними на различных событиях.


 

Объявляем главное ядро:

int G_CORE[All_objects][All_properties];

Каждый ряд Ядра будет занимать один Объект.

Мы должны определить, сколько всего объектов будет в Ядре. Для этого, мы должны посчитать количество элементов которые мы хотим создать, и количество Объектов в каждом Элементе.

Допустим, нам нужно 10 кнопок. И того: 10 элементов * 3 объекта = 30 объектов. Значит, - 30 рядов.

#define All_objects     30
#define All_properties  10

Мы увеличили количество свойств в главном Ядре, потому что помимо основных параметров, нам нужны имена Элементов и Объектов, связки между ними и еще какие нибудь свойства.


Заново объявим свойства объектов:

#define NAME        0
#define TYPE        1
#define ELEMENT     2

#define X           3
#define X_SIZE      4
#define Y           5
#define Y_SIZE      6
#define BG_COLOR    7
#define TEXT_COLOR  7
#define TEXT        8
#define CORNER      9
#define STATE       10
//-------------------

Cвойство TEXT будет содержать ссылку на другой массив, в котором будут тексты кнопок.

Свойство ELEMENT необходимо для связывания объектов одного Элемента внутри ядра (чтобы небыло путаницы, какой объект принадлежит какому элементу). В это свойство мы установим порядковый номер элемента.

 
Реter Konow: //Вот как будут выглядеть обращения к свойствам элемента:

Очень легко перепутать базу, текст, и иконку. Это в описании понятно, что стоит внутри того или иного индекса. При реальном программировании - это все придется держать в голове. Я знаю, Петер у нас - титан запоминания с резко ослабленной способностью забывания. Но, боюсь, таких титанов немного. Я вот уже на следующий день забуду, где и что надо ставить.

Не лучше ли иметь примерно следующее (я бы сделал так):

Объявляем нужные нам элементарные структуры.

struct SPosition
{
uint m_uiX;
uint m_uiY;
};

struct SElementSize
{
uint m_uiXSize;
uint m_uiYSize;
};

Теперь из общего объекта можно получить интерфейсы базы, текста и иконки:

CBaseI* pbBase = core.GetBase();
CTextI* ptText = core.GetText();
CIconI* pbIcon = core.GetIcon();

А любой из этих трех интерфейсов - устанавливает соответствующее свойство. Ну, например, текст:

ptText.SetPosition(SPosition& rpPos);

Заполняем структуру позиции (Х и Y), вызываем у ядра интерфейс текста, и у этого интерфейса вызываем функцию установки позиции с нашей структурой. Также каждый из этих интерфейсов имеет функцию установки размера и установки цвета. Целесообразно пронаследовать их от общего чисто виртуального интерфейса, где все функции приравнены к нулю.

Здесь перепутать что-то куда труднее. Потому, что в каждый момент работы ты имеешь доступ исключительно только к тому, что тебе нужно для работы. А для чего-то другого - его надо еще вызвать, и если тебе это запрещено, то при правильном проектировании системы - ты и вызвать этот "запрещенный" интерфейс не сможешь, тем самым оберегая себя от ошибок.

 

И так, cначала изменим количество свойств ядра прототипов, их было столько же, сколько и в главном ядре. Далее сделаем цикл построения G_CORE.

int P_CORE[3][10] = {
//Основание кнопки.-----------------------------
//
//NAME     TYPE   ELEMENT     X    Y     X_SIZE  Y_SIZE       COLOR 
//----------------------------------------------
{ 100001,  base,  button,    100, 100,    200,    50,    C'245,245,245'},
//---------------------------------------------- 
//Текст кнопки.---------------------------------
//
//NAME    TYPE   ELEMENT   X    Y     X_SIZE  Y_SIZE       COLOR 
//----------------------------------------------
{100002,  text,  button,  120, 120,     0,      0,       C'245,0,0'},
//---------------------------------------------- 
//Иконка кнопки.-------------------------------- 
//
//NAME    TYPE     ELEMENT   X    Y     X_SIZE  Y_SIZE       COLOR 
{100003,  icon,    button,  140, 140,     16,     16,           0},
//---------------------------------------------- 
};
//Далее, строим G_CORE:
//--------------------------------------
int q = 0;
//--------------
for(int a1 = 0; a1 < All_objects; a1++)
  {
   for(int a2 = 0; a2 < All_properties; a2++)
    {
     G_CORE[a1][a2] = P_CORE[q][a2];
    }
     q++;
     if(q == 3)q = 0;    
  }


После этого цикла ядро G_CORE будет заполнено прототипами 10-ти кнопок. Далее, наша задача дать Элементам уникальные имена и привязать Объекты к своим Элементам, дав каждому Элементу уникальный индекс.

 
Реter Konow:

И так, cначала изменим количество свойств ядра прототипов, их было столько же, сколько и в главном ядре. Далее сделаем цикл построения G_CORE.

Во-во, отлично видно по этому коду.

Я уже забыл, что там означает a1, а что означает а2.

Но это полбеды - если я забыл - придется поглядеть выше. Но я могу быть уверенным, что я не забыл, а при этом - перепутать элементы.  И потом - хорошо, если это выяснится сразу. А то ведь не факт вовсе, и выяснится ошибка может куда позже, и повлияет она, по закону подлости - как раз на самое уязвимое место, и в самый неподходящий момент.

Подход Петера - это подход титана запоминания.  Тоже вполне нормально. Но много среди участников таких титанов ?

 

А тем временем, даже какая-то мелкая компания открыла код своего убогого GUI :-)

прям-таки обходят на повороте...они испугались конкуренции !!

шутки, шутками но кому интересно могут посмотреть как устроен Windows GUI изнутри:

WPF is a .NET Core UI framework for building Windows desktop applications.: https://github.com/dotnet/wpf

Windows Forms is a .NET Core UI framework for building Windows desktop applications: https://github.com/dotnet/winforms

Backward-compatible versions of Windows UI features including UWP XAML controls, and Fluent styles and materials: https://github.com/Microsoft/microsoft-ui-xaml


 
Maxim Kuznetsov:

А тем временем, даже какая-то мелкая компания открыла код своего убогого GUI :-

Здесь вопрос не в GUI. Мой подход можно экстраполировать и применить для любых целей. В том числе ИИ.

Далее, я покажу как это можно сделать.

 
Джорж, дай пожалуйста мне продолжить. Знаю, что ты предпочитаешь ООП и тебе так удобнее. Но, твои решения рассчитываются исходя из удоств программиста. Я сейчас ищу подход, через который можно достичь максимального развития. Удобство на втором месте.
 
Реter Konow:

Мы должны определить, сколько всего объектов будет в Ядре. Для этого, мы должны посчитать количество элементов которые мы хотим создать, и количество Объектов в каждом Элементе.

#define All_objects     30
#define All_properties  10

Вопрос из зала:

Допустим мы создаем таблицу сделок торгового эксперта. Каждая строка - одна сделка с указанием цены входа, выхода, объема и т.п. Как заранее, до момента компиляции, узнать количество сделок которое совершит эксперт что бы правильно определить количество строк в таблице?

 
Vasiliy Sokolov:

Вопрос из зала:

Допустим мы создаем таблицу сделок торгового эксперта. Каждая строка - одна сделка с указанием цены входа, выхода, объема и т.п. Как заранее, до момента компиляции, узнать количество сделок которое совершит эксперт что бы правильно определить количество строк в таблице?

Добавлять ряд массиву с помощью ArrayResize на каждой сделке, и записывать в него свойства сделки.

При этом, заранее распределить свойства по ячейкам. 

После, все данные будут упорядочены.