Скачать MetaTrader 5

Обсуждение статьи "Графические интерфейсы VI: Элементы "Чекбокс", "Поле ввода" и их смешанные типы (Глава 1)"

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Статьи помогут закрепить твои знания. Заходи и читай!
MetaQuotes Software Corp.
Модератор
181217
MetaQuotes Software Corp. 2016.05.23 13:02 

Опубликована статья Графические интерфейсы VI: Элементы "Чекбокс", "Поле ввода" и их смешанные типы (Глава 1):

С этой статьи начинается шестая часть серии о разработке библиотеки для создания графических интерфейсов в терминалах MetaTrader. В первой главе речь пойдёт о таких элементах управления, как «чекбокс», «поле ввода», а также о смешанных типах этих элементов.

Элемент «Чекбокс»

Элемент управления «чекбокс» предназначен для управления параметрами, у которых может быть только два состояния. Чтобы понять, в каком состоянии сейчас находится параметр, к которому привязан элемент, используется кнопка с двумя изображениями. Изображение с символом «галочка» обозначает состояние «включено» (on). Изображение без этого символа «галочка» обозначит состояние «выключено» (off). Рядом с кнопкой располагается краткое описание параметра. 

Собирать этот элемент будем из трёх графических объектов. Перечислим их.

  1. Фон
  2. Картинка (кнопка)
  3. Текстовая метка

Рис. 1. Составные части элемента управления «Чекбокс».

Рис. 1. Составные части элемента управления «Чекбокс».

Автор: Anatoli Kazharski

Artyom Trishkin
Модератор
75764
Artyom Trishkin 2016.05.23 14:03  

А ведь "подмигивание" при достижении крайних значений не будет работать в индикаторах - Sleep() же ...

Анатоль, записывай ещё одно пожелание к доработке: задержку организовывать через таймер, тем более, что почти всё для этого у тебя уже есть.

Anatoli Kazharski
56921
Anatoli Kazharski 2016.05.23 14:29  
Artyom Trishkin:

А ведь "подмигивание" при достижении крайних значений не будет работать в индикаторах - Sleep() же ...

Анатоль, записывай ещё одно пожелание к доработке: задержку организовывать через таймер, тем более, что почти всё для этого у тебя уже есть.

Записал. Списочек растёт. Спасибо. )
Реter Konow
1978
Реter Konow 2016.05.23 15:43  
Впечатляет... :)
Pavel Trofimov
1477
Pavel Trofimov 2016.06.19 16:35  

Анатолий, созданная Вами библиотека в высокой степени готовности и вот решил попробовать создать на ней не большой проект для себя. Пишу в эту тем, так чтобы было понятно к какому элементу относится вопрос. Для поля ввода (SpinEdit) необходим ввод значений с точностью до двух десятых. Выставил соответствующие свойства (StepValue и StepDigits) в процедуре создания поля (см. код ниже):

...
   m_spin_edit_Depo.MaxValue(10000000);
   m_spin_edit_Depo.MinValue(0);
   m_spin_edit_Depo.StepValue(0,01);
   m_spin_edit_Depo.SetDigits(2);
   m_spin_edit_Depo.SetValue(v);
...

И после компиляции получил ошибку: 'StepValue' - no one of the overloads can be applied to the function call.

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

...

   //--- Шаг значения

   double            StepValue(void)                          const { return(m_step_value);               }
   void              StepValue(const double value)                  { m_step_value=(value<=0)? 1 : value; }
...

Вопрос в том, что мне не ясно, откуда взялась ошибка.

Далее у меня возник вопрос или пожелание. А если не требуется контролировать минимальное/максимальное значение и оно ограничено только размером используемой для его хранения переменной типа double? Из кода как я понял выставление минимальное/максимальное значений обязательно. Можно ли дописать мое пожелание в список доработок? Т.е. Если минимальное/ максимальное значения для поля не указаны, контроль введенных значений осуществлялся лишь на вхождение его в границы диапазона переменной типа double.

Anatoli Kazharski
56921
Anatoli Kazharski 2016.06.19 17:12  
Pavel Trofimov:

И после компиляции получил ошибку: 'StepValue' - no one of the overloads can be applied to the function call.

...

Вопрос в том, что мне не ясно, откуда взялась ошибка. 

У вас опечатка. В качестве разделителя используйте точку "." :

   m_spin_edit_Depo.StepValue(0.01);

//---

Далее у меня возник вопрос или пожелание. А если не требуется контролировать минимальное/максимальное значение и оно ограничено только размером используемой для его хранения переменной типа double? Из кода как я понял выставление минимальное/максимальное значений обязательно. Можно ли дописать мое пожелание в список доработок? Т.е. Если минимальное/ максимальное значения для поля не указаны, контроль введенных значений осуществлялся лишь на вхождение его в границы диапазона переменной типа double.

Можете пока принудительно установить максимальное и минимальное. Вот так:

   m_spin_edit_Depo.MaxValue(DBL_MAX);
   m_spin_edit_Depo.MinValue(-DBL_MAX);
Pavel Trofimov
1477
Pavel Trofimov 2016.06.19 19:41  
Anatoli Kazharski:

У вас опечатка. В качестве разделителя используйте точку "." :

//---

Можете пока принудительно установить максимальное и минимальное. Вот так:

Спасибо, огромное, за подсказку насчет опечатки. В своем коде глаза "мылятся". А насчет принудительного выставления максимального минимального - устроит. Запишу себе. Еще раз огромное спасибо!
Pavel Kolchin
1085
Pavel Kolchin 2016.12.26 17:33  

в ваших примерах всегда присутствует вывод id, lparam, dparam, sparam.

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)

     {

      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

      //Print(m_spin_edit1.GetValue());

     }

получаем следующее 

TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:

id - индификатор элемента

lparam - ?

dparam - ?

sparam  - название элемента  

 

мы рассматриваем поле ввода - конечно же интересно получить введенное значение, как это сделать максимально быстро?

Anatoli Kazharski
56921
Anatoli Kazharski 2016.12.26 18:10  
Pavel Kolchin:

в ваших примерах всегда присутствует вывод id, lparam, dparam, sparam.

... 

id - индификатор элемента

lparam - ?

dparam - ?

sparam  - название элемента  

Элементы управления генерируют сообщения и параметры в большинстве случаев означают следующее:

  • id - идентификатор события.
  • lparam - идентификатор элемента.
  • dparam - индекс элемента. 
  • sparam - отображаемый текст заданный пользователем библиотеки (название элемента). 

 Я подготовлю потом таблицу, где будет показан набор параметров события от каждого элемента.

Pavel Kolchin:

...

мы рассматриваем поле ввода - конечно же интересно получить введенное значение, как это сделать максимально быстро?

Как раз с помощью метода CSpinEdit::GetValue() и можно получить текущее значение в поле ввода.

Пример:

//--- Пришло событие от поля ввода
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- Если идентификатор элемента от первого поля ввода
      if(lparam==m_spin_edit1.Id())
        {
         //--- Выведем его значение
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
Pavel Kolchin
1085
Pavel Kolchin 2016.12.27 05:19  
а если мы не знаем название или у нас сотня полей, может есть метод по id посмотреть что там или что то типа this.GetValue()
Anatoli Kazharski
56921
Anatoli Kazharski 2016.12.27 05:31  
Pavel Kolchin:
а если мы не знаем название или у нас сотня полей, может есть метод по id посмотреть что там или что то типа this.GetValue()
Так у каждого элемента как раз и есть свой уникальный идентификатор элемента.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий