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

 
Thomas Schwabhäuser:

...

Спасибо за подсказку!

Я добавлю эту возможность. Следите за обновлениями будущих статей в этой серии.

 

в ваших примерах всегда присутствует вывод 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()
Так у каждого элемента как раз и есть свой уникальный идентификатор элемента.
 
Anatoli Kazharski:
Так у каждого элемента как раз и есть свой уникальный идентификатор элемента.


if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   if(lparam==m_spin_edit1.Id()){Print(m_spin_edit1.GetValue());}

   if(lparam==m_spin_edit2.Id()){Print(m_spin_edit2.GetValue());}

   if(lparam==m_spin_edit3.Id()){Print(m_spin_edit3.GetValue());}

   if(lparam==m_spin_edit4.Id()){Print(m_spin_edit4.GetValue());}

   if(lparam==m_spin_edit5.Id()){Print(m_spin_edit5.GetValue());}

   if(lparam==m_spin_edit6.Id()){Print(m_spin_edit6.GetValue());}

   if(lparam==m_spin_edit7.Id()){Print(m_spin_edit7.GetValue());}

   if(lparam==m_spin_edit8.Id()){Print(m_spin_edit8.GetValue());}

   if(lparam==m_spin_edit9.Id()){Print(m_spin_edit9.GetValue());}

   ...

}

я имел ввиду чтобы не писать такой код, может есть смысл сделать

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

 но у меня полей не много, мне и первый вариант подойдет

 

Pavel Kolchin:

... 

я имел ввиду чтобы не писать такой код, может есть смысл сделать

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

У меня пока нет решения, как это сделать для всех get-методов всех элементов. Но я подумаю над этим.
 
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Простая задачка. Изменить цвет лейбла чекбокса при нажатии на чекбокс. Стоит галочка - зеленый текст, не стоит  - красный. Не работает. Снимаю становится синей, ставлю галочку всё равно синий.
 

Alexander Fedosov:

 

Простая задачка. Изменить цвет лейбла чекбокса при нажатии на чекбокс. Стоит галочка - зеленый текст, не стоит  - красный. Не работает. Снимаю становится синей, ставлю галочку всё равно синий.

Сейчас можно установить цвета для разных состояний только до установки элемента (пример ниже):

//+------------------------------------------------------------------+
//| Создаёт чекбокс 1                                                |
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- Сохраним указатель на окно
   m_checkbox1.WindowPointer(m_window1);
//--- Установим свойства перед созданием
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- Создадим элемент управления
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- Добавим объект в общий массив групп объектов
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Простая задачка. Изменить цвет лейбла чекбокса при нажатии на чекбокс. Стоит галочка - зеленый текст, не стоит  - красный. Не работает. Снимаю становится синей, ставлю галочку всё равно синий.

А если так?

   if(lparam==program.m_checkbox.Id())
     {
      if(program.m_checkbox.CheckButtonState()) program.m_checkbox.LabelColor(clrGreen);
      else program.m_checkbox.LabelColor(clrRed);
     }