Галерея UI написанных на MQL - страница 65

 

12. Программное получение/установка границ значений слайдера и поля с кнопками (_V_MIN, _V_MAX, _V_STEP, _DIGITS).

1. Откроем окно с элементами обладающими вышеперечислеными параметрами:

int _OnInit()
  {
   //------------------------------------------------
   //Open the window "Settings example 1".
   //------------------------------------------------
   w_6_Settings_example_1();
   //------------------------------------------------


2. Пропишем получение значений _V_MIN, _V_MAX, _V_STEP, _DIGITS и выведем их в журнал:

   //------------------------------------------------
   //Get parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   int Min_value = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_MIN);
   int Max_value = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_MAX);
   int Step      = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_STEP);
   int digits    = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_DIGITS);
   //------------------------------------------------
   //Print the results:
   //------------------------------------------------
   Print("Min_value:  ",Min_value,"  Max_value:  ",Max_value,"  Step:  ",Step,"  digits:  ",digits);
   //------------------------------------------------

Результат: значения свойств параметра слайдера выведены в журнал.


//---------------------------------------------------------------------------------------------------------------------------------------


3. Повторим операцию с полем с кнопками. В отличии от слайдера, полю установлены другие границы чисел, а также тип его значения double.

   //------------------------------------------------
   //Get parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   double _Min_value  =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_MIN);
   double _Max_value  =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_MAX);
   double _Step       =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_STEP);
   double _digits     =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_DIGITS);
   //------------------------------------------------
   Print("Min_value:  ",_Min_value,"  Max_value:  ",_Max_value,"  Step:  ",_Step,"  digits:  ",_digits);
   //------------------------------------------------ 

Результат: значения свойств параметра поля с кнопками выведены в журнал.


//---------------------------------------------------------------------------------------------------------------------------------------


4. Установим другие границы диапазона слайдера (тестируется впервые, результат неизвестен).

   //------------------------------------------------
   //Set parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP.
   //------------------------------------------------
   Min_value = -100;
   Max_value = 100;
   Step      = 1;
   //-----------------
   w6_i_p3_H_SLIDER_Roll_the_value(Min_value, p3_V_MIN);
   w6_i_p3_H_SLIDER_Roll_the_value(Max_value, p3_V_MAX);
   w6_i_p3_H_SLIDER_Roll_the_value(Step,      p3_V_STEP);
   //------------------------------------------------

 Результат: *найдена проблема с диапазоном в отрицательных числах (исправление в след.версии).




Проверим с границами в положительных числах:

   //------------------------------------------------
   //Set parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP.
   //------------------------------------------------
   Min_value = 0;
   Max_value = 1000;
   Step      = 1;
   //-----------------
   w6_i_p3_H_SLIDER_Roll_the_value(Min_value, p3_V_MIN);
   w6_i_p3_H_SLIDER_Roll_the_value(Max_value, p3_V_MAX);
   w6_i_p3_H_SLIDER_Roll_the_value(Step,      p3_V_STEP);
   //------------------------------------------------


Результат: границы диапазона успешно изменены.


Главное: диапазон слайдера можно менять с помощью его функции.

**Важно: Нельзя ретроактивно менять тип значения параметра с int на double или наоборот.

//-------------------------------------------------------------------------------------------------


Проведем похожий опыт с полем ввода:

   //------------------------------------------------
   //Set NEW parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   double _Min_value  = -100.0;
   double _Max_value  =  100.0;
   double _Step       =  2.5;
   //-----------------
   //Set another default value---
   w6_d_p5_S_EDIT_Spin_the_value(50.5);
   //-----------------
   w6_d_p5_S_EDIT_Spin_the_value(_Min_value,p5_V_MIN);
   w6_d_p5_S_EDIT_Spin_the_value(_Max_value,p5_V_MAX);
   w6_d_p5_S_EDIT_Spin_the_value(_Step     ,p5_V_STEP);
   //------------------------------------------------

Результат: Работает как задумано. Поле с кнопками принимает заданный диапазон и шаг. При выходе за границы сообщает об ошибке в журнал.

//--------------------------------------------------------------------------------------------------


5. Напоследок, установим значение_DIGITS полю с кнопками (у слайдера не получится, так как тип его параметра int):

  • Установим значение шага с четыремя знаками после точки.
  • Переменной digits равно 4 (четыре знака после запятой).

       //------------------------------------------------
       //Set parameter properties, such as: 
       //_V_MIN, _V_MAX, _V_STEP, _DIGITS
       //------------------------------------------------
       double _Min_value  = -100.0;
       double _Max_value  =  100.0;
       double _Step       =  2.5567;
              digits      =  4;
       //-----------------
       //Set another default value---
       w6_d_p5_S_EDIT_Spin_the_value(50.5);
       //-----------------
       w6_d_p5_S_EDIT_Spin_the_value(_Min_value,p5_V_MIN);
       w6_d_p5_S_EDIT_Spin_the_value(_Max_value,p5_V_MAX);
       w6_d_p5_S_EDIT_Spin_the_value(_Step     ,p5_V_STEP);
     
       //Set the new number of digits:
       w6_d_p5_S_EDIT_Spin_the_value(digits    ,p5_DIGITS);
       //------------------------------------------------


    Результат:

    • Сначала имелось три цифры после запятой (исходное количество до программного изменения).


    • Затем, программный вызов увеличил точность до 4-ех знаков:


    • Далее, до 7-ми:
    //Setting 7 digits after the decimal point:
    
    w6_d_p5_S_EDIT_Spin_the_value(7,p5_DIGITS);



    Итоги:

    • Доступна возможность программно переустанавливать исходные границы диапазона чисел поля с кнопками, а также слайдера.
    • Есть возможность программно менять исходную точность значения double, задавая другое количество знаков после запятой.
    • У слайдера обнаружена проблема с вычислением значений в границах отрицательных чисел (будет исправлено).
    • Исходный тип параметра элемента нельзя переустановить

    На этом, данная тема завершена.

    Графические интерфейсы VI: Элементы "Слайдер" и "Двухсторонний слайдер" (Глава 2)
    Графические интерфейсы VI: Элементы "Слайдер" и "Двухсторонний слайдер" (Глава 2)
    • www.mql5.com
    В предыдущей статье разрабатываемая библиотека была пополнена сразу четырьмя довольно часто используемыми в графических интерфейсах элементами управления: «чекбокс», «поле ввода», «поле ввода с чекбоксом» и «комбобокс с чекбоксом». Вторая глава шестой части серии будет посвящена таким элементам управления, как слайдер и двухсторонний слайдер.
     

    13. Запрос состояния элементов _GET_STATE.

    Часто возникают ситуации когда необходимо программно получить состояние того или иного элемента интерфейса. Для решения этой задачи создан идентификатор _GET_STATE

    //--------------------------------------------------------------------------------------------------------------------

    *Важно: На запрос_GET_STATE, функция возвращает индекс текущего состояния элемента.

    //--------------------------------------------------------------------------------------------------------------------

    Ниже на картинке показан список состояний элементов.

    1. Идентификаторы состояний:

    (*в следующем релизе, префикс v_ будет заменен на префикс s_)


    Индексы выводимые в журнал:

      v_NEUTRAL_STATE           15
      //-----------------------------
      v_ACTIVATED_STATE         62
      //-----------------------------
      v_NEUTRAL_BLOCKED         64
      //-----------------------------
      v_ACTIVATED_BLOCKED       65   
      //----------------------------- 
      v_NEUTRAL_HIGHLIGHTED     66  
      //-----------------------------
      v_ACTIVATED_HIGHLIGHTED   67


    Протестируем запрос и получение состояний элементов:

    1. Откроем окно и получим исходное состояние кнопки "Start":


    int _OnInit()
      {
       //------------------------------------------------
       //Open the window "Settings example 1".
       //------------------------------------------------
       w_6_Settings_example_1();
       //------------------------------------------------
       //Get state of button "Start":
       //------------------------------------------------
       int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
       //------------------------------------------------
       //Print out:
       //------------------------------------------------
       Print("Button state:  ",Button_state);
       //------------------------------------------------


    Результат: получено значение 15, соответствующее состоянию v_NEUTRAL_STATE.



    2. Выведем в журнал состояния кнопки на нажатии и отжатии:

    Для этого:

    • Найдем кнопку в файле API.
    • Пропишем запрос _GET_STATE обоих кейсах -  pressed и released
    case Settings_example_1___Start:
    
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the button is pressed or released?
                   //------------------------------------------------------------------------------------------------------
                   switch((int)action)
                   {
                    //------------------------------------------------------------------------
                    case pressed: 
                                   {
                                    //Get button's state when it pressed:
                                    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Button state:  ",Button_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case released: 
                                   {
                                    //Get button's state when it released:
                                    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Button state:  ",Button_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                   }
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    


    Результат: на событии нажатия/отжатия в журнал печатается индекс текущего состояния.

    Напомню:

    15 = v_NEUTRAL_STATE
    
    62 = v_ACTIVATED_STATE

    //----------------------------------------------------------------------------------------------------------------


    3. Повторим запрос с чекбоксом.



    1. Получим состояние чекбокса на событии открытия окна:

       //------------------------------------------------
       //Open the window "Settings example 1".
       //------------------------------------------------
       w_6_Settings_example_1();
       //------------------------------------------------
       
       //Get the state of the checkbox when it checked:
       int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
       
       //Print out the result:
       Print("Checkbox state:  ",Checkbox_state);
       //------------------------------------------------

    Результат: получено значение 15, соответствующее нейтральному состоянию v_NEUTRAL_STATE (в котором чекбокс и находится).




    2. Далее, запросим состояния чекбокса на событии нажатия и отжатия.

    Для этого:

    • Найдем чекбокс "Set an option" в файле API.
    • Пропишем запрос _GET_STATE обоих кейсах - checked и unchecked
    case Settings_example_1___Set_an_option:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the checkbox is checked or unchecked? 
                   //------------------------------------------------------------------------------------------------------
                    case checked: 
                                   {
                                    //Get checkbox state when it checked:
                                    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Checkbox state:  ",Checkbox_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case unchecked: 
                                   {
                                    //Get checkbox state when it unchecked:
                                    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Checkbox state:  ",Checkbox_state);
                                   }
                    break;
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;


    Результат: получены значения 66 (v_NEUTRAL_HIGHLIGHTED) и 67 (v_ACTIVATED_HIGHLIGHTED), что означает подсвеченное нейтральное и подсвеченное нажатое состояние.

    //-----------------------------------------------------------------------------------------------

    На этом, первая часть темы завершена.

    Во второй части, вернем состояния выпадающего списка D_LIST, слайдера H_SLIDER, и полей ввода S_EDIT и EDIT.

     

    13. Запрос состояния _GET_STATE.  

    Часть 2: Получение состояний элементов D_LIST, H_SLIDER, EDIT, S_EDIT.

    В прошлой части мы рассмотрели программный возврат состояний кнопки BUTTON и чекбокса CHECKBOX. Использовался запрос _GET_STATE и был показан список названий состояний возвращаемых функциями. Всего шесть названий, где каждое начинается префиксом v_. (Сокращение от value, которое далее будет заменено на s_ - сокращение от state).

    Напомню индексы состояний:

      v_NEUTRAL_STATE           15
      //-----------------------------
      v_ACTIVATED_STATE         62
      //-----------------------------
      v_NEUTRAL_BLOCKED         64
      //-----------------------------
      v_ACTIVATED_BLOCKED       65   
      //----------------------------- 
      v_NEUTRAL_HIGHLIGHTED     66  
      //-----------------------------
      v_ACTIVATED_HIGHLIGHTED   67

    В данном случае, конкретные числа индексов не важны. Когда пользователю необходимо вписать то или иное состояние в условие, он использует идентификатор

    Пример 1:

    //Getting state of the first element:
    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
    
    //Getting state of the second element:
    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
    
    
    //Setting conditions for both elements when they're simultaneously ON:
    if(Button_state == v_ACTIVATED_STATE)
      { 
       //Is the checkbox was already on:
        if(Checkbox_state == v_ACTIVATED_STATE)
          {
           Function_1();
          }
        //If the checkbox was the last pressed element and still highlighted:
        if(Checkbox_state == v_ACTIVATED_HIGHLIGHTED)
          {
           Function_2();
          }
      }


    Пример 2:

    //Getting state of the first element:
    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
    
    //Getting state of the second element:
    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
    
    
    //Setting conditions for one element being ON, while the other is OFF:
    if(Button_state == v_ACTIVATED_STATE)
      { 
       //If the checkbox was already off:
        if(Checkbox_state == v_NEUTRAL_STATE)
          {
           Function_A();
          }
        //If the checkbox was just turned off and still highlighted:
        if(Checkbox_state == v_NEUTRAL_HIGHLIGHTED)
          {
           Function_B();
          }
      }

    //-----------------------------------------------------------------------------------------------------------------

    *Очень важно:

    Поясню существенную разницу между состояниями v_NEUTRAL_STATE и v_NEUTRAL_HIGHLIGHTED, а также между  v_ACTIVATED_STATE и v_ACTIVATED_HIGHLIGHTED:

    v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время.
    
    v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED. 

    тоже самое касается активированного состояния:

    v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время.
    
    v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED. 

    Эта разница имеет большое значение.

    На данный момент, кнопка и некоторые другие элементы, возвращают только  v_NEUTRAL_STATE  и  v_ACTIVATED_STATE, и не возвращают состояния HIGHLIGHTED, как чекбокс. Это означает, что пользователь не может знать, были ли элементы нажаты/отжаты только что, или когда то, неопределенное время назад. Однако, пользователь может поймать момент их нажатия в файле API. Да, но в остальных частях программы эта возможность пока недоступна. В следующей версии, возврат состояния  HIGHLIGHTED будет добавлен всем интерактивным элементам. Таким образом, из любой точки программы пользователь сможет узнать, был ли элемент нажат/отжат только что, или давно находится в своем состоянии.

    //----------------------------------------------------------------------------------------------------------


    Перейдем к практической части:

    • Откроем два окна с элементами D_LIST, H_SLIDER, EDIT и S_EDIT.
    • Вернем состояния элементов сразу после открытия.

    1. Откроем окна:

    int _OnInit()
      {
       //------------------------------------------------
       //Open the windows "Settings example 1" and "Settings example 2".
       //------------------------------------------------
       w_6_Settings_example_1();
       w_7_Settings_example_2();
       //------------------------------------------------


    2. Получим состояния элементов:

       //------------------------------------------------
       //Get the states of the elements S_EDIT, H_SLIDER, EDIT and D_LIST
       //------------------------------------------------
       //1. State index is type int, S_EDIT's function is double. Convert the types.
       int S_edit_state   = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_GET_STATE); 
       
       //2. Getting the slider's state. 
       int H_slider_state =      w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
       
       //3.State index is type int, EDIT's function is string. Convert the types. 
       int Edit_state     = (int)w7_s_p4_EDIT_Comment_3(get_s,p4_GET_STATE);
       
       //State index is type int, D_LIST's function is string. Convert the types.
       int D_list_state   = (int)w7_s_p6_D_LIST_D_LIST_1(get_s,p6_GET_STATE);
       //------------------------------------------------
       
       //Print out the results:
       Print("S_edit_state   = ",S_edit_state);
       Print("H_slider_state = ",H_slider_state);
       Print("Edit_state     = ",Edit_state);
       Print("D_list_state   = ",D_list_state);
       //------------------------------------------------


    Результат: у всех элементов кноме D_LIST индекс состояния 15 (нейтральное состояние v_NEUTRAL_STATE). У D_LIST возвращена ошибка (-1). 


    Причина: не прописан возврат состояний данного элемента в центральной функции. Техническая недоработка. В следующей версии будет исправлено.

    В связи с тем, что функция D_LIST пока не возвращает индекс состояния, сосредоточимся на трех элементах, состояния которых были успешно получены: EDIT, S_EDIT и H_SLIDER.

    Что нужно проверить:

    • Какие индексы возвращает функция при блокировке и нажатии элементов.
    • Есть ли у данных элементов состояние HIGHLIGHTED (подсвечен). Иначе говоря, можно ли узнать, был ли элемент только что нажат, или нет.

    Мы только что убедились, что функции элементов EDIT, S_EDIT и H_SLIDER возвращают индекс нейтрального состояния при открытии окна.  Остается проверить остальные состояния. Поскольку данные типы элементов, теоретически, могут находится только в нейтральном, блокированном и подсвеченном состоянии, (в отличии от кнопок и чекбоксов, у которых состояний больше), нам остается проверить следующие два возможных состояния: блокированное и подсвеченное. Существуют также группа состояний "под курсором", которые пока не хочу добавлять во избежания путаницы. В следующих версиях создам специальный префикс, открывающий индивидуальный список возможных состояний каждого типа элемента. Это облегчит программную работу. 

    Как мы проверим возврат блокированного и подсвеченного состояния EDIT, S_EDIT и H_SLIDER:

    • Найдем чекбокс "Set an option" в файле API.
    • Пропишем запирание/отпирание элементов EDIT, S_EDIT и H_SLIDER внутри его кейса и выведем состояния элементов через Print() там же.
    • Найдем элементы  EDIT, S_EDIT и H_SLIDER  в файле API.
    • Пропишем возврат состояния на событии ввода значения в эти элементы.
    • Выведем полученный результат через Print().
    //-------------------------------------------------------------------------------------------------

     1. Находим чекбокс  "Set an option" в файле API и прописываем запирание/отпирание элементов EDIT, S_EDIT и H_SLIDER внутри его кейса. Затем, выводим состояния через Print().

    case Settings_example_1___Set_an_option:
      
                switch((int)action)
                   {
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the checkbox is checked or unchecked? 
                   //------------------------------------------------------------------------------------------------------
                    case checked: 
                                   {
                                    //-----------------------------------------------
                                    //Locking EDIT:
                                    w7_s_p4_EDIT_Comment_1(p4_LOCK);
                                    
                                    //Locking H_SLIDER:
                                    w6_i_p3_H_SLIDER_Roll_the_value(p3_LOCK);
                                    
                                    //Locking S_EDIT:
                                    w6_d_p5_S_EDIT_Spin_the_value(p5_LOCK); 
                                    
                                    //-----------------------------------------------
                                    //Getting state of EDIT:
                                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
    
                                    //Getting state of H_SLIDER:
                                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
    
                                    //Getting state of S_EDIT:
                                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    //-----------------------------------------------
                                    
                                    //Printing results:
                                    Print("EDIT_state      = ",EDIT_state);
                                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                                    Print("S_EDIT_state    = ",S_EDIT_state);
                                    //-----------------------------------------------
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case unchecked: 
                                   {
                                    //-----------------------------------------------
                                    //Unlocking the element EDIT:
                                    w7_s_p4_EDIT_Comment_1(p4_UNLOCK);
                                    
                                    //Unlocking H_SLIDER:
                                    w6_i_p3_H_SLIDER_Roll_the_value(p3_UNLOCK);
                                    
                                    //Unlocking S_EDIT:
                                    w6_d_p5_S_EDIT_Spin_the_value(p5_UNLOCK);
                                    
                                    //-----------------------------------------------
                                    //Getting state of EDIT:
                                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
    
                                    //Getting state of H_SLIDER:
                                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
    
                                    //Getting state of S_EDIT:
                                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    //-----------------------------------------------
                                    
                                    //Printing results:
                                    Print("EDIT_state      = ",EDIT_state);
                                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                                    Print("S_EDIT_state    = ",S_EDIT_state);
                                    //-----------------------------------------------
                                   }
                    break;
                   } 
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;


     Результат:

    • На событии нажатия на чекбокс, функции элементов возвращают индекс 64, который соответствует состоянию v_NEUTRAL_BLOCKED (нейтральное-блокированное).
    • На событии снятия галочки чекбокса, функции элементов возвращают индекс 15, который соответствует состоянию V_NEUTRAL_STATE (нейтральное состояние).

    //--------------------------------------------------------------------------------------------------

     

    2. Вторая задача:

    • найти элементы EDIT, S_EDIT, H_SLIDER в файле API и прописать получение состояния при вводе значения, чтобы узнать, возвращают ли их функции индекс HIGHLIGHTED (подсвечен).

    Приступим:

    case Settings_example_2___Comment_1:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the text is entered?
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of EDIT:
                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
                                    
                    //Printing the results:
                    Print("EDIT_state      = ",EDIT_state);
                   } 
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    case Settings_example_1___Roll_the_value:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the slider's handle is moved?
                   //------------------------------------------------------------------------------------------------------
                   //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  75  |  Digits: Integer value
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of H_SLIDER:
                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
                                    
                    //Printing results:
                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                   }           
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    case Settings_example_1___Spin_the_value:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the value is set?
                   //------------------------------------------------------------------------------------------------------
                   //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of S_EDIT:
                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    
                    //Printing results:
                    Print("S_EDIT_state    = ",S_EDIT_state); 
                   }
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;

    Результат:

    • EDIT:          На событии интеракции с пользователем, возвращает индекс состояния 67, что означает v_ACTIVATED_HIGHLIGHTED (активирован, подсвечен).

    • S_EDIT:      На событии интеракции с пользователем, возвращает индекс состояния 67, что означает v_ACTIVATED_HIGHLIGHTED (активирован, подсвечен).
    • H_SLIDER:  На событии интеракции с пользователем переменно возвращает индексы 66 и 67, что означает v_NEUTRAL_HIGHLIGHTED (нейтрален, подсвечен) и  v_ACTIVATED_HIGHLIGHTED (активирован, подсвечен). Недоработка. Исправление в след.версии.



    //-----------------------------------------------------------------------------------------------------

    Итоги:

    В общем, итоги можно оценить как удовлетворительные. Элементы возвращают индексы нейтрально и блокированного состояния как было задумано. Однако, есть недоработки:

    • Функция элемента D_LIST не возвращает никакие состояния.
    • Функция элемента H_SLIDER переменно возвращает индексы состояний  v_NEUTRAL_HIGHLIGHTED и  v_ACTIVATED_HIGHLIGHTED вместо одного индекса 67 - v_ACTIVATED_HIGHLIGHTED  (активирован, подсвечен). 

    Выводы:

    • необходимо исправить недоработки.
    • Нужно создать список интеллисенс вызываемый специальным префиксом s_ чтобы пользователь мог знать какие типы элементов обладают теми или иными состояниями и легко использовал их в коде. 

    Потенциально, есть возможность добавить новые состояния элементов. Например, Neutral pointed и Activated pointed (нейтрален под курсором и активирован под курсором), но встает вопрос практической целесообразности и реальной необходимости пользователя в наличия этих возможностей. Пока такие требования не поступят, добавлять новые состояния не стану.

    На этом, данную тему считаю изложенной


    Далее, к следующим темам.

     

    Последнюю неделю я потратил на изучение того, как написать интерфейс с помощью WinForm и встроить его в графики MT5. Сегодня я наконец-то понял, как это сделать.

     
    Загружать видео проще, чем gif, и файл получается меньше.
     

    Общий список тем для рассмотрения:

    1. Ориентирование в списке интеллисенс и выбор функции нужного окна.

    2. Программное открытие и закрытие окон. 

    3. Открытие списка программно доступных элементов окна.

    4. Открытие списка индивидуальных свойств элемента.

    5. Разбор названия функции обертки элемента и окна.

    6. Возврат значения параметра элемента в переменную его типа.

    7. Установка значений в параметры элементов разных типов.

    8. Возврат, изменение и пересылка значений между параметрами разных элементов. Рассмотрим разные типы элементов и значений, и проведем тест на пересылку между разными типами элементов в разных окнах.

    9. Возврат предыдущего значения (_V_LAST). Когда и для каких случаев требуется последнее значение (не путать с текущим).

    10. Тест на установку состояний ON, OFF, LOCK_ON, LOCK_OFF, LOCK, UNLOCK для различных типов элементов.

    11. Тест связывания и синхронизации изменения значений элементов: например поля ввода с кнопками и слайдера. Чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.

    12. Тестирование программного получения/установки границ диапазона слайдера и поля с кнопками (свойства _V_MIN, _V_MAX, _V_STEP, _DIGITS).

    13. Проверка работы запроса состояния элемента (_GET_STATE).

    14. Связывание цвета текста и рамок с расставленными границами значений.

    15. Ориентирование в файле API.

    16. Реализация простой программной логики появления окон сообщений и предупреждений.

    //------------------------------------------

    Желтым цветом выделены темы которые были рассмотрены.

    На текущий момент остается рассмотреть:

    14. Связывание цвета текста и рамок с расставленными границами значений.

    15. Ориентирование в файле API.

    16. Реализация простой программной логики появления окон сообщений и предупреждений.

    //------------------------------------------

    Предлагаю связать тему 14 с темой 16. Выход за установленные границы значений параметров сначала будет вызывать сигналы в виде изменения цвета частей элементов (текст, основание, рамка, полоса и т.д.), затем открытие диалогового окна, и потом окна предупреждения. При этом, окно предупреждения заблокирует изменения значений в элементах до своего ручного закрытия пользователем. 


    Также, я бы хотел добавить в список тему:

    17. Отмена введенных настроек при нажатии на кнопку "Сancel". 

    Когда то давно, технология отмены пользовательских настроек нажатием на кнопку "Сancel", была разработана, и в некоторой степени проверена. На данный момент неизвестно, насколько прежний функционал работоспособен. Поэтому, необходим тест. 


    В итоге совмещения тем, порядок рассмотрения будет следующим:

    14. Реализация ступенчатой защиты границ параметров:

    • Написание логики контроля настроек в предустановленных границах и создание системы предупреждений.
    • Предупрежение 1:    пользователь получает сигнал в виде изменение цвета частей элементов. (Установим связь цвета текста, оснований, рамок и полосы слайдера с границами значений.)
    • Предупрежение 2:    открытие диалогового окна с уведомлением о рисках и предложением вернуться к исходным настройкам. ( Протестируем фактическую возможность вернуться к прежним настройкам при нажатии на кнопку "Сancel". )
    • Предупреждение 3:  открытие окна предупреждения блокирующего дальнейшее изменение параметров настроек и уведомляющего о снятии ответственности, с требованием ручного подтверждения пользователя. ( Протестируем блокировку окон при появлении окна предупреждения. )


    15. Рассмотрим новую распечатку файла API подробнее.

    //----------------------------------------------------------------------------------------------------


    Далее, соберу воедино все найденные баги или недоработки и состовлю список задач для следующего релиза.

    После следующего релиза с исправлениями и добавлениями, сосредоточу внимание на таблицах, в которых вижу одно из главных направлений дальнейшего развития движка.

    Документация по MQL5: Основы языка / Операторы / Оператор возврата return
    Документация по MQL5: Основы языка / Операторы / Оператор возврата return
    • www.mql5.com
    Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается...
     
    hini #:

    Последнюю неделю я потратил на изучение того, как написать интерфейс с помощью WinForm и встроить его в графики MT5. Сегодня я наконец-то понял, как это сделать.


    А как вы наладите связь интерфейса с вашим программным кодом?

     
    Реter Konow #:

    А как вы наладите связь интерфейса с вашим программным кодом?

    Еще несколько вопросов:

    • сколько форм (окон) вы можете "встроить" в графики МТ5? 
    • Как будете транслировать данные в таблицы?
    • Можете ли при создании окон использовать готовые шаблоны?
    • Можете ли создать свой таскбар и контекстное меню внутри МТ5?
    • Как будут реализованы программные возврат/установка свойств элементов? С помощью опроса DLL из функции таймера? 
    Расскажите подробнее о найденном решении. Это очень интересно. :)
     

    В принципе, каждый может использовать тот инструмент, который ему удобен. Мне удобен мой интерфейс и потому его развиваю. Иначе говоря, я собираюсь применять его в собственной алгоритмической торговле. Публикация решений на форуме прибавляет мотивации. Если мой интерфейс окажется кому то нужным - прекрасно, если нет - меня это не заденет. 

    В интерфейсе я вижу мощный инструмент, который в сочетании с алгоритмическими возможностями МТ5 позволит крупно масштабировать результаты правильной торговли. Да, таким долгим путем, я "иду на рынок". Это занимает годы, но в любом случае, мне требуется время на интеллектуальное развитие. Нет смысла торговать на рынке с деньгами, но без мозгов, не так ли?

    Решение использовать WinForms, или нечто подобное, на мой взгляд, неполноценно по сути. Это ведет к техническому отпочковыванию от МТ5 и построению самостоятельного многооконного виндоус приложения. На первом этапе оно будет связано с платформой каналом передачи данных, как пуповиной. Пользователь будет изголятся с опросами DLL и может даже успешно. При желании, сумеет создать контекстное меню, и использовать какие то шаблоны для быстрого создания окон... Но в итоге..., он будет работать сразу в двух-трех IDE, и на разных языках программирования. Так чем это лучше? А главное - чем это легче

    К тому же, имея многооконное виндоус приложение, пользователь может напрямую подключить его к API другой торговой платформы. Так ему будет проще, чем работать через таймер. Ну и про маркет следует упомянуть. Его продукт туда не пропустят. В общем, каждому свое.