//+------------------------------------------------------------------+//| Язык разметки KIB |
//| |//| |//+------------------------------------------------------------------+//---------------------------------//УРОК 1. //---------------------------------//---------------------------------//СОДЕРЖАНИЕ://---------------------------------1. СОЗДАНИЕ ФОРМЫ ОКНА.
2. ПРАВИЛА СОЗДАНИЯ ГРУПП ЭЛЕМЕНТОВ.
3. ПРАВИЛА СОЗДАНИЯ ЭЛЕМЕНТОВ.
4. ТИПЫ ЭЛЕМЕНТОВ.
//---------------------------------//--------------------------------------------------------------------------------------------------+//1. СОЗДАНИЕ ФОРМЫ ОКНА: //--------------------------------------------------------------------------------------------------+
ПОСЛЕДОВАТЕЛЬНОСТЬ КОММАНД:
1. ОБЪЯВЛЯЕМ НОВОЕ ОКНО: NEW_WINDOW,
2. ИМЕНУЕМ ОКНО: W_NAME, "Window 1",
3. ВЫБИРАЕМ ИКОНКУ ОКНА ИЗ ОКНА ИКОНОК КОНСТРУКТОРА (ВЫЗЫВАЕТСЯ ДАБЛ-КЛИКОМ НА ГРАФИК) И ПРОПИСЫВАЕМ : W_LABEL, "::Images\\some_icon.bmp",
4. УСТАНАВЛИВАЕМ ТИП ОКНА - W_TYPE, SETTINGS, (ИЛИ DINAMIC, MENU, DIALOG).
//--------------------------------------------------------------------------------------------------+
NEW_WINDOW, W_NAME, "Window 1", W_LABEL, "::Images\\some_icon.bmp", W_TYPE, SETTINGS,
//--------------------------------------------------------------------------------------------------+5. ПОСЛЕ ОБЪЯВЛЕНИЯ ОКНА, ЗАВЕРШАЕМ ЕГО КОММАНДОЙ END_WINDOW,
//--------------------------------------------------------------------------------------------------+//---------------------------------------------------------------------------------------------------
ОБЪЯВЛЕНИЕ ГРУПП ЭЛЕМЕНТОВ:
//---------------------------------------------------------------------------------------------------1. ВСЕ ЭЛЕМЕНТЫ СУЩЕСТВУЮТ ТОЛЬКО В СВОИХ ГРУППАХ.
2. ВСЕ ГРУППЫ ОБЪЯВЛЯЮТСЯ КОММАНДОЙ GROUP И ОБЯЗАНЫ ИМЕТЬ ИМЯ. (ЕСЛИ ИМЯ НЕСУЩЕСТВЕННО, СТАВИТЬ А. без кавычек)
GROUP, "Main tabs", или GROUP, A,
3. ВСЕ ГРУППЫ ЗАВЕРШАЮТСЯ КОММАНДОЙ END_GROUP.
4. ПОСЛЕ END_GROUP ПИШЕТСЯ ПОЗИЦИЯ ГРУППЫ И СВОЙСТВА ЭЛЕМЕНТОВ.
5. ГРУППА ОБЯЗАНЫ БЫТЬ ПОЗИЦИОНИРОВАНА. ДЛЯ ЭТОГО ИСПОЛЬЗУЕТСЯ ПРОСТОЙ МЕТОД:
i,(символ группы), AT, (ПОЗИЦИЯ) _Х2Х, (ТИП ПРИВЯЗКИ) "name", (ИМЯ ОБЪЕКТА ПРИВЯЗКИ) 0 (ПОПРАВКА) И ТОЖЕ САМОЕ ДЛЯ ОСИ Y.
//--------------------------------------------------------------------------------------------------+
i, AT, _X2X, "MF", 5, _Y2Y, "MF",5, ("MF" - ОЗНАЧАЕТ MAIN FRAME ОКНА, 5 - ПОПРАВКА)
//--------------------------------------------------------------------------------------------------+ //--------------------------------------------------------------------------------------------------+
ПРИНЦИПЫ ПОСТРОЕНИЯ ГРУПП:
1. ЖЕЛАТЕЛЬНО, СТРОИТЬ ТАБЛИЧНУЮ РАСКЛАДКУ ЭЛЕМЕНТОВ ВНУТРИ ГРУПП - СТАВИТЬ РАВНОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ В РЯДУ, - ОДНАКО, МОГУТ БЫТЬ ИСКЛЮЧЕНИЯ.
2. СТРОКА ОБЪЯВЛЕНИЙ ЭЛЕМЕНТОВ - ЭТО РЯД. (Ряд начинается со знака __,).
3. КАЖДЫЙ ЭЛЕМЕНТ ОБЯЗАН ИМЕТЬ ИМЯ. ЭТО МОЖЕТ БЫТЬ ИМЯ СОБСТВЕННОЕ ИЛИ АБСТРАКТНОЕ A. ИМЯ СОБСТВЕННОЕ СТАВИТСЯ В КАВЫЧКИ.
4. ВНУТРИ СТРОКИ ОБЪЯВЛЯЕНИЯ ЭЛЕМЕНТОВ, МОЖНО ПРОПИСЫВАТЬ УСТАНОВКИ ИХ ИНДИВИДУАЛЬНЫХ СВОЙСТВ.
5. ПРИ УСТАНОВКИ СВОЙСТВ ВНУТРИ СТРОКИ ЭЛЕМЕНТОВ, СВОЙСТВА ПЕРЕЧЕСЛЯЮТСЯ ЧЕРЕЗ ЗНАК _, КОТОРЫЙ ОТСЫЛАЕТ КОНСТРУКТОР К НУЖНОМУ ЭЛЕМЕНТУ.
__, M_ITEM, "M_ITEM 1", N_LABEL,"::Images\\some_icon.bmp", _,N_COLOR,(int)clrWhite,_,NB_COLOR,(int)clrWhite,_,AB_COLOR,(int)clrWhite, _,KC_TEXT,"Cntrl+Shift",
В ИТОГЕ ПОЛУЧАЕТСЯ ЦЕПОЧКА СВОЙСТВ. ЕЕ МОЖНО ПЕРЕНОСИТЬ МЕЖДУ ЭЛЕМЕНТАМИ ИЛИ КОПИРОВАТЬ.
6. ДЛЯ ЗАДАНИЯ ДИСТАНЦИИ МЕЖДУ ЭЛЕМЕНТАМИ В ГРУППЕ ИСПОЛЬЗУЙТЕ СЛОВА X_GAP, Y_GAP. СТАВЬТЕ ИХ ПОСЛЕ ЗАВЕРШЕНИЯ ГРУППЫ.
//-------------------
i, X_GAP, 5,
i, Y_GAP, 5,
//------------------- //--------------------------------------------------------------------------------------------------+
!!! КРАЙНЕ ВАЖНО: ЗАПРЕЩЕНО ДАВАТЬ ЭЛЕМЕНТАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА.
ЗАПРЕЩЕНО ДАВАТЬ ГРУППАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА.
ИСПОЛЬЗОВАНИЯ A ВМЕСТО ИМЕНИ НЕ ПРИВОДИТ К СОВПАДЕНИЮ ИМЕН.
//----------------------------------------------------------------
ПРИМЕР ПОСТРОЕНИЯ ГРУППЫ:
//--------------------------------------------------------------------------------------------------+
GROUP, A,
__, CHECKBOX, "Checkbox 1", CHECKBOX, "Checkbox 2",
__, CHECKBOX, "Checkbox 3", CHECKBOX, "Checkbox 4",
__, CHECKBOX, "Checkbox 5", CHECKBOX, "Checkbox 6",
__, CHECKBOX, "Checkbox 7", CHECKBOX, "Checkbox 8",
END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10,
i, X_GAP, 30,
i, Y_GAP, 20,
//--------------------------------------------------------------------------------------------------+
!!! НЕ ЗАБЫВАЙТЕ ЗАВЕРШАТЬ ОКНА КОММАНДОЙ END_WINDOW И ГРУППЫ END_GROUP.
//----------------------------------------------------------------------------------
NEW_WINDOW, //Объявление окна. (Писать ОБЯЗАТЕЛЬНО)
W_NAME, "Demo window 1", //Название окна. (Тоже ОБЯЗАТЕЛЬНО)
W_ICON, "::Images\\16x16\\Database.bmp", //Иконка окна. (Указывать необязательно)
W_TYPE, SETTINGS, //Тип окна.(ОБЯЗАТЕЛЬНО)
OOI, //Флаг открытия окна при инициализации.(Указывать необязательно)
MARGINS, 30,30, //Правый и нижний отступ рамки окна. (Указывать необязательно)//----------------------------------------------------------------------------------
GROUP, A, //Объявление группы элементов. Абстрактное имя (А). Писать обязательно.
__, CHECKBOX, "Some checkbox 1", D_LIST, "Some list 1", //Ряд 1
__, R_BUTTON, "Some radio button 1", R_BUTTON, "Some radio button 2", //Ряд 2
END_GROUP, //Завершение группы элементов. Ставить обязательно.
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10, //Позиция всех группы элементов в окне относительно левого верхнего края.
i, X_GAP, 30, //Промежутки между элементами по оси Х.
i, Y_GAP, 30, //Промежутки между элементами по оси Y. //----------------------------------------------------------------------------------
GROUP, A,
__,L_ITEM, "L_ITEM 1",
__,L_ITEM, "L_ITEM 2",
__,L_ITEM, "L_ITEM 3",
__,L_ITEM, "L_ITEM 4",
__,L_ITEM, "L_ITEM 5",
__,L_ITEM, "L_ITEM 6", ON, //Включаем один из элементов списка по умолчанию.
__,L_ITEM, "L_ITEM 7",
__,L_ITEM, "L_ITEM 8",
__,L_ITEM, "L_ITEM 9",
__,L_ITEM, "L_ITEM 10",
__,L_ITEM, "L_ITEM 11",
__,L_ITEM, "L_ITEM 12",
__,L_ITEM, "L_ITEM 13",
__,L_ITEM, "L_ITEM 14",
__,L_ITEM, "L_ITEM 15",
END_GROUP,
//-------------------------
i, IN,"Some list 1", //Указание в каком списке будут находиться элементы.
i, AT, LEFT_TOP, 0,0, //Флаг позиции элементов группы наканвасе(Писать ОБЯЗАТЕЛЬНО)
i, Y_GAP, 2, //Дистанция между пунктами списка. Есть значение по умолчанию. Можно явно задавать свое.//----------------------------------------------------------------------------------
END_WINDOW, //(Писать ОБЯЗАТЕЛЬНО)
Привет Петр. Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих. Забегая вперед, можно задать тебе пару вопросов? Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей. Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту? Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы. В связи с этим:
Вопрос 1
Какой существует механизм для программиста обработки события со стороны твоего GUI? Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента. Пример кода:
typedefvoid (*TFuncSlider)(double);
typedefvoid (*TFuncCheckList)(int);
typedefvoid (*TFuncButton)(bool);
class Slider {
...
TFuncSlider func;
...
}
class CheckList{...}
class CheckBox{...}
class Button{...}
class Menu{
Slider sliders[];
CheckList check_list[];
CheckBox check_boxes[];
Button buttons[];
.....
menu.AddSlider(1,3,37.5,52,1.5,"Channel width = ",0,4,k_can,3,true,false,SetWidth,false); // Создание конкретного слайдера при формировании GUI, где SetWidth - указатель на функцию
.....
voidSetWidth(double wid) { // функция обработчик измениения состояния конкретного слайдера, которую пишет программист
k_can = wid;
ReDrawPol();
}
Вопрос 2
Как программисту получить доступ к состоянию конкретного элемента GUI? Например, в моем GUI состояние checkbox (bool) я могу получить так:
if (menu1.check_boxes[ch.N].checked) {
....
}
else {
....
}
но я использую классы, вложенные друг в друга. А как это сделать у тебя?
Nikolai Semko #: Привет Петр. Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих. Забегая вперед, можно задать тебе пару вопросов? Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей. Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту? Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы. В связи с этим:
Вопрос 1
Какой существует механизм для программиста обработки события со стороны твоего GUI? Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента. Пример кода:
Вопрос 2
Как программисту получить доступ к состоянию конкретного элемента GUI? Например, в моем GUI состояние checkbox (bool) я могу получить так:
но я использую классы, вложенные друг в друга. А как это сделать у тебя?
Николай привет!
Отвечаю по порядку:
1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора. Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)
2. Механизм простой. После завершения редактирования интерфейса, пользователь вызывает контекстное меню конструктора дабл-кликом на график и выбирает опцию сохранения. Конструктор печатает всю информацию в два файла. Эти файлы используются движком.
Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже.
Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:
1. Написали окно.
2. Далее по инструкции ниже:
3.
Переносим два напечатанных конструктором файла в свой проект.
Подключаем к своему советнику.
Прописываем вызывы нескольких функций как показано на картинке.
4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.
//---------------------------------------------------------------------------------------------------------------------------+// PLEASE READ CAREFULLY |//---------------------------------------------------------------------------------------------------------------------------+//-------------------------------------TO GET OR SET VALUE FOR YOUR VARIABLE-------------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//1. To initialize your variable with this value, type: variable = ( type of your variable )value; |//2. To initialize your variable with some element's value, type: variable = E_, then, choose element and add (); |//---------------------------------------------------------------------------------------------------------------------------+//---------------------------------------TO GET OR SET VALUE OF THE ELEMENT--------------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//3. To use value of some element, type: E_, then, choose element and add (); |//4. To set new value to some element, type: E_, then, choose element and add ( type here new value ); |//---------------------------------------------------------------------------------------------------------------------------+//-------------------------------------------TO OPEN OR CLOSE A WINDOW-------------------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//5. To open your window, type: W_, then, choose window and add (); |//6. To close your window, type: W_, then, choose window and add (close); |//---------------------------------------------------------------------------------------------------------------------------+//------------------------------------TO CHANGE A COLOR PROPERTY OF THE ELEMENT----------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//7. To change main color of the element: Type E_,then, choose element and add (M_COLOR,your color);|//8. To change text color of the element: Type E_,then, choose element and add (T_COLOR,your color);|//9. To change frame color of the element: Type E_,then, choose element and add (F_COLOR,your color);|//---------------------------------------------------------------------------------------------------------------------------+//------------------------------------TO CHANGE READ ONLY PROPERTY OF THE TEXT BOX-------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//10.To change READ ONLY property of the text box: Type E_,then, choose element and add (ONLY_READ,0 or 1); |//---------------------------------------------------------------------------------------------------------------------------+//------------------------------------TO CHANGE A STATE PROPERTY OF THE ELEMENT----------------------------------------------+//---------------------------------------------------------------------------------------------------------------------------+//11.You can set 6 possible states of the element: OFF, ON, LOCKED_OFF, LOCKED_ON, OFF_H, ON_H. |//To set a new state of the element: Type E_,then, choose element and add (STATE,one of the states above);|//---------------------------------------------------------------------------------------------------------------------------+//***************************************************************************************************************************+//NOTICE: THE COLOR WILL BE SET FOR THE CURRENT STATE OF THE ELEMENT. IF THE STATE CHANGES, THE COLOR WILL CHANGE. |// IN EACH STATE THE ELEMENT CAN HAVE DIFFERENT MAIN, TEXT AND FRAME COLOR. MAKE SURE TO CONSIDER THE STATE |// OF THE ELEMENT, WHEN YOU CHANGE IT'S MAIN, TEXT OR FRAME COLOR. | //---------------------------------------------------------------------------------------------------------------------------+string DRIVE_MESSAGE_ADRESS = "\Experts\Advisors\MY_VS.1.0.ex5";
//---------------------------------------------------------------------------------------------------------------------------+//---------------------------------------- #define _open 13#define _close 14//---------------------------------------- #define on 1#define off 0//---------------------------------------- #define pressed 1#define released 0//---------------------------------------- #define checked 1#define unchecked 0//---------------------------------------- #define rare_value "~~`````~```~~~~~`~~~`~"//---------------------------------------- int Params[10000];
//---------------------------------------- int par = 0;
//---------------------------------------- string i_MSG = NULL;
//---------------------------------------- uint Orders[];
//---------------------------------------- uint N = 0;
//---------------------------------------- #define Descending -1//========================================================================================================= #define CHECKBOX3___Some_checkbox_1 3#define D_LIST4___Some_list_1 4//========================================================================================================= void On_Gui_Event(int Element, string value, double Magic = 0)
{
string action = value, selected_option = value; //DON'T CHANGE THIS LINE//------------------------------------switch(Element)
{
//=====================================================================================================================//WINDOW: Demo window 1 | element: CHECKBOX | name: Some checkbox 1 | Location: Window's Main Frame//=====================================================================================================================case CHECKBOX3___Some_checkbox_1:
//------------------------------------------------------------------------------------------------------//What to do when checkbox checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
case checked: break;
case unchecked: break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
//=====================================================================================================================//WINDOW: Demo window 1 | element: D_LIST | name: Some list 1 | Location: Window's Main Frame//=====================================================================================================================case D_LIST4___Some_list_1:
//------------------------------------------------------------------------------------------------------//What to do when option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "L_ITEM 1"){}
if(selected_option == "L_ITEM 2"){}
if(selected_option == "L_ITEM 3"){}
if(selected_option == "L_ITEM 4"){}
if(selected_option == "L_ITEM 5"){}
if(selected_option == "L_ITEM 6"){}
if(selected_option == "L_ITEM 7"){}
if(selected_option == "L_ITEM 8"){}
if(selected_option == "L_ITEM 9"){}
if(selected_option == "L_ITEM 10"){}
if(selected_option == "L_ITEM 11"){}
if(selected_option == "L_ITEM 12"){}
if(selected_option == "L_ITEM 13"){}
if(selected_option == "L_ITEM 14"){}
if(selected_option == "L_ITEM 15"){}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
}
}
//=================================================================================================================//----------------------------------------------------------------------------------------------------------------string E_Demo_window_1_Some_checkbox_1(string n = rare_value, int Property = -1){return(GET_N_SET(3,n,Property));}
//----------------------------------------------------------------------------------------------------------------string E_Demo_window_1_Some_list_1(string n = rare_value, int Property = -1){return(GET_N_SET(4,n,Property));}
//----------------------------------------------------------------------------------------------------------------string E__(string n = rare_value, int Property = -1){return(GET_N_SET(5,n,Property));}
//----------------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------------void W_Main_context_menu(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Set_Values_Change_Delay(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_GEN_Disconnected(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Caption_of_GEN_Disconnected(string Caption)
{
i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "5" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Custom_Context_Menu(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Custom_Set_Values_Change_Delay(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Demo_window_1(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_Caption_of_Demo_window_1(string Caption)
{
i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "10" + "~";
}
//----------------------------------------------------------------------------------------------------------------void W_(int action = _open)
{
if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------------int C_Index(int Par){return((int)P_CORE[Par][_COLOMN_]*1000000 + (int)P_CORE[Par][_G_INDEX]);}
//----------------------------------------------------------------------------------------------------------------//========================================================================================================= string GET_N_SET(int Element, string n, int Property)
{
if(n != rare_value && Property == -1)
{
P_CORE[Element][_NEW_VALUE] = n;
P_CORE[Element][_LAST_VALUE] = P_CORE[Element][_CURRENT_VALUE];
P_CORE[Element][_CURRENT_VALUE] = P_CORE[Element][_NEW_VALUE];
if(n != P_CORE[Element][_LAST_VALUE])i_MSG += (string)_SYNC_P_CORE + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + P_CORE[Element][_CURRENT_VALUE] + "~";
return(P_CORE[Element][_CURRENT_VALUE]);
}
if(n == rare_value && Property == -1)return(P_CORE[Element][_CURRENT_VALUE]);
if((int)n > 12 && (int)n < 18 && Property > -1)
{
if(Property == OFF || Property == OFF_H || Property == LOCKED_OFF)On_Gui_Event(Element,(string)0);
if(Property == ON || Property == ON_H || Property == LOCKED_ON) On_Gui_Event(Element,(string)1);
if(n != P_CORE[Element][_LAST_VALUE])i_MSG += n + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + (string)Property + "~";
}
return(NULL);
}
//=========================================================================================================
Пользователь должен только прописать свои действия в условиях функции OnGuiEvent(). Остальное трогать НЕ НУЖНО.
Переключение состояния элементов управления, а также получения/установка их значений осуществляется с помощью сгенерированных конструктором функций которые пользователь увидит в интеллисенс.
1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора. Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)
2. Механизм простой. После завершения редактирования интерфейса, пользователь вызывает контекстное меню конструктора дабл-кликом на график и выбирает опцию сохранения. Конструктор печатает всю информацию в два файла. Эти файлы используются движком.
Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже.
Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:
1. Написали окно.
2. Далее по инструкции ниже:
3.
Переносим два напечатанных конструктором файла в свой проект.
Подключаем к своему советнику.
Прописываем вызывы нескольких функций как показано на картинке.
4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.
Пользователь должен только прописать свои действия в условиях функции OnGuiEvent(). Остальное трогать НЕ НУЖНО.
Переключение состояния элементов управления, а также получения/установка их значений осуществляется с помощью сгенерированных конструктором функций которые пользователь увидит в интеллисенс.
Петр, я тебя не понял. Ты не ответил на вопросы. Для программистов важно узнать, как взаимодействовать с твоим GUI в процессе работы. Вот пример моего GUI. Я нажал ярлык светлой/темной темы, и это событие сразу вызвало функцию смены цветов фона и линий. Как это взаимодейстие сделать у тебя?
Что значит " Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. "? Программисту нужно взаимодействовать, правда не с кодом, а с событиями, который должен генерировать этот код.
Ведь GUI - это не отдельная независимая программа. GUI должен в конечном итоге взаимодействовать с основной программой разработчика. Будь то индикатор или EA.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Пример простого кода:
Все некогда начатое нужно заканчивать. Даже если это никому не нужно. Таков принцип.
Нужно. Если интерфейс можно будет не только нарисовать, но и использовать. Надеюсь.
Нужно. Если интерфейс можно будет не только нарисовать, но и использовать. Надеюсь.
Несомненно. Над этим и работаю.
Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих.
Забегая вперед, можно задать тебе пару вопросов?
Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей.
Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту?
Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы.
В связи с этим:
Вопрос 1
Какой существует механизм для программиста обработки события со стороны твоего GUI?
Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента.
Пример кода:
Вопрос 2
Как программисту получить доступ к состоянию конкретного элемента GUI?Например, в моем GUI состояние checkbox (bool) я могу получить так:
но я использую классы, вложенные друг в друга.
А как это сделать у тебя?
Привет Петр.
Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих.
Забегая вперед, можно задать тебе пару вопросов?
Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей.
Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту?
Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы.
В связи с этим:
Вопрос 1
Какой существует механизм для программиста обработки события со стороны твоего GUI?
Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента.
Пример кода:
Вопрос 2
Как программисту получить доступ к состоянию конкретного элемента GUI?Например, в моем GUI состояние checkbox (bool) я могу получить так:
но я использую классы, вложенные друг в друга.
А как это сделать у тебя?
Николай привет!
Отвечаю по порядку:
1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора. Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)
2. Механизм простой. После завершения редактирования интерфейса, пользователь вызывает контекстное меню конструктора дабл-кликом на график и выбирает опцию сохранения. Конструктор печатает всю информацию в два файла. Эти файлы используются движком.
Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже.
Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:
1. Написали окно.
2. Далее по инструкции ниже:
3.
4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.
Пользователь должен только прописать свои действия в условиях функции OnGuiEvent(). Остальное трогать НЕ НУЖНО.
Переключение состояния элементов управления, а также получения/установка их значений осуществляется с помощью сгенерированных конструктором функций которые пользователь увидит в интеллисенс.
Из кода файла выше пользователь работает только с этой частью:
Николай привет!
Отвечаю по порядку:
1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора. Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)
2. Механизм простой. После завершения редактирования интерфейса, пользователь вызывает контекстное меню конструктора дабл-кликом на график и выбирает опцию сохранения. Конструктор печатает всю информацию в два файла. Эти файлы используются движком.
Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже.
Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:
1. Написали окно.
2. Далее по инструкции ниже:
3.
4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.
Пользователь должен только прописать свои действия в условиях функции OnGuiEvent(). Остальное трогать НЕ НУЖНО.
Переключение состояния элементов управления, а также получения/установка их значений осуществляется с помощью сгенерированных конструктором функций которые пользователь увидит в интеллисенс.
Петр, я тебя не понял. Ты не ответил на вопросы.
Для программистов важно узнать, как взаимодействовать с твоим GUI в процессе работы.
Вот пример моего GUI. Я нажал ярлык светлой/темной темы, и это событие сразу вызвало функцию смены цветов фона и линий. Как это взаимодейстие сделать у тебя?
Что значит " Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. "?
Программисту нужно взаимодействовать, правда не с кодом, а с событиями, который должен генерировать этот код.
Ведь GUI - это не отдельная независимая программа. GUI должен в конечном итоге взаимодействовать с основной программой разработчика. Будь то индикатор или EA.