Обсуждение статьи "Графические интерфейсы X: Выделение текста в многострочном поле ввода (build 13)" - страница 11

 
Anatoli Kazharski:

Добавляйте вкладки до создания элемента. Ориентируйтесь на примеры из статей о том или ином элементе. Если о чём-то не рассказано, то значит, что этой возможности пока нет. 

Добавление и удаление уже после создания элемента работает сейчас только в списках и таблицах.

Т.е. в данном классе метод CreateTabs является основополагающим по созданию вкладок? А корректно ли будет при изменении числа вкладок, если использовать метод Delete и после него использовать метод CreateTabs? Или после метода Delete нужно обязательно указывать опять все свойства как при начальном создании?
 
Konstantin:
Т.е. в данном классе метод CreateTabs является основополагающим по созданию вкладок? А корректно ли будет при изменении числа вкладок, если использовать метод Delete и после него использовать метод CreateTabs? Или после метода Delete нужно обязательно указывать опять все свойства как при начальном создании?

Да. Сначала указываем свойства, а затем создаём элемент.

На данный момент нет механизма корректного удаления элементов во время выполнения программы. Они будут оставаться в общем списке элементов. Но попробуйте, как описали это в своём вопросе. Я так ещё не тестировал.

 
Anatoli Kazharski:

Да. Сначала указываем свойства, а затем создаём элемент.

На данный момент нет механизма корректного удаления элементов во время выполнения программы. Они будут оставаться в общем списке элементов. Но попробуйте, как описали это в своём вопросе. Я так ещё не тестировал.

)) уже пробую, если все пройдет корректно, то выложу пример
 

вот так работает:

#ifndef __TBLTABS_MQH__
#define __TBLTABS_MQH__

#include "..\\..\\..\\v1.00\\lib\\define.mqh"

#include <Arrays\List.mqh>
#include <EasyAndFastGUI\WndEvents.mqh>

//+------------------------------------------------------------------+
class CTblTabs
  {
private:
   int      m_x;
   int      m_y;
   long     m_chart_id;
   int      m_subwin;
   string   m_text[];
   int      m_width[];
   CTabs    m_tabs;
   CWindow  *m_form;

public:
                     CTblTabs(void);
                    ~CTblTabs(void);
   bool              Create(CWindow &a_form,const long a_chart_id,const int a_subwin,     // создание объекта
                              const int a_x,const int a_y);
   void              OnLinkProgram(CList &a_pair);                                        // связь с программой
   CTabs*            GetTbl(void) { return &m_tabs; }

private:
   void              UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]);   // обновление значений таблицы
   bool              ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],       // переинициализация вкладок объекта
                              int &a_width[],const long a_chart_id,const int a_subwin,const int a_x,const int a_y);
  };
