Обсуждение статьи "Графические интерфейсы VIII: Элемент "Файловый навигатор" (Глава 3)" - страница 2

 

Анатолий, это на мой взгляд лучшая реализация gui-библиотеки в mql, которую я видел здесь.

Сейчас смотрю, как "прикрутить" ее к своему советнику. Хватает всего кроме двух вещей:

1) нет таблицы с  элементами управления внутри отдельных ячеек (чекбоксы, кнопки, ...)

2) никак не могу "догнать" как сделать окно с динамическим контентом.

По 1)-му в принципе понятно, что надо сделать новый класс, как расширение CTable. А вот со 2)-м засада. Допустим в разные моменты времени работы советника открывается диалоговое окно, в котором в зависимости от конкретных текущих условий может быть разное число чекбоксов. Если при следующем открытии окна число чекбоксов увеличивается, то как это делается ясно. А вот если число чекбоксов уменьшится - как это сделать? Если я правильно понимаю, то надо "убить" часть контролов, "подписанных" за данным окном, но в CWndContainer нет методов для уничтожения элементов, только методы добавления. Подскажите как сделать, если это возможно в данной версии библиотеки?

 
akskarabey:

Анатолий, это на мой взгляд лучшая реализация gui-библиотеки в mql, которую я видел здесь.

Сейчас смотрю, как "прикрутить" ее к своему советнику. Хватает всего кроме двух вещей:

1) нет таблицы с  элементами управления внутри отдельных ячеек (чекбоксы, кнопки, ...)

2) никак не могу "догнать" как сделать окно с динамическим контентом.

По 1)-му в принципе понятно, что надо сделать новый класс, как расширение CTable. А вот со 2)-м засада. Допустим в разные моменты времени работы советника открывается диалоговое окно, в котором в зависимости от конкретных текущих условий может быть разное число чекбоксов. Если при следующем открытии окна число чекбоксов увеличивается, то как это делается ясно. А вот если число чекбоксов уменьшится - как это сделать? Если я правильно понимаю, то надо "убить" часть контролов, "подписанных" за данным окном, но в CWndContainer нет методов для уничтожения элементов, только методы добавления. Подскажите как сделать, если это возможно в данной версии библиотеки?

Спасибо за интересные предложения. 

Да, сейчас таких готовых решений в этой версии нет. Необходимость таких возможностей вижу, поэтому добавил в план на реализацию.

По второму пункту. Если нужен динамический список чек-боксов, то более простой способ создать ещё один класс элемента типа CCheckboxList с методами добавления и удаления элементов массива (списка) уже после создания элемента. Кстати, в планах также есть добавить такую возможность во все типы списков и таблиц.

 
Anatoli Kazharski:

По второму пункту. Если нужен динамический список чек-боксов, то более простой способ создать ещё один класс элемента типа CCheckboxList с методами добавления и удаления элементов массива (списка) уже после создания элемента. Кстати, в планах также есть добавить такую возможность во все типы списков и таблиц.

Можно сделать несколько вкладок с разными наборами чек-боксов и отображать нужную?
 
Andrey Khatimlianskii:
Можно сделать несколько вкладок с разными наборами чек-боксов и отображать нужную?

Если наборы изначально предопределены, то подойдёт такой вариант.

Создавать вкладки уже есть возможность: Графические интерфейсы VII: Элементы "Вкладки" (Глава 2) >>>

 
Anatoli Kazharski:

Если наборы изначально предопределены, то подойдёт такой вариант.

Создавать вкладки уже есть возможность: Графические интерфейсы VII: Элементы "Вкладки" (Глава 2) >>>

Это была подсказка вопрошающему )

Ну, и маленький вопрос — реализована ли возможность активировать вкладку программно.

 
Andrey Khatimlianskii:

...

Ну, и маленький вопрос — реализована ли возможность активировать вкладку программно.

В пользовательском классе при создании интерфейса до создания элемента:

//+------------------------------------------------------------------+
//| Создаёт область с вкладками                                      |
//+------------------------------------------------------------------+
bool CProgram::CreateTabs(void)
  {
#define TABS1_TOTAL 4
//--- Передать объект панели
   m_tabs.WindowPointer(m_window1);
//--- Координаты
   int x=m_window1.X()+TABS1_GAP_X;
   int y=m_window1.Y()+TABS1_GAP_Y;
//--- Массивы с текстом и шириной для вкладок
   string tabs_text[]={"Tab 1","Tab 2","Tab 3","Tab 4"};
   int tabs_width[]={90,90,90,90};
//--- Установим свойства перед созданием
   m_tabs.XSize(596);
   m_tabs.YSize(243);
   m_tabs.TabYSize(TabsHeight);
   m_tabs.PositionMode(TabsPosition);
   m_tabs.SelectedTab((m_tabs.SelectedTab()==WRONG_VALUE) ? 1 : m_tabs.SelectedTab());
//--- Добавим вкладки с указанными свойствами
   for(int i=0; i<TABS1_TOTAL; i++)
      m_tabs.AddTab(tabs_text[i],tabs_width[i]);
//--- Создадим элемент управления
   if(!m_tabs.CreateTabs(m_chart_id,m_subwin,x,y))
      return(false);
//--- Добавим объект в общий массив групп объектов
   CWndContainer::AddToElementsArray(0,m_tabs);
   return(true);
  }

//---

Этого достаточно? Или нужна возможность уже после создания элемента в процессе работы программно переключать вкладки? 

 

Желательно добавить такую возможность...

что-то типа:

m_tabs.SelectTab(...)
 
Ruslan Khasanov:
Andrey Khatimlianskii:

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

Действительно, есть случаи, где это может понадобиться. Придумал пару идей, где активация той или иной вкладки могла бы быть автоматической. )

 

Как подогнать размеры навигатора под размеры окна, в котором навигатор выводится?

Например: размер окна 450. Как вписать навигатор в окно, чтобы справа и слева были отступы по 2 пикселя?

 
Artyom Trishkin:

Как подогнать размеры навигатора под размеры окна, в котором навигатор выводится?

Например: размер окна 450. Как вписать навигатор в окно, чтобы справа и слева были отступы по 2 пикселя?

Нужно воспользоваться методами CFileNavigator::TreeViewAreaWidth() и CFileNavigator::ContentAreaWidth() указав ширину для области древовидного списка и области содержания. Если не устанавливать ширину области содержания, то правый край навигатора будет автоматически выравнен по правому краю окна.

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