CCheckGroup - как получить текст после клика на переключателе?

 

CCheckGroup -

  1. не нашёл вот так сразу, как можно получить текст переключателя по которому кликнули. 
  2. не нашёл (не понял) как можно организовать обход по всем переключателям группы.


То есть если брать отдельно переключатель (CCheckBox) - тогда доступен метод CCheckBox.Text, а как получить текст если имеем дело с группой переключателей (CCheckGroup)?

 

Снова работаю с CCheckGroup и вижу, что не хватает метода редактирования текста элементов. Например при создании вот так:


а в процессе нужно менять на :

 
Пересоздать элементы. 
 
Ihor Herasko #:
Пересоздать элементы. 

Такого метода нет.

 
Vladimir Karputov #:

Такого метода нет.

Это, как бы, не метод. Убить весь CCheckGroup и создать новый, перенеся в него текущее состояние.

 
Ihor Herasko #:

Это, как бы, не метод. Убить весь CCheckGroup и создать новый, перенеся в него текущее состояние.

Тю, убить и создать заново - это как бы не кошерно... От слова "совсем".

 
Vladimir Karputov #:

Тю, убить и создать заново - это как бы не кошерно... От слова "совсем".

Тут уже выбирайте: либо "шашечки", либо "ехать" ))

 

посмотрел исходники, вариантов особо нет, или писать все свое или все таки  использовать СБ, но с учетом, что правки в СБ после обновления терминала будут уничтожены, придется применить антипаттерн "Public Morozov"

в пример из справки добавить:

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Control Panels and Dialogs. Demonstration class CCheckGroup"
#include <Controls\Dialog.mqh>
#define private public
#include <Controls\CheckGroup.mqh>
#undef private

для проверки добавил в метод OnChangeCheckGroup:

void CControlsDialog::OnChangeCheckGroup(void)
  {
   Comment(__FUNCTION__+" : Value="+IntegerToString(m_check_group.Value()));
   for(int i=m_check_group.m_strings.Total()-1;i>=0;i--)
   {
      m_check_group.m_strings.Update(i,(string)rand());
   }
  }


имхо, наименее трудоемкое и довольно надежное решение.... НО если не косячить в дальнейшем! )))

 
Igor Makanu #:

посмотрел исходники, вариантов особо нет, или писать все свое или все таки  использовать СБ, но с учетом, что правки в СБ после обновления терминала будут уничтожены, придется применить антипаттерн "Public Morozov"

в пример из справки добавить:

для проверки добавил в метод OnChangeCheckGroup:


имхо, наименее трудоемкое и довольно надежное решение.... НО если не косячить в дальнейшем! )))

Конечно самый правильный вариант - это наследование. НО: чтобы управлять элементами, нужно иметь доступ к объектам m_strings, m_values и m_states - а они объявлены в секции private:

class CCheckGroup : public CWndClient
  {
private:
   //--- dependent controls
   CCheckBox         m_rows[];              // array of the row objects
   //--- set up
   int               m_offset;              // index of first visible row in array of rows
   int               m_total_view;          // number of visible rows
   int               m_item_height;         // height of visible row
   //--- data
   CArrayString      m_strings;             // array of rows
   CArrayLong        m_values;              // array of values
   CArrayInt         m_states;              // array of states
   long              m_value;               // current value
   int               m_current;             // index of current row in array of rows

и поэтому недоступны извне:

  • private – разрешает доступ к переменным и методам класса только из методов данного класса.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Можно попробовать переопределить закрытые секции в публичные

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Igor Makanu, 2020.01.16 18:57

#define private public
#include <Controls\Dialog.mqh>
// тут весь Ваш класс который наследуете от CAppDialog
#undef private
c undef поэкспериментируйте, можно после макроподстановки отменить ее и закрыть все теперь публичные методы CAppDialog в уже своем классе, чтобы в дальнейшем было удобно код писать

 

дал готовое решение, даже не поленился проверил

есть конечно надежда, что разработчики опять создадут новую СБ, с учетом пожеланий


обещанного три года ждут... народная мудрость

Причина обращения: