Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 9
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну, Толь, благодарю за подсказку:
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())
Ответили уже после того как я оставил этот пост! Спасибо! И нужно будет перебрать все чек боксы и поля ввода? А как пример если их "куча"? Нет массива который хранит все индексы элементов? Потом по этому индексу получить необходимые значения (например нажат или отжат чекбокс, значение в поле ввода)!Неужели только так?
...
А как пример если их "куча"? Нет массива который хранит все индексы элементов? Потом по этому индексу получить необходимые значения (например нажат или отжат чекбокс, значение в поле ввода)!
Посмотрите содержание класса 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 или я чего-то недопонимаю?
...
но как тогда отловить нажатия на кнопках, как получить состояния чек-боксов и значения полей ввода, ...
В обработчике 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.
//+------------------------------------------------------------------+
//| Обработчик событий |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- Событие нажатия на текстовой метке
if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
{
}
}
//---
Во всех статьях есть файлы-примеры MQL-приложений, где показано, как обрабатывать события элементов управления.
В обработчике CProgram это понятно, но этот обработчик для интерфейса, верно? В него же не стоит пихать торговые решения! Я очень мало понимаю в ООП, в основном все мои знания почерпнуты из Ваших статей, так что могу тупить! :)
Так например, как реализовать в советнике открытие ордера, лотность которого задана в поле ввода? Мне ведь нужно уже в самой сове получить значение этого поля!
В обработчике CProgram это понятно, но этот обработчик для интерфейса, верно? В него же не стоит пихать торговые решения!
Почему же нельзя? Можно. Это же класс Вашего MQL-приложения (индикатора или советника). Всё тоже самое.
Получить значение из поля ввода можно вот так: