Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 9

 

Ну, Толь, благодарю за подсказку:

//--- Столбцы
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Получим текущую позицию ползунка вертикальной полосы прокрутки
      v=m_scrollv.CurrentPos()+t;
      //--- Ряды
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Смещение данных таблицы
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Корректировка с учётом выделенной строки
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- Корректировка (1) значений, (2) цвета фона, (3) цвета текста и (4) выравнивания текста в ячейках
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
Так всё работает как нужно ;)
 

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

Библиотека EasyAndFastGUI

Viktor Glovluk, 2017.01.26 10:42

Уважаемые форумчане, подсобите пожалуйста!

На основе этой библиотеки от Anatoli Kazharski , пытаюсь сварганить сову и хотелось организовать запись в файл состояний чекбоксов и значений полей ввода! Но что бы не записывать каждый раз ВСЕ значения, не могу понят как определить элемент на который было нажатие! В пользовательском приложении есть обработчик событий, а параметр lparam как раз отвечает за индекс элемента, но как по этому индексу найти элемент, что бы потом с ним работать не могу понять!

Заранее благодарен! 


 

Viktor Glovluk, 2017.01.26 10:42

Уважаемые форумчане, подсобите пожалуйста!

На основе этой библиотеки от Anatoli Kazharski , пытаюсь сварганить сову и хотелось организовать запись в файл состояний чекбоксов и значений полей ввода! Но что бы не записывать каждый раз ВСЕ значения, не могу понят как определить элемент на который было нажатие! В пользовательском приложении есть обработчик событий, а параметр lparam как раз отвечает за индекс элемента, но как по этому индексу найти элемент, что бы потом с ним работать не могу понять!

Заранее благодарен! 

Нажатие на чекбоксы можно отследить по событию с идентификатором ON_CLICK_LABEL.

В lparam приходит значение идентификатора элемента. 

Пример:

//+------------------------------------------------------------------+
//| Обработчик событий                                               |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- Если нажали на первом чекбоксе
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

Неужели только так?

//--- Если нажали на первом чекбоксе

      if(lparam==m_checkbox1.Id()) 

Ответили уже после того как я оставил этот пост! Спасибо! И нужно будет перебрать все чек боксы и поля ввода? А как пример  если их "куча"? Нет массива который хранит все индексы элементов? Потом по этому индексу получить необходимые значения (например нажат или отжат чекбокс, значение в поле ввода)!
 
Viktor Glovluk:

Неужели только так?

А Вам, как нужно? Уточните.
 
Viktor Glovluk:

...

А как пример  если их "куча"? Нет массива который хранит все индексы элементов? Потом по этому индексу получить необходимые значения (например нажат или отжат чекбокс, значение в поле ввода)!

Посмотрите содержание класса CWndContainer. Они все там хранятся в структуре WindowElements. К ним есть доступ из пользовательского класса.

   //--- Структура массивов элементов
   struct WindowElements
     {
      //--- Общий массив всех объектов
      CChartObject     *m_objects[];
      //--- Общий массив всех элементов
      CElementBase     *m_elements[];

      //--- Персональные массивы элементов:
      //    Массив контекстных меню
      CContextMenu     *m_context_menus[];
      //--- Массив главных меню
      CMenuBar         *m_menu_bars[];
      //--- Всплывающие подсказки
      CTooltip         *m_tooltips[];
      //--- Массив выпадающих списков разных типов
      CElementBase     *m_drop_lists[];
      //--- Массив полос прокрутки
      CElementBase     *m_scrolls[];
      //--- Массив таблиц из текстовых меток
      CElementBase     *m_labels_tables[];
      //--- Массив таблиц из полей ввода
      CElementBase     *m_tables[];
      //--- Массив нарисованных таблиц
      CElementBase     *m_canvas_tables[];
      //--- Массив вкладок
      CTabs            *m_tabs[];
      //--- Массив вкладок с картинками
      CIconTabs        *m_icon_tabs[];
      //--- Массив календарей
      CCalendar        *m_calendars[];
      //--- Массив выпадающих календарей
      CDropCalendar    *m_drop_calendars[];
      //--- Древовидные списки
      CTreeView        *m_treeview_lists[];
      //--- Файловые навигаторы
      CFileNavigator   *m_file_navigators[];
      //--- Стандартные графики (объекты-графики)
      CStandardChart   *m_sub_charts[];
      //--- Слайдеры картинок
      CPicturesSlider  *m_pictures_slider[];
      //--- Время
      CTimeEdit        *m_time_edits[];
      //--- Многострочные поля
      CTextBox         *m_text_boxes[];
     };
   //--- Массив массивов элементов для каждого окна
   WindowElements    m_wnd[];
 

Чем дальше, тем лучше! :)

Опять наткнулся на непонятные мне реализации обработчика событий! При создании пользовательского приложения, подразумевается подключение графического интерфейса через класс:

//--- Подключение класса торговой панели
#include "Menu.mqh"
CProgram program;

 но как тогда отловить нажатия на кнопках, как получить состояния чек-боксов и значения полей ввода, если они в private зоне класса CProgram? Перенести, то что мне необходимо, в public или я чего-то недопонимаю?

 
Viktor Glovluk:

...

но как тогда отловить нажатия на кнопках, как получить состояния чек-боксов и значения полей ввода, ...

В обработчике CProgram.

//+------------------------------------------------------------------+
//| Обработчик событий                                               |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Во всех статьях есть файлы-примеры MQL-приложений, где показано, как обрабатывать события элементов управления

 
Anatoli Kazharski:

В обработчике CProgram.

//+------------------------------------------------------------------+
//| Обработчик событий                                               |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Во всех статьях есть файлы-примеры MQL-приложений, где показано, как обрабатывать события элементов управления. 

В обработчике CProgram это понятно, но этот обработчик для интерфейса, верно? В него же не стоит пихать торговые решения! Я очень мало понимаю в ООП, в основном все мои знания почерпнуты из Ваших статей, так что могу тупить! :)

Так например, как реализовать в советнике открытие ордера, лотность которого задана в поле ввода? Мне ведь нужно уже в самой сове получить значение этого поля! 

 
Viktor Glovluk:

В обработчике CProgram это понятно, но этот обработчик для интерфейса, верно? В него же не стоит пихать торговые решения! 

Почему же нельзя? Можно. Это же класс Вашего MQL-приложения (индикатора или советника). Всё тоже самое.

Получить значение из поля ввода можно вот так:

m_spin_edit1.GetValue()