MQLで書かれたUIのギャラリー - ページ 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.
 

簡単なコードの例:

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

一度始めたことは、最後までやり遂げなければならない。たとえ誰も必要としていなくても。それが原則だ。

それが原則だ。インターフェイスが描かれるだけでなく、使われるようになれば。私はそう願っている。

 
Edgar Akhmadeev #:

必要。インターフェイスが描かれるだけでなく、使われるようになれば。願わくば。

もちろんだ。それを目指しているんだ。

 
この無意味なスレッドは削除できるのか?ドイツのフォーラムでロシア語コードとは何事だ?それに、このスレッドには何の 付加価値もない
 
このメッセージを削除することは可能ですか?そして、ドイツのフォーラムを閉じますか?
 
ところで、ロシア語の名前を使うことの重大な欠点がある。非ロシア語圏のプログラマーの90%以上を一気に切り捨ててしまうのだ。結局のところ、彼らはいくつかの擬似ラベルを見ることになる。




この分岐を複数の言語で複製することは、もちろん非ロシア語話者にとって厳しい試練です。 前置きが長くなりましたが、いくつか質問してもいいですか? あなたのGUIはクラスを使わずに作成されているため、いくつかの不確定要素が一度に生じます。 結局のところ、製品としてのGUIにまず要求されるべきことは何でしょうか? それは、GUIを作成する際の利便性と直感性、そして作業の過程で便利に使用できることです。 この点について:


質問1



プログラマがGUIの一部でイベント処理を行うには、どのような仕組みがあるのでしょうか? 例えば、私のGUIでは、コントロールを 作成するときに、そのコントロールに変更イベントが発生したときに、ハンドラ関数へのポインタを追加します。 コード例です:

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



質問2



プログラマーはどのように特定のGUI要素の状態にアクセスできますか? 例えば、私のGUIではチェックボックス(bool)の状態を次のように取得できます。
if (menu1.check_boxes[ch.N].checked) {
  ....
}
else {
  ....
}


しかし、私はネストされたクラスを使っています。 どうやるのですか?

 
Nikolai Semko コントロールを 作成する際に、そのコントロールに変更イベントが発生したら、ハンドラ関数へのポインタを追加しています。 コード例です:



質問2





プログラマーはどのように特定のGUI要素の状態にアクセスできますか? 例えば、私のGUIではチェックボックス(bool)の状態を次のように取得できます:しかし、私はネストされたクラスを使っています。 どうやるのですか?

ニコラス

順番にお答えします:


1.ユーザーは私のコードと対話する必要はありません。 その必要はありません。 その理由は後でわかります。 ユーザーが必要なのはマークアップ言語だけです。.(このことは以前にも何度か強調したことがあるが、プログラマーからはいつも繰り返しこの質問を受ける。その理由は、ユーザーはコンストラクタ・コードのdefineで定義された言語キーワードを使って配列を「初期化」するだけだからです。インタープリター(インジケーター)は、マークアップ・コード(上で示したもの)を含む配列をコンストラクター(同じチャート上のEAです)に送り、コンストラクターは配列を読み取ってGUIを構築します。 マークアップ言語コードはコンストラクターに対する命令です。 コンストラクタはそれに従って構築(描画、要素パラメータの初期化、設定など)を行います。


2.仕組みは単純である。インターフェイスの編集が終わると、ユーザーは図表をダブルクリックしてコンストラクタのコンテキスト・メニューを呼び出し、保存オプションを選択します。コンストラクターはすべての情報を2つのファイルに出力する。これらのファイルはエンジンによって使用される。

詳しく説明しますと、ユーザーはコンストラクタとエンジン(私が提供します)から受け取った2つのファイルを自分のEAに接続します(EAのヘッダーに接続の例を示します)。次に、OnInit()、OnTimer()、OnChartEvent()、OnDeinit()の各関数で、いくつかのコールを記述します(例を示します)。次に、コンストラクタが出力する Internal_API というファイルに入る。このファイルには、GUIコントロールをExpert Advisor/ユーザー・インジケータに接続するために必要なものがすべて含まれています。つまり、要素の生成関数と詳細な指示です。後で接続例を示します。

繰り返しますが、複雑なことは何もありません。すべてが揃っています。例えば、上記のインターフェイスでどのように見えるかを示します:

1.ウィンドウを書く。


2.以下の指示に従う:

3.

  • コンストラクタが出力した2つのファイルをプロジェクトに転送する。
  • Expert Advisorに接続する。
  • 図のように、いくつかの関数を呼び出します。


4.InternalAPIファイルを開き、接続を開始します。ファイルにはすべてが含まれています。

//---------------------------------------------------------------------------------------------------------------------------+
//                                              PLEASE READ CAREFULLY                                                        |
//---------------------------------------------------------------------------------------------------------------------------+
//-------------------------------------TO GET OR SET VALUE FOR YOUR VARIABLE-------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//1. To initialize your variable with this value, type:            variable = ( type of your variable )value;                |
//2. To initialize your variable with some element's value, type:  variable = E_, then, choose element and add ();           |
//---------------------------------------------------------------------------------------------------------------------------+
//---------------------------------------TO GET OR SET VALUE OF THE ELEMENT--------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//3. To use value of some element, type:                           E_, then, choose element and add ();                      |
//4. To set new value to some element, type:                       E_, then, choose element and add ( type here new value ); |
//---------------------------------------------------------------------------------------------------------------------------+
//-------------------------------------------TO OPEN OR CLOSE A WINDOW-------------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//5. To open your window, type:                                    W_, then, choose window and add ();                       |
//6. To close your window, type:                                   W_, then, choose window and add (close);                  |
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE A COLOR PROPERTY OF THE ELEMENT----------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//7. To change main color of the element:                          Type E_,then, choose element and add (M_COLOR,your color);|
//8. To change text color of the element:                          Type E_,then, choose element and add (T_COLOR,your color);|
//9. To change frame color of the element:                         Type E_,then, choose element and add (F_COLOR,your color);|
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE READ ONLY PROPERTY OF THE TEXT BOX-------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//10.To change READ ONLY property of the text box:                 Type E_,then, choose element and add (ONLY_READ,0 or 1);  |
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE A STATE PROPERTY OF THE ELEMENT----------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//11.You can set 6 possible states of the element:        OFF, ON, LOCKED_OFF, LOCKED_ON, OFF_H, ON_H.                       |
//To set a new state of the element:                    Type E_,then, choose element and add (STATE,one of the states above);|
//---------------------------------------------------------------------------------------------------------------------------+
//***************************************************************************************************************************+
//NOTICE: THE COLOR WILL BE SET FOR THE CURRENT STATE OF THE ELEMENT. IF THE STATE CHANGES, THE COLOR WILL CHANGE.           |
//        IN EACH STATE THE ELEMENT CAN HAVE DIFFERENT MAIN, TEXT AND FRAME COLOR. MAKE SURE TO CONSIDER THE STATE           |
//        OF THE ELEMENT, WHEN YOU CHANGE IT'S MAIN, TEXT OR FRAME COLOR.                                                    | 
//---------------------------------------------------------------------------------------------------------------------------+
string DRIVE_MESSAGE_ADRESS = "\Experts\Advisors\MY_VS.1.0.ex5";
//---------------------------------------------------------------------------------------------------------------------------+
//---------------------------------------- 
#define _open                13
#define _close               14
//---------------------------------------- 
#define  on                   1
#define  off                  0
//---------------------------------------- 
#define  pressed              1
#define  released             0
//---------------------------------------- 
#define  checked              1
#define  unchecked            0
//---------------------------------------- 
#define  rare_value "~~`````~```~~~~~`~~~`~"
//---------------------------------------- 
int Params[10000];
//---------------------------------------- 
int par = 0;
//---------------------------------------- 
string i_MSG = NULL;
//---------------------------------------- 
uint Orders[];
//---------------------------------------- 
uint N = 0;
//---------------------------------------- 
#define  Descending  -1
//========================================================================================================= 
#define  CHECKBOX3___Some_checkbox_1               3
#define  D_LIST4___Some_list_1               4
//========================================================================================================= 
void On_Gui_Event(int Element, string value, double Magic = 0)
{
 string action = value, selected_option = value; //DON'T CHANGE THIS LINE
//------------------------------------
 switch(Element)
   {
//=====================================================================================================================
//WINDOW:   Demo window 1 | element: CHECKBOX  | name: Some checkbox 1  |  Location: Window's Main Frame
//=====================================================================================================================
case CHECKBOX3___Some_checkbox_1:
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:     break;
  
                case unchecked:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Demo window 1 | element: D_LIST  | name: Some list 1  |  Location: Window's Main Frame
//=====================================================================================================================
case D_LIST4___Some_list_1:
               //------------------------------------------------------------------------------------------------------
               //What to do when option selected?
               //------------------------------------------------------------------------------------------------------
               if(selected_option == "L_ITEM  1"){}
               if(selected_option == "L_ITEM  2"){}
               if(selected_option == "L_ITEM  3"){}
               if(selected_option == "L_ITEM  4"){}
               if(selected_option == "L_ITEM  5"){}
               if(selected_option == "L_ITEM  6"){}
               if(selected_option == "L_ITEM  7"){}
               if(selected_option == "L_ITEM  8"){}
               if(selected_option == "L_ITEM  9"){}
               if(selected_option == "L_ITEM  10"){}
               if(selected_option == "L_ITEM  11"){}
               if(selected_option == "L_ITEM  12"){}
               if(selected_option == "L_ITEM  13"){}
               if(selected_option == "L_ITEM  14"){}
               if(selected_option == "L_ITEM  15"){}
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
   }
}
//=================================================================================================================
//----------------------------------------------------------------------------------------------------------------
string E_Demo_window_1_Some_checkbox_1(string n = rare_value,  int Property = -1){return(GET_N_SET(3,n,Property));}
//----------------------------------------------------------------------------------------------------------------
string E_Demo_window_1_Some_list_1(string n = rare_value,  int Property = -1){return(GET_N_SET(4,n,Property));}
//----------------------------------------------------------------------------------------------------------------
string E__(string n = rare_value,  int Property = -1){return(GET_N_SET(5,n,Property));}
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
void W_Main_context_menu(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Set_Values_Change_Delay(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_GEN_Disconnected(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Caption_of_GEN_Disconnected(string Caption)
{
 i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "5" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Custom_Context_Menu(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Custom_Set_Values_Change_Delay(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Demo_window_1(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Caption_of_Demo_window_1(string Caption)
{
 i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "10" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
int C_Index(int Par){return((int)P_CORE[Par][_COLOMN_]*1000000 + (int)P_CORE[Par][_G_INDEX]);}
//----------------------------------------------------------------------------------------------------------------
//========================================================================================================= 
string GET_N_SET(int Element,  string n, int Property)
{
if(n != rare_value && Property == -1)
  {
   P_CORE[Element][_NEW_VALUE]  = n;
   P_CORE[Element][_LAST_VALUE] = P_CORE[Element][_CURRENT_VALUE];
   P_CORE[Element][_CURRENT_VALUE] = P_CORE[Element][_NEW_VALUE];
   if(n != P_CORE[Element][_LAST_VALUE])i_MSG += (string)_SYNC_P_CORE + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + P_CORE[Element][_CURRENT_VALUE] + "~";
   return(P_CORE[Element][_CURRENT_VALUE]);
  }
if(n == rare_value && Property == -1)return(P_CORE[Element][_CURRENT_VALUE]);
if((int)n > 12 && (int)n < 18 && Property > -1)
  {
   if(Property == OFF || Property == OFF_H || Property == LOCKED_OFF)On_Gui_Event(Element,(string)0);
   if(Property == ON  || Property == ON_H  || Property == LOCKED_ON) On_Gui_Event(Element,(string)1);
   if(n != P_CORE[Element][_LAST_VALUE])i_MSG += n + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + (string)Property + "~";
  }
return(NULL);
}
//========================================================================================================= 




ユーザーは、OnGuiEvent()関数の条件に自分の行動を書くだけでよい。 残りは触る必要は ない。


コントロールの状態を切り替えたり、値を取得/設定したりするには、コンストラクタで生成された関数を使用します。

 

上のファイルコードから、ユーザーはこの部分しか操作していない:


 
Реter Konow #:

ニコラス、こんにちは!

順番に答えるよ:


1.ユーザーは私のコードと対話する必要はない。 その必要はない。 次にその理由を説明しよう。 ユーザーが必要なのはマークアップ言語だけだ.(このことは以前にも何度か強調したことがあるが、プログラマーからはいつも繰り返しこの質問を受ける。その理由は、ユーザーはコンストラクタ・コードのdefineで定義された言語キーワードを使って配列を「初期化」するだけだからだ。インタープリター(インジケーター)は、マークアップ・コード(上で示したもの)を含む配列をコンストラクター(同じチャート上のEAです)に送り、コンストラクターは配列を読み取ってGUIを構築します。 マークアップ言語コードはコンストラクターに対する命令です。 コンストラクタはそれに従って構築(描画、要素パラメータの初期化、設定など)を行います。


2.仕組みは簡単です。インターフェイスの編集を終えた後、ユーザーは図表をダブルクリックしてコンストラクタのコンテキスト・メニューを呼び出し、保存オプションを選択します。コンストラクターはすべての情報を2つのファイルに出力する。これらのファイルはエンジンによって使用される。

詳しく説明しますと、ユーザーはコンストラクタとエンジン(私が提供します)から受け取った2つのファイルを自分のEAに接続します(EAのヘッダーに接続の例を示します)。次に、OnInit()、OnTimer()、OnChartEvent()、OnDeinit()の各関数で、いくつかのコールを記述します(例を示します)。次に、コンストラクタが出力する Internal_API というファイルに入る。このファイルには、GUIコントロールをExpert Advisor/ユーザー・インジケータに接続するために必要なものがすべて含まれています。つまり、要素の生成関数と詳細な指示です。後で接続例を示します。

繰り返しますが、複雑なことは何もありません。すべてが揃っています。例えば、上のインターフェイスでどのように見えるかを示します:

1.ウィンドウを書きました。


2.以下の指示に従ってください:

3.

  • コンストラクターが出力した2つのファイルをプロジェクトに転送する。
  • これを Expert Advisor に接続します。
  • 図のように、いくつかの関数を呼び出します。


4. InternalAPI ファイルを開き、接続を開始します。ファイルにはすべてが含まれています。




ユーザはOnGuiEvent()関数の条件で自分のアクションを指定するだけでよい。 残りは触る必要は ない。


コントロールの状態を切り替えたり、値を取得したり設定したりするには、コンストラクタで生成された関数を使用する。

ピーター、私はあなたを理解していない。

プログラマーにとって、作業中にGUIとどのようにインタラクションするかを知ることは重要です。 ここに私のGUIの例を示します。私は明暗テーマのショートカットをクリックし、このイベントはすぐに背景色と線を変更する機能をトリガーしました。このインタラクションはどのように行うのですか?





ユーザーは私のコードと(まったく)インタラクションしない」とはどういう意味 でしょ うか? プログラマーはコードとではなく、コードを生成するイベントとインタラクションする必要があります。 結局のところ、GUIは独立したプログラムではありません。GUIは最終的に開発者のメインプログラムと相互作用しなければなりません。それがインジケーターであれEAであれ。