//+------------------------------------------------------------------+
/*!
   \brief   Конструктор
*/
CTblTabs::CTblTabs(void) : m_x(0), m_y(0), m_chart_id(0), m_subwin(0), m_form(NULL) { }
/*!
   \brief   Деструктор
*/
CTblTabs::~CTblTabs(void) {
   m_form = NULL;
}
/*!
   \brief   Создание объекта
   \param   CWindow &a_form - объект формы
   \param   const long a_chart_id - ID чарта
   \param   const int a_subwin - подокно чарта
   \param   const int a_x - координата Х
   \param   const int a_y - координата У
   \return  true в случае успеха, иначе false
*/
bool CTblTabs::Create(CWindow &a_form,const long a_chart_id,const int a_subwin,const int a_x,const int a_y) {
   m_x = a_x;
   m_y = a_y;
   m_chart_id = a_chart_id;
   m_subwin   = a_subwin;
   m_form     = &a_form;

   //--- массивы с текстом и шириной для вкладок
   //::ArrayResize(m_text, 1);
   //m_text[0] = "NULL_NULL";
   //::ArrayResize(m_width, 1);
   //m_width[0] = 65;

   m_tabs.WindowPointer(a_form);       // сохраним указатель на форму

   //--- координаты
   int _x = a_form.X() + m_x;
   int _y = a_form.Y() + m_y;

   //--- размеры
   m_tabs.XSize(400);
   m_tabs.YSize(200);

   //--- свойства
   m_tabs.TabYSize(20);
   m_tabs.PositionMode(TABS_TOP);
   m_tabs.AutoXResizeMode(true);
   m_tabs.AutoYResizeMode(true);
   m_tabs.AutoXResizeRightOffset(200);
   m_tabs.AutoYResizeBottomOffset(23);
   m_tabs.TabBorderColor(clrLightSteelBlue);
   m_tabs.SelectedTab((m_tabs.SelectedTab() == WRONG_VALUE) ? 0 : m_tabs.SelectedTab());


   //--- добавим вкладки с указанными свойствами
   //for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
   //   m_tabs.AddTab(m_text[i], m_width[i]);

   //--- cоздадим элемент управления
   //if(!m_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
   //   return false;

//---
   return true;
}
/*!
   \brief   Связь с программой
   \param   CList &a_pair - указатель на список торговых пар с сигналами
*/
void CTblTabs::OnLinkProgram(CList &a_pair) {
   if(a_pair.Total() != m_tabs.TabsTotal())
      this.ReInit(m_form, a_pair, m_tabs, m_text, m_width, m_chart_id, m_subwin, m_x, m_y);
   else
      this.UpdateTabs(a_pair, m_tabs, m_text, m_width);
}
//+------------------------------------------------------------------+
/*!
   \brief   Обновление значений вкладок
   \param   CList &a_pair - указатель на список торговых пар с сигналами
   \param   CTabs &a_tabs - объект таблицы
   \param   string &a_text[] - массив с названием вкладок
   \param   int &a_width[] - массив с размером ширины вкладок
*/
void CTblTabs::UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]) {
   int _total = a_tabs.TabsTotal();
   //--- разложим данные по таблице
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode())
      a_tabs.Text(_count, _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker);

}
/*!
   \brief   Переинициализация вкладок объекта
   \param   CWindow &a_form - объект формы
   \param   CList &a_pair - указатель на список торговых пар с сигналами
   \param   CTabs &a_tabs - объект таблицы
   \param   string &a_text[] - массив с названием вкладок
   \param   int &a_width[] - массив с размером ширины вкладок
   \param   const long a_chart_id - ID чарта
   \param   const int a_subwin - подокно чарта
   \param   const int a_x - координата Х
   \param   const int a_y - координата У
   \return  true в случае успеха, иначе false
*/
bool CTblTabs::ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[],const long a_chart_id,
                                                                                  const int a_subwin,
                                                                                  const int a_x,
                                                                                  const int a_y) {

   a_tabs.Delete();     // очистим от вкладок объект

   //--- переинициализируем массивы значений
   int _total = a_pair.Total();
   ::ArrayResize(a_text, _total);
   ::ArrayResize(a_width, _total);

   //--- заполним массивы знаяениями названий вкладок
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode()) {
      a_text[_count]  = _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker;
      a_width[_count] = 65;
   }

   //--- добавим вкладки с указанными свойствами
   for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
      a_tabs.AddTab(a_text[i], a_width[i]);

   //--- координаты
   int _x = a_form.X() + a_x;
   int _y = a_form.Y() + a_y;

   //--- cоздадим элемент управления
   if(!a_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
      return false;
//---
   return true;
}
//+------------------------------------------------------------------+

#endif // __TBLTABS_MQH__

цветом выделил что в методе создания класса уже не нужно, т.к. по сути используется в методе ReInit.

Все механизмы событий и взаимодействия описаны в классе главной формы программы.


 
Konstantin:

вот так работает:

Спасибо за пример. Интересно.

 
Anatoli Kazharski:

Спасибо за пример. Интересно.


нашел один недочет - если вкладок нет, то при изменении размера чарта (формы), программа вываливается с ошибкой array out of range in 'Tabs.mqh' (821,21)

 
Konstantin:

нашел один недочет - если вкладок нет, то при изменении размера чарта (формы), программа вываливается с ошибкой array out of range in 'Tabs.mqh' (821,21)

В следующем обновлении будет исправление.
 

При создании объектов (элементов формы), используется метод CWndContainer::AddToElementsArray(0, m_object);, есть ли какой нибудь механизм корректного удаления заданного объекта из данного контейнера?

Это требуется при создании / удалении чартов, при использовании описанного выше механизма добавления / удаления вкладок.

 
Konstantin:

При создании объектов (элементов формы), используется метод CWndContainer::AddToElementsArray(0, m_object);, есть ли какой нибудь механизм корректного удаления заданного объекта из данного контейнера?

Это требуется при создании / удалении чартов, при использовании описанного выше механизма добавления / удаления вкладок.

Это пока не реализовано.

 
Anatoli Kazharski:

Это пока не реализовано.

было бы логичнее сделать удаление по запросу пользователя класса, т.к. работа с объектами в динамике больше оживляет интерфейс, для своей задачи я введу число чартов по числу пар тикеров, но т.к. пар тикеров у меня 702 на основе 27 тикеров, то не трудно посчитать какие тормоза будут если выйти на другой рынок где тикеров гораздо больше ))

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

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