Galerie der in MQL geschriebenen UIs - Seite 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.
 

Beispiel für einen einfachen Code:

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

Alles, was einmal begonnen wurde, muss zu Ende gebracht werden. Auch wenn es niemand braucht. Das ist der Grundsatz.

Sie brauchen es. Wenn die Schnittstelle nicht nur gezeichnet, sondern auch benutzt werden kann. Ich hoffe es.

 
Edgar Akhmadeev #:

Bedarf. Wenn die Schnittstelle nicht nur gezeichnet, sondern auch benutzt werden kann. Hoffentlich.

Auf jeden Fall. Das ist es, woran ich arbeite.

 
Ist es möglich, diese Nachricht zu löschen? Und das deutsche Forum schließen?
 
Hallo Pjotr, hier liegt übrigens ein schwerwiegender Nachteil der Verwendung von Namen auf Russisch. Mehr als 90 % der nicht russischsprachigen Programmierer werden dadurch sofort abgeschnitten. Immerhin sehen sie einige Quasi-Etiketten.




Diesen Zweig in mehreren Sprachen zu duplizieren, ist natürlich eine harte Prüfung für Nicht-Russisch-Sprecher. Darf ich Ihnen ein paar Fragen stellen? Da Ihre GUI ohne die Verwendung von Klassen erstellt wird, ergeben sich gleich mehrere Unklarheiten. Denn was sollten die ersten Anforderungen an die GUI als Produkt sein? Es ist die Bequemlichkeit und Intuitivität der Erstellung einer GUI, sowie ihre bequeme Verwendung im Arbeitsprozess. In dieser Hinsicht:


Frage 1



Welchen Mechanismus gibt es für einen Programmierer, um die Ereignisbehandlung auf der Seite Ihrer GUI zu handhaben? In meinen GUIs füge ich zum Beispiel beim Erstellen einesSteuerelements einen Zeiger auf eine Handler-Funktion hinzu, wenn ein Änderungsereignis auf diesem Steuerelement auftritt. Beispielcode:

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



Frage 2



Wie kann ein Programmierer auf den Zustand eines bestimmten GUI-Elements zugreifen? In meiner GUI kann ich zum Beispiel den Zustand eines Kontrollkästchens (bool) wie folgt abrufen: .
if (menu1.check_boxes[ch.N].checked) {
  ....
}
else {
  ....
}


aber ich verwende verschachtelte Klassen. Wie machen Sie das?

 
Nikolai Semko Steuerelements einen Zeiger auf eine Handler-Funktion hinzu, wenn ein Änderungsereignis auf diesem Steuerelement auftritt. Beispielcode:



Frage 2





Wie kann ein Programmierer auf den Zustand eines bestimmten GUI-Elements zugreifen? In meiner GUI kann ich z. B. den Zustand eines Kontrollkästchens (bool) wie folgt abrufen: aber ich verwende verschachtelte Klassen. Wie machen Sie das?

Hallo Nicholas!

Ich werde der Reihe nach antworten:


1. Der Benutzer interagiert NICHT (vom Wort her überhaupt nicht) mit meinem Code. Es ist nicht notwendig. Weiter werden Sie verstehen, warum. Der Benutzer braucht NUR die Auszeichnungssprache. (Ich habe dies schon mehrmals betont, aber ich bekomme diese Frage immer wieder von Programmierern gestellt. ) Der Grund dafür ist, dass der Benutzer das Array nur mit Schlüsselwörtern "initialisiert", die durch Defines im Konstruktorcode definiert sind. Der Interpreter (Indikator) sendet ein Array mit dem Markup-Code (den ich oben gezeigt habe) an den Konstruktor (der der EA auf demselben Diagramm ist), und der Konstruktor liest das Array und baut die grafische Benutzeroberfläche auf. Der Markup-Sprachcode ist eine Anweisung für den Konstruktor. Er führt die Konstruktion (Zeichnen, Initialisierung der Elementparameter, Einstellungen usw.) entsprechend dieser Anweisung durch.


2. Der Mechanismus ist einfach. Nach Beendigung der Bearbeitung der Schnittstelle ruft der Benutzer durch Doppelklick auf das Diagramm das Kontextmenü des Konstruktors auf und wählt die Option "Speichern". Der Konstruktor gibt alle Informationen in zwei Dateien aus. Diese Dateien werden von der Engine verwendet.

Lassen Sie mich das im Detail erklären: Der Benutzer verbindet die beiden Dateien, die er vom Konstruktor und der Engine (die ich zur Verfügung stellen werde) erhält, mit seinem EA (in der Kopfzeile des EA. Ich werde ein Beispiel für die Verbindung liefern). Dann schreibt er mehrere Aufrufe in den Funktionen OnInit(), OnTimer(), OnChartEvent() und OnDeinit() (ich werde ein Beispiel liefern). Als nächstes wird eine Datei namens Internal_API vom Konstruktor gedruckt. Diese Datei enthält alles, was notwendig ist, um GUI-Steuerelemente mit dem Expert Advisor/Benutzerindikator zu verbinden. Das heißt - generierte Funktionen der Elemente und detaillierte Anweisungen. Ich werde später Beispiele für die Verbindung liefern.

Nochmals, nichts Kompliziertes. Es ist alles vorhanden. Hier ist zum Beispiel, wie es mit der obigen Schnittstelle aussieht:

1. Schrieb ein Fenster.


2. Befolge die unten stehenden Anweisungen:

3.

  • Übertragen Sie die beiden vom Konstruktor gedruckten Dateien in Ihr Projekt.
  • Verbinden Sie sich mit Ihrem Expert Advisor.
  • Schreiben Sie mehrere Funktionsaufrufe wie in der Abbildung gezeigt.


4. öffnen Sie die InternalAPI-Datei und starten Sie die Verbindung. Die Datei enthält alles.

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




DerBenutzer muss nur seine Aktionen in die Bedingungen der OnGuiEvent()-Funktion schreiben. Der Rest muss NICHT angefasst werden. .


Das Umschalten des Zustands von Steuerelementen sowie das Erhalten/Einstellen ihrer Werte erfolgt mit Hilfe von Funktionen, die vom Konstruktor generiert werden und die der Benutzer in der Intellisense sehen kann.

 

Aus dem obigen Dateicode geht hervor, dass der Benutzer nur mit diesem Teil arbeitet:


 
Реter Konow #:

Nicholas, hallo!

Ich werde der Reihe nach antworten:


1. Der Benutzer wird NICHT (vom Wort her überhaupt nicht) mit meinem Code interagieren. Das ist nicht notwendig. Als nächstes werden Sie verstehen, warum. Der Benutzer braucht NUR die Auszeichnungssprache. (Ich habe dies schon mehrmals betont, aber ich bekomme diese Frage immer wieder von Programmierern gestellt. ) Der Grund dafür ist, dass der Benutzer das Array nur mit Schlüsselwörtern "initialisiert", die durch Defines im Konstruktorcode definiert sind. Der Interpreter (Indikator) sendet ein Array mit dem Markup-Code (den ich oben gezeigt habe) an den Konstruktor (der der EA im selben Diagramm ist), und der Konstruktor liest das Array und baut die grafische Benutzeroberfläche auf. Der Markup-Sprachcode ist eine Anweisung für den Konstruktor. Er führt die Konstruktion (Zeichnen, Initialisierung der Elementparameter, Einstellungen usw.) entsprechend durch.


2. Der Mechanismus ist einfach. Nach Beendigung der Schnittstellenbearbeitung ruft der Benutzer durch Doppelklick auf das Diagramm das Kontextmenü des Konstruktors auf und wählt die Option Speichern. Der Konstruktor gibt alle Informationen in zwei Dateien aus. Diese Dateien werden von der Engine verwendet.

Lassen Sie mich das im Detail erklären: Der Benutzer verbindet die beiden Dateien, die er vom Konstruktor und der Engine (die ich zur Verfügung stellen werde) erhält, mit seinem EA (in der Kopfzeile des EA. Ich werde ein Beispiel für die Verbindung liefern). Dann schreibt er mehrere Aufrufe in den Funktionen OnInit(), OnTimer(), OnChartEvent() und OnDeinit() (ich werde ein Beispiel liefern). Als nächstes wird eine Datei namens Internal_API vom Konstruktor gedruckt. Diese Datei enthält alles, was notwendig ist, um GUI-Steuerelemente mit dem Expert Advisor/Benutzerindikator zu verbinden. Das heißt - generierte Funktionen der Elemente und detaillierte Anweisungen. Ich werde später Beispiele für die Verbindung liefern.

Nochmals, nichts Kompliziertes. Es ist alles vorhanden. Hier ist zum Beispiel, wie es mit der Schnittstelle oben aussieht:

1. Wir haben ein Fenster geschrieben.


2. Befolgen Sie die unten stehenden Anweisungen:

3.

  • Übertragen Sie die beiden vom Konstruktor gedruckten Dateien in Ihr Projekt.
  • Verbinden Sie es mit Ihrem Expert Advisor.
  • Schreiben Sie mehrere Funktionsaufrufe wie in der Abbildung gezeigt.


4. Öffnen Sie die InternalAPI-Datei und starten Sie die Verbindung. Die Datei enthält alles.




DerBenutzer muss nur seine Aktionen in den Bedingungen der OnGuiEvent()-Funktion angeben. Der Rest muss NICHT angefasst werden.


Das Umschalten des Zustands der Steuerelemente und das Abrufen/Einstellen ihrer Werte erfolgt mit Hilfe von Funktionen, die vom Konstruktor generiert werden und die der Benutzer in der Intellisense sehen kann.

Peter, ich verstehe dich nicht.

Du hast die Fragen nicht beantwortet. Es ist wichtig für Programmierer zu wissen, wie man mit der GUI während der Arbeit interagiert. Hier ist ein Beispiel für meine GUI. Ich habe auf die Tastenkombination für das helle/dunkle Thema geklickt, und dieses Ereignis hat sofort die Funktion zum Ändern der Hintergrundfarben und der Linien ausgelöst. Wie machen Sie diese Interaktion?





Was bedeutet "Der Benutzer interagiert NICHT (überhaupt) mit meinem Code " ? Der Programmierer muss nicht mit dem Code interagieren, sondern mit den Ereignissen, die diesen Code erzeugen sollen. Schließlich ist die GUI kein eigenständiges, unabhängiges Programm. Die GUI muss letztlich mit dem Hauptprogramm des Entwicklers interagieren. Ob es sich nun um einen Indikator oder einen EA handelt.

 
Nikolai Semko #:

Pjotr, ich verstehe dich nicht.

Sie haben die Fragen nicht beantwortet. Für Programmierer ist es wichtig zu wissen, wie sie während der Arbeit mit ihrer GUI interagieren können. Hier ist ein Beispiel für meine GUI. Ich habe auf die Tastenkombination für das helle/dunkle Thema geklickt, und dieses Ereignis hat sofort die Funktion zum Ändern der Hintergrundfarben und der Linien ausgelöst. Wie machen Sie diese Interaktion?



Was bedeutet "Der Benutzer interagiert NICHT (überhaupt nicht) mit meinem Code " ? Der Programmierer muss nicht mit dem Code interagieren, sondern mit den Ereignissen, die der Code erzeugen soll.

Das ist gut. Ich werde versuchen, zur Verdeutlichung nur Bilder zu verwenden.

1.





2.


3.


4.

Unser Optionsblatt und das Kontrollkästchen im Fenster und die Internal_API-Datei:




5. Ausführen von Aktionen auf dem Fenster und Elementen im Benutzercode:




6.


INTELLISENSE SAGT UNS ALLES!!!