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

 

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

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

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

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

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

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

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

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

Автор: Anatoli Kazharski

 

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

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

 
Artyom Trishkin:

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

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

Записал. Списочек растёт. Спасибо. )
 
Впечатляет... :)
 

Анатолий, созданная Вами библиотека в высокой степени готовности и вот решил попробовать создать на ней не большой проект для себя. Пишу в эту тем, так чтобы было понятно к какому элементу относится вопрос. Для поля ввода (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.

 
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);
 
Anatoli Kazharski:

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

//---

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

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

в ваших примерах всегда присутствует вывод 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  - название элемента  

 

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

 
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;
     }
 
а если мы не знаем название или у нас сотня полей, может есть метод по id посмотреть что там или что то типа this.GetValue()
 
Pavel Kolchin:
а если мы не знаем название или у нас сотня полей, может есть метод по id посмотреть что там или что то типа this.GetValue()
Так у каждого элемента как раз и есть свой уникальный идентификатор элемента.