Galleria di interfacce utente scritte in MQL - pagina 14

 
//+------------------------------------------------------------------+
//|                                                Язык разметки 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.
 

Esempio di codice semplice:

//----------------------------------------------------------------------------------
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, //(Писать ОБЯЗАТЕЛЬНО)



 
Реter Konow #:

Qualsiasi cosa, una volta iniziata, deve essere portata a termine. Anche se non serve a nessuno. Questo è il principio.

È così. Se l'interfaccia non solo può essere disegnata, ma anche utilizzata. Lo spero.

 
Edgar Akhmadeev #:

Necessità. Se l'interfaccia non solo può essere disegnata, ma anche utilizzata. Speriamo.

Assolutamente sì. È su questo che sto lavorando.

 
Questo thread inutile può essere cancellato? Cos'è questo codice russo nel forum tedesco? Inoltre, non c'è alcun valore aggiunto dietro di esso
 
È possibile cancellare questo messaggio? E chiudere il forum tedesco?
 
Ciao Pyotr. A proposito, c'è un grave svantaggio nell'uso di nomi in russo. Taglia fuori più del 90% dei programmatori non di lingua russa in un colpo solo. Dopo tutto, vedono delle quasi-etichette.




La duplicazione di questo ramo in diverse lingue è una prova difficile, ovviamente, per chi non parla russo. Guardando avanti, posso farle un paio di domande? Dato che la sua GUI è stata creata senza l'uso di classi, sorgono subito diverse incertezze. Dopotutto, quali dovrebbero essere i requisiti della GUI come prodotto? La comodità e l'intuitività della creazione di una GUI, così come il suo comodo utilizzo nel processo di lavoro. A questo proposito:


Domanda 1



Qual è il meccanismo che consente al programmatore di gestire gli eventi della vostra GUI? Ad esempio, nelle mie GUI, quando creo uncontrollo, aggiungo un puntatore a una funzione di gestione quando si verifica un evento di modifica su quel controllo. Esempio di codice:

typedef void      (*TFuncSlider)(double);
typedef void      (*TFuncCheckList)(int);
typedef void      (*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 - указатель на функцию 


.....

void SetWidth(double wid) { // функция обработчик измениения состояния конкретного слайдера, которую пишет программист
   k_can = wid;
   ReDrawPol();
}



Domanda 2



Come può un programmatore accedere allo stato di un particolare elemento della GUI? Ad esempio, nella mia GUI posso ottenere lo stato della casella di controllo (bool) in questo modo: .
if (menu1.check_boxes[ch.N].checked) {
  ....
}
else {
  ....
}


Ma uso classi annidate. Come si fa?

 
Nikolai Semko controllo, aggiungo un puntatore a una funzione di gestione quando si verifica un evento di modifica su quel controllo. Esempio di codice:



Domanda 2





Come può un programmatore accedere allo stato di un particolare elemento della GUI? Ad esempio, nella mia GUI posso ottenere lo stato della casella di controllo (bool) in questo modo: ma uso classi annidate. Come si fa?

Nicholas ciao!

Ti rispondo in ordine sparso:


1. L'utente NON interagisce (dalla parola a tutti) con il mio codice. Non è necessario. Più avanti capirai perché. L'utente ha bisogno SOLO del linguaggio di markup. (L'ho già sottolineato diverse volte, ma ricevo sempre questa domanda ricorrente dai programmatori. ) Il motivo è che l'utente "inizializza" l'array solo utilizzando parole chiave del linguaggio che sono definite da define nel codice del costruttore. L'interprete (indicatore) invia un array con il codice di markup (quello che ho mostrato sopra) al costruttore (che è l'EA sullo stesso grafico) e il costruttore legge l'array e costruisce la GUI. Il codice del linguaggio di markup è un'istruzione per il costruttore. Esso esegue la costruzione (disegno, inizializzazione dei parametri degli elementi, impostazioni, ecc.


2. Il meccanismo è semplice. Dopo aver finito di modificare l'interfaccia, l'utente richiama il menu contestuale del costruttore facendo doppio clic sul grafico e seleziona l'opzione di salvataggio. Il costruttore stampa tutte le informazioni in due file. Questi file vengono utilizzati dal motore.

Mi spiego meglio: l'utente collega i due file ricevuti dal costruttore e dal motore (che fornirò) al suo EA (nell'intestazione dell'EA. Fornirò un esempio di collegamento). Quindi, scrive diverse chiamate nelle funzioni OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornirò un esempio). Successivamente, entra in un file stampato dal costruttore chiamato Internal_API. Questo file contiene tutto il necessario per collegare i controlli della GUI all'Expert Advisor/indicatore utente. Ovvero, le funzioni generate degli elementi e le istruzioni dettagliate. In seguito fornirò degli esempi di collegamento.

Anche in questo caso, nulla di complicato. C'è tutto. Ecco ad esempio come si presenta l'interfaccia di cui sopra:

1. Scrivere una finestra.


2. Seguire le istruzioni riportate di seguito:

3.

  • Trasferite i due file stampati dal costruttore nel vostro progetto.
  • Collegatevi al vostro Expert Advisor.
  • Scrivete le chiamate a diverse funzioni come mostrato nell'immagine.


4. Aprire il file InternalAPI e avviare la connessione. Il file contiene tutto.

//---------------------------------------------------------------------------------------------------------------------------+
//                                              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);
}
//========================================================================================================= 




L'utente deve solo scrivere le sue azioni nelle condizioni della funzione OnGuiEvent(). Il resto NON deve essere toccato. .


La commutazione dello stato dei controlli e l'ottenimento/impostazione dei loro valori avviene con l'aiuto di funzioni generate dal costruttore, che l'utente vedrà nell'intellisense.

 

Dal codice del file sopra riportato, l'utente lavora solo con questa parte:


 
Реter Konow #:

Nicholas, ciao!

Ti rispondo in ordine sparso:


1. L'utente NON interagirà (da quel che si legge in giro) con il mio codice. Non è necessario. Poi capirete perché. L'utente ha bisogno SOLO del linguaggio di markup. (L'ho già sottolineato diverse volte, ma ricevo sempre questa domanda ricorrente dai programmatori). ) Il motivo è che l'utente "inizializza" l'array solo utilizzando parole chiave del linguaggio che sono definite da define nel codice del costruttore. L'interprete (indicatore) invia un array con il codice di markup (quello che ho mostrato sopra) al costruttore (che è l'EA sullo stesso grafico) e il costruttore legge l'array e costruisce la GUI. Il codice del linguaggio di markup è un'istruzione per il costruttore. Esso esegue la costruzione (disegno, inizializzazione dei parametri degli elementi, impostazioni, ecc.


2. Il meccanismo è semplice. Dopo aver terminato la modifica dell'interfaccia, l'utente richiama il menu contestuale del costruttore facendo doppio clic sul grafico e seleziona l'opzione di salvataggio. Il costruttore stampa tutte le informazioni in due file. Questi file vengono utilizzati dal motore.

Mi spiego meglio: l'utente collega i due file ricevuti dal costruttore e dal motore (che fornirò) al suo EA (nell'intestazione dell'EA. Fornirò un esempio di collegamento). Quindi, scrive diverse chiamate nelle funzioni OnInit(), OnTimer(), OnChartEvent() e OnDeinit() (fornirò un esempio). Successivamente, entra in un file stampato dal costruttore chiamato Internal_API. Questo file contiene tutto il necessario per collegare i controlli della GUI all'Expert Advisor/indicatore utente. Ovvero, le funzioni generate degli elementi e le istruzioni dettagliate. In seguito fornirò degli esempi di connessione.

Anche in questo caso, nulla di complicato. C'è tutto. Ecco ad esempio come appare l'interfaccia di cui sopra:

1. Abbiamo scritto una finestra.


2. Seguire le istruzioni riportate di seguito:

3.

  • Trasferite i due file stampati dal costruttore nel vostro progetto.
  • Collegatelo al vostro Expert Advisor.
  • Scrivete le chiamate di diverse funzioni come mostrato nell'immagine.


4. aprire il file InternalAPI e avviare la connessione. Il file contiene tutto.




L'utente deve solo specificare le sue azioni nelle condizioni della funzione OnGuiEvent(). Il resto NON deve essere toccato.


La commutazione dello stato dei controlli e l'ottenimento/impostazione dei loro valori avviene con l'aiuto di funzioni generate dal costruttore, che l'utente vedrà nell'intellisense.

Peter, non ti capisco.

È importante che i programmatori sappiano come interagire con la GUI durante il lavoro. Ecco un esempio della mia GUI. Ho fatto clic sulla scorciatoia del tema chiaro/scuro e questo evento ha immediatamente attivato la funzione per cambiare i colori dello sfondo e le linee. Come si realizza questa interazione?





Cosa significa "L'utente NON interagirà (affatto) con il mio codice " ? Il programmatore deve interagire non con il codice, ma con gli eventi che dovrebbero generare questo codice. Dopo tutto, la GUI non è un programma indipendente. La GUI deve interagire con il programma principale dello sviluppatore. Che si tratti di un indicatore o di un EA.