Galerie d'interfaces utilisateur écrites en MQL - page 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.
 

Exemple de code simple :

//----------------------------------------------------------------------------------
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 #:

Tout ce qui est commencé doit être terminé. Même si personne n'en a besoin. C'est le principe.

Vous en avez besoin. Si l'interface peut être non seulement dessinée, mais utilisée. Je l'espère.

 
Edgar Akhmadeev #:

Besoin. Si l'interface peut non seulement être dessinée, mais aussi utilisée. Espérons-le.

Absolument. C'est ce sur quoi je travaille.

 
Peut-on supprimer ce fil de discussion inutile ? Qu'est-ce que c'est que ce code russe dans un forum allemand. De plus, il n'y a aucune valeur ajoutée derrière
 
Est-il possible de supprimer ce message ? Et fermer le forum allemand ?
 
Pyotr, voici d'ailleurs un grave inconvénient de l'utilisation de noms en russe. Cela exclut d'emblée plus de 90 % des programmeurs non russophones. Après tout, ils ne voient que des quasi-étiquettes.




La reproduction de cette branche dans plusieurs langues est une épreuve difficile, bien sûr, pour les non-russophones. Pour l'avenir, puis-je vous poser quelques questions ? Étant donné que votre interface graphique est créée sans utiliser de classes, plusieurs incertitudes surgissent en même temps. Après tout, quelles devraient être les exigences de l'interface graphique en tant que produit ? Il s'agit de la commodité et de l'intuitivité de la création d'une interface graphique, ainsi que de son utilisation pratique dans le processus de travail. À cet égard, voici les questions à poser :


Question 1



Quel mécanisme existe-t-il pour qu'un programmeur puisse gérer les événements dans le cadre de votre interface graphique ? Par exemple, dans mes interfaces graphiques, lors de la création d'uncontrôle, j'ajoute un pointeur vers une fonction de gestion lorsqu'un événement de changement se produit sur ce contrôle. Exemple de code :

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();
}



Question 2



Comment un programmeur peut-il accéder à l'état d'un élément particulier de l'interface graphique ? Par exemple, dans mon interface graphique, je peux obtenir l'état d'une case à cocher (bool) comme ceci : ... mais j'utilise des classes imbriquées.
if (menu1.check_boxes[ch.N].checked) {
  ....
}
else {
  ....
}


Mais j'utilise des classes imbriquées. Comment faites-vous ?

 
Nikolai Semko contrôle, j'ajoute un pointeur vers une fonction de gestion lorsqu'un événement de changement se produit sur ce contrôle. Exemple de code :



Question 2





Comment un programmeur peut-il accéder à l'état d'un élément particulier de l'interface graphique ? Par exemple, dans mon interface graphique, je peux obtenir l'état d'une case à cocher (bool) comme suit : mais j'utilise des classes imbriquées. Comment procédez-vous ?

Nicholas Bonjour !

Je vais répondre dans l'ordre :


1. L'utilisateur n'interagit PAS (du tout) avec mon code. Ce n'est pas nécessaire. Vous comprendrez plus loin pourquoi. L'utilisateur n'a besoin QUE du langage de balisage. (J'ai déjà insisté sur ce point à plusieurs reprises, mais les programmeurs me posent toujours cette question récurrente. ) La raison en est que l'utilisateur "initialise" le tableau uniquement à l'aide de mots-clés du langage qui sont définis par des "defines" dans le code du constructeur. L'interprète (l'indicateur) envoie un tableau avec le code de balisage (celui que j'ai montré ci-dessus) au constructeur (qui est l'EA sur le même graphique) et le constructeur lit le tableau et construit l'interface graphique. Le code du langage de balisage est une instruction pour le constructeur. Il exécute la construction (dessin, initialisation des paramètres des éléments, réglages, etc.


2. Le mécanisme est simple. Après avoir fini d'éditer l'interface, l'utilisateur appelle le menu contextuel du constructeur en double-cliquant sur le graphique et sélectionne l'option de sauvegarde. Le constructeur imprime toutes les informations dans deux fichiers. Ces fichiers sont utilisés par le moteur.

Laissez-moi vous expliquer en détail : l'utilisateur connecte les deux fichiers reçus du constructeur et du moteur (que je fournirai) à son EA (dans l'en-tête de l'EA. Je fournirai un exemple de connexion). Ensuite, il écrit plusieurs appels dans les fonctions OnInit(), OnTimer(), OnChartEvent() et OnDeinit() (je fournirai un exemple). Ensuite, va dans un fichier imprimé par le constructeur appelé Internal_API. Ce fichier contient tout ce qui est nécessaire pour connecter les contrôles de l'interface graphique à l'indicateur Expert Advisor/utilisateur. Il s'agit des fonctions générées par les éléments et des instructions détaillées. Je fournirai des exemples de connexion plus tard.

Encore une fois, rien de compliqué. Tout est là. Voici par exemple à quoi cela ressemble avec l'interface ci-dessus :

1. Écriture d'une fenêtre.


2. Suivre les instructions ci-dessous :

3.

  • Transférez les deux fichiers imprimés par le constructeur dans votre projet.
  • Connectez-vous à votre Expert Advisor.
  • Ecrivez les appels de plusieurs fonctions comme indiqué dans l'image.


4. ouvrez le fichier InternalAPI et démarrez la connexion. Le fichier contient tout.

//---------------------------------------------------------------------------------------------------------------------------+
//                                              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'utilisateur n'a qu'à écrire ses actions dans les conditions de la fonction OnGuiEvent(). Le reste n'a pas besoin d'être touché.


La commutation de l'état des contrôles, ainsi que l'obtention/le réglage de leurs valeurs se font à l'aide de fonctions générées par le constructeur, que l'utilisateur verra dans l'intellisense.

 

D'après le code du fichier ci-dessus, l'utilisateur ne travaille qu'avec cette partie :


 
Реter Konow #:

Nicholas, bonjour !

Je répondrai dans l'ordre :


1. L'utilisateur n'interagira PAS (du tout) avec mon code. Ce n'est pas nécessaire. Vous comprendrez ensuite pourquoi. L'utilisateur n'a besoin QUE du langage de balisage. (J'ai déjà insisté sur ce point à plusieurs reprises, mais les programmeurs me posent toujours cette question récurrente. ) La raison en est que l'utilisateur "initialise" le tableau uniquement à l'aide de mots-clés du langage qui sont définis par des "defines" dans le code du constructeur. L'interprète (l'indicateur) envoie un tableau avec le code de balisage (celui que j'ai montré ci-dessus) au constructeur (qui est l'EA sur le même graphique) et le constructeur lit le tableau et construit l'interface graphique. Le code du langage de balisage est une instruction pour le constructeur. Il exécute la construction (dessin, initialisation des paramètres des éléments, réglages, etc.


2. Le mécanisme est simple. Après avoir terminé l'édition de l'interface, l'utilisateur appelle le menu contextuel du constructeur en double-cliquant sur la carte et sélectionne l'option de sauvegarde. Le constructeur imprime toutes les informations dans deux fichiers. Ces fichiers sont utilisés par le moteur.

Laissez-moi vous expliquer en détail : l'utilisateur connecte les deux fichiers reçus du constructeur et du moteur (que je fournirai) à son EA (dans l'en-tête de l'EA. Je fournirai un exemple de connexion). Ensuite, il écrit plusieurs appels dans les fonctions OnInit(), OnTimer(), OnChartEvent() et OnDeinit() (je fournirai un exemple). Ensuite, va dans un fichier imprimé par le constructeur appelé Internal_API. Ce fichier contient tout ce qui est nécessaire pour connecter les contrôles de l'interface graphique à l'indicateur Expert Advisor/utilisateur. Il s'agit des fonctions générées par les éléments et des instructions détaillées. Je fournirai des exemples de connexion plus tard.

Encore une fois, rien de compliqué. Tout est là. Voici par exemple à quoi cela ressemble avec l'interface ci-dessus :

1. Nous avons écrit une fenêtre.


2. Nous avons suivi les instructions ci-dessous :

3.

  • Transférez les deux fichiers imprimés par le constructeur dans votre projet.
  • Connectez-le à votre Expert Advisor.
  • Écrivez les appels de plusieurs fonctions comme indiqué dans l'image.


4. Ouvrez le fichier InternalAPI et démarrez la connexion. Le fichier contient tout.




L'utilisateur doit seulement spécifier ses actions dans les conditions de la fonction OnGuiEvent(). Le reste n'a pas besoin d'être touché .


La commutation de l'état des contrôles et l'obtention/le réglage de leurs valeurs se font à l'aide de fonctions générées par le constructeur, que l'utilisateur verra dans l'intellisense.

Peter, je ne vous comprends pas.

Vous n'avez pas répondu aux questions. Il est important que les programmeurs sachent comment interagir avec votre interface graphique lorsqu'ils travaillent. Voici un exemple de mon interface graphique. J'ai cliqué sur le raccourci du thème clair/foncé et cet événement a immédiatement déclenché la fonction permettant de modifier les couleurs et les lignes d'arrière-plan. Comment réaliser cette interaction ?





Que signifie "L'utilisateur n'interagira PAS (du tout) avec mon code " ? Le programmeur doit interagir, non pas avec le code, mais avec les événements qui devraient générer ce code. Après tout, l'interface graphique n'est pas un programme indépendant séparé. L'interface graphique doit en fin de compte interagir avec le programme principal du développeur. Qu'il s'agisse d'un indicateur ou d'un EA.