Галерея 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.