//+------------------------------------------------------------------+//| Язык разметки 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, //(Писать ОБЯЗАТЕЛЬНО)
Esse tópico sem sentido pode ser excluído? O que está acontecendo com o código russo no fórum alemão? Além disso, não há nenhum valor agregado por trás dele
Olá, Pyotr. A propósito, essa é uma séria desvantagem de usar nomes em russo. Isso impede a participação de mais de 90% dos programadores que não falam russo de uma só vez. Afinal de contas, eles veem alguns quase rótulos.
Duplicar essa ramificação em vários idiomas é um teste difícil, é claro, para quem não fala russo. Olhando para o futuro, posso lhe fazer algumas perguntas? Como sua GUI foi criada sem o uso de classes, surgem várias incertezas de uma só vez. Afinal, quais devem ser os primeiros requisitos para a GUI como um produto? É a conveniência e a intuitividade da criação de uma GUI, bem como seu uso conveniente no processo de trabalho. A esse respeito:
Pergunta 1
Que mecanismo existe para um programador lidar com o tratamento de eventos na parte de sua GUI? Por exemplo, em minhas GUIs, ao criar umcontrole, adiciono um ponteiro a uma função de tratamento quando ocorre um evento de alteração nesse controle. Exemplo de código:
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();
}
Pergunta 2
Como um programador pode obter acesso ao estado de um determinado elemento da GUI? Por exemplo, em minha GUI, posso obter o estado da caixa de seleção (bool) da seguinte forma: .
if (menu1.check_boxes[ch.N].checked) {
....
}
else {
....
}
Nikolai Semko controle, adiciono um ponteiro a uma função de tratamento quando ocorre um evento de alteração nesse controle. Exemplo de código:
Pergunta 2
Como um programador pode obter acesso ao estado de um determinado elemento da GUI? Por exemplo, na minha GUI, posso obter o estado da caixa de seleção (bool) da seguinte forma: mas uso classes aninhadas. Como você faz isso?
Nicholas Olá!
Vou responder na ordem:
1. O usuário NÃO interage (de forma alguma) com meu código. Isso não é necessário. Mais adiante você entenderá o porquê. O usuário precisa APENAS da linguagem de marcação. (Já enfatizei isso várias vezes antes, mas sempre recebo essa pergunta recorrente de programadores. ) O motivo é que o usuário apenas "inicializa" a matriz usando palavras-chave da linguagem que são definidas por defines no código do construtor. O interpretador (indicador) envia uma matriz com o código de marcação (o que mostrei acima) para o construtor (que é o EA no mesmo gráfico) e o construtor lê a matriz e constrói a GUI. O código da linguagem de marcação é uma instrução para o construtor. Ele executa a construção (desenho, inicialização dos parâmetros do elemento, configurações etc.) de acordo com ele.
2. O mecanismo é simples. Após terminar de editar a interface, o usuário chama o menu de contexto do construtor clicando duas vezes no gráfico e selecionando a opção salvar. O construtor imprime todas as informações em dois arquivos. Esses arquivos são usados pelo mecanismo.
Deixe-me explicar em detalhes: o usuário conecta os dois arquivos recebidos do construtor e do mecanismo (que eu fornecerei) ao seu EA (no cabeçalho do EA. Fornecerei um exemplo de conexão). Em seguida, escreve várias chamadas nas funções OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornecerei um exemplo). Em seguida, entra em um arquivo impresso pelo construtor chamado Internal_API. Esse arquivo contém tudo o que é necessário para conectar os controles da GUI ao Expert Advisor/indicador do usuário. Ou seja, funções geradas dos elementos e instruções detalhadas. Fornecerei exemplos de conexão mais tarde.
Novamente, nada complicado. Tudo está lá. Veja, por exemplo, como fica a interface acima:
1. Escreveu uma janela.
2. Segui as instruções abaixo:
3.
Transfira os dois arquivos impressos pelo construtor para o seu projeto.
Conecte-se ao seu Expert Advisor.
Escreva chamadas de várias funções, conforme mostrado na figura.
4. abra o arquivo InternalAPI e inicie a conexão. O arquivo contém tudo.
//---------------------------------------------------------------------------------------------------------------------------+// 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);
}
//=========================================================================================================
Ousuário só precisa escrever suas ações nas condições da função OnGuiEvent(). O restante NÃO precisa ser tocado.
A mudança de estado dos controles, bem como a obtenção/definição de seus valores, é feita com a ajuda de funções geradas pelo construtor, que o usuário verá no intellisense.
1. O usuário NÃO VAI interagir (a partir da palavra em tudo) com o meu código. Isso não é necessário. A seguir, você entenderá por quê. O usuário precisa APENAS da linguagem de marcação. (Já enfatizei isso várias vezes antes, mas sempre recebo essa pergunta recorrente de programadores. ) O motivo é que o usuário apenas "inicializa" a matriz usando palavras-chave da linguagem que são definidas por defines no código do construtor. O interpretador (indicador) envia uma matriz com o código de marcação (o que mostrei acima) para o construtor (que é o EA no mesmo gráfico) e o construtor lê a matriz e constrói a GUI. O código da linguagem de marcação é uma instrução para o construtor. Ele executa a construção (desenho, inicialização dos parâmetros do elemento, configurações etc.) de acordo com ele.
2. O mecanismo é simples. Após concluir a edição da interface, o usuário chama o menu de contexto do construtor clicando duas vezes no gráfico e selecionando a opção salvar. O construtor imprime todas as informações em dois arquivos. Esses arquivos são usados pelo mecanismo.
Vou explicar em detalhes: o usuário conecta os dois arquivos recebidos do construtor e do mecanismo (que eu fornecerei) ao seu EA (no cabeçalho do EA. Fornecerei um exemplo de conexão). Em seguida, escreve várias chamadas nas funções OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornecerei um exemplo). Em seguida, entra em um arquivo impresso pelo construtor chamado Internal_API. Esse arquivo contém tudo o que é necessário para conectar os controles da GUI ao Expert Advisor/indicador do usuário. Ou seja, funções geradas dos elementos e instruções detalhadas. Fornecerei exemplos de conexão mais tarde.
Novamente, nada complicado. Tudo está lá. Veja, por exemplo, como fica a interface acima:
1. Escrevemos uma janela.
2. Seguimos as instruções abaixo:
3.
Transfira os dois arquivos impressos pelo construtor para seu projeto.
Conecte-o ao seu Expert Advisor.
Escreva chamadas de várias funções, conforme mostrado na figura.
4. Abra o arquivo InternalAPI e inicie a conexão. O arquivo contém tudo.
Ousuário só precisa especificar suas ações nas condições da função OnGuiEvent(). O restante NÃO precisa ser tocado.
A mudança de estado dos controles e a obtenção/definição de seus valores são feitas com a ajuda de funções geradas pelo construtor, que o usuário verá no intellisense.
Peter, não estou entendendo você.
Você não respondeu às perguntas. É importante que os programadores saibam como interagir com sua GUI durante o trabalho. Aqui está um exemplo da minha GUI. Cliquei no atalho do tema claro/escuro e esse evento acionou imediatamente a função para alterar as cores e as linhas do plano de fundo. Como você faz essa interação?
O que significa "O usuário NÃO interagirá (de forma alguma) com o meu código "? O programador precisa interagir, não com o código, mas com os eventos que devem gerar esse código. Afinal, a GUI não é um programa separado e independente. Em última análise, a GUI deve interagir com o programa principal do desenvolvedor. Seja ele um indicador ou um EA.
Exemplo de um código simples:
Qualquer coisa, uma vez iniciada, deve ser concluída. Mesmo que ninguém precise dela. Esse é o princípio.
Você precisa. Se a interface puder não apenas ser desenhada, mas também usada. Espero que sim.
Necessidade. Se a interface puder não apenas ser desenhada, mas também usada. Espero que sim.
Com certeza. É nisso que estou trabalhando.
Duplicar essa ramificação em vários idiomas é um teste difícil, é claro, para quem não fala russo. Olhando para o futuro, posso lhe fazer algumas perguntas? Como sua GUI foi criada sem o uso de classes, surgem várias incertezas de uma só vez. Afinal, quais devem ser os primeiros requisitos para a GUI como um produto? É a conveniência e a intuitividade da criação de uma GUI, bem como seu uso conveniente no processo de trabalho. A esse respeito:
Pergunta 1
Que mecanismo existe para um programador lidar com o tratamento de eventos na parte de sua GUI? Por exemplo, em minhas GUIs, ao criar umcontrole, adiciono um ponteiro a uma função de tratamento quando ocorre um evento de alteração nesse controle. Exemplo de código:
Pergunta 2
Como um programador pode obter acesso ao estado de um determinado elemento da GUI? Por exemplo, em minha GUI, posso obter o estado da caixa de seleção (bool) da seguinte forma: .
Mas eu uso classes aninhadas, como você faz isso?
Pergunta 2
Como um programador pode obter acesso ao estado de um determinado elemento da GUI? Por exemplo, na minha GUI, posso obter o estado da caixa de seleção (bool) da seguinte forma: mas uso classes aninhadas. Como você faz isso?
Nicholas Olá!
Vou responder na ordem:
1. O usuário NÃO interage (de forma alguma) com meu código. Isso não é necessário. Mais adiante você entenderá o porquê. O usuário precisa APENAS da linguagem de marcação. (Já enfatizei isso várias vezes antes, mas sempre recebo essa pergunta recorrente de programadores. ) O motivo é que o usuário apenas "inicializa" a matriz usando palavras-chave da linguagem que são definidas por defines no código do construtor. O interpretador (indicador) envia uma matriz com o código de marcação (o que mostrei acima) para o construtor (que é o EA no mesmo gráfico) e o construtor lê a matriz e constrói a GUI. O código da linguagem de marcação é uma instrução para o construtor. Ele executa a construção (desenho, inicialização dos parâmetros do elemento, configurações etc.) de acordo com ele.
2. O mecanismo é simples. Após terminar de editar a interface, o usuário chama o menu de contexto do construtor clicando duas vezes no gráfico e selecionando a opção salvar. O construtor imprime todas as informações em dois arquivos. Esses arquivos são usados pelo mecanismo.
Deixe-me explicar em detalhes: o usuário conecta os dois arquivos recebidos do construtor e do mecanismo (que eu fornecerei) ao seu EA (no cabeçalho do EA. Fornecerei um exemplo de conexão). Em seguida, escreve várias chamadas nas funções OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornecerei um exemplo). Em seguida, entra em um arquivo impresso pelo construtor chamado Internal_API. Esse arquivo contém tudo o que é necessário para conectar os controles da GUI ao Expert Advisor/indicador do usuário. Ou seja, funções geradas dos elementos e instruções detalhadas. Fornecerei exemplos de conexão mais tarde.
Novamente, nada complicado. Tudo está lá. Veja, por exemplo, como fica a interface acima:
1. Escreveu uma janela.
2. Segui as instruções abaixo:
3.
4. abra o arquivo InternalAPI e inicie a conexão. O arquivo contém tudo.
Ousuário só precisa escrever suas ações nas condições da função OnGuiEvent(). O restante NÃO precisa ser tocado.
A mudança de estado dos controles, bem como a obtenção/definição de seus valores, é feita com a ajuda de funções geradas pelo construtor, que o usuário verá no intellisense.
Pelo código do arquivo acima, o usuário está trabalhando apenas com essa parte:
Nicholas, olá!
Vou responder na ordem:
1. O usuário NÃO VAI interagir (a partir da palavra em tudo) com o meu código. Isso não é necessário. A seguir, você entenderá por quê. O usuário precisa APENAS da linguagem de marcação. (Já enfatizei isso várias vezes antes, mas sempre recebo essa pergunta recorrente de programadores. ) O motivo é que o usuário apenas "inicializa" a matriz usando palavras-chave da linguagem que são definidas por defines no código do construtor. O interpretador (indicador) envia uma matriz com o código de marcação (o que mostrei acima) para o construtor (que é o EA no mesmo gráfico) e o construtor lê a matriz e constrói a GUI. O código da linguagem de marcação é uma instrução para o construtor. Ele executa a construção (desenho, inicialização dos parâmetros do elemento, configurações etc.) de acordo com ele.
2. O mecanismo é simples. Após concluir a edição da interface, o usuário chama o menu de contexto do construtor clicando duas vezes no gráfico e selecionando a opção salvar. O construtor imprime todas as informações em dois arquivos. Esses arquivos são usados pelo mecanismo.
Vou explicar em detalhes: o usuário conecta os dois arquivos recebidos do construtor e do mecanismo (que eu fornecerei) ao seu EA (no cabeçalho do EA. Fornecerei um exemplo de conexão). Em seguida, escreve várias chamadas nas funções OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornecerei um exemplo). Em seguida, entra em um arquivo impresso pelo construtor chamado Internal_API. Esse arquivo contém tudo o que é necessário para conectar os controles da GUI ao Expert Advisor/indicador do usuário. Ou seja, funções geradas dos elementos e instruções detalhadas. Fornecerei exemplos de conexão mais tarde.
Novamente, nada complicado. Tudo está lá. Veja, por exemplo, como fica a interface acima:
1. Escrevemos uma janela.
2. Seguimos as instruções abaixo:
3.
4. Abra o arquivo InternalAPI e inicie a conexão. O arquivo contém tudo.
Ousuário só precisa especificar suas ações nas condições da função OnGuiEvent(). O restante NÃO precisa ser tocado.
A mudança de estado dos controles e a obtenção/definição de seus valores são feitas com a ajuda de funções geradas pelo construtor, que o usuário verá no intellisense.
Peter, não estou entendendo você.
Você não respondeu às perguntas. É importante que os programadores saibam como interagir com sua GUI durante o trabalho. Aqui está um exemplo da minha GUI. Cliquei no atalho do tema claro/escuro e esse evento acionou imediatamente a função para alterar as cores e as linhas do plano de fundo. Como você faz essa interação?
O que significa "O usuário NÃO interagirá (de forma alguma) com o meu código "? O programador precisa interagir, não com o código, mas com os eventos que devem gerar esse código. Afinal, a GUI não é um programa separado e independente. Em última análise, a GUI deve interagir com o programa principal do desenvolvedor. Seja ele um indicador ou um EA.