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

 
Konstantin:

методы X(const int x) и Y(const int y) ни как не влияют на расположение таблицы в форме, она всегда располагается в левом верхнем углу

Относительные координаты устанавливается при создании элементов в пользовательском классе:

//--- Создадим элемент управления
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);

//---

Какая задача стоит?

 
Anatoli Kazharski:

Относительные координаты устанавливается при создании элементов в пользовательском классе:

//---

Какая задача стоит?

разместить две таблицы по горизонтали, x_gap,y_gap меняет расположение горизонтальной прокрутки и все ((

PS. такс, вроде сместил, но почему то сместились две таблицы ))

а в методе:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

если две таблицы, то первый параметр всегда 0 или это порядковый номер одинаковых объектов?

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

 
Konstantin:

...

PS. такс, вроде сместил, но почему то сместились две таблицы ))

а в методе:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

если две таблицы, то первый параметр всегда 0 или это порядковый номер одинаковых объектов?

Первый параметр это номер формы, к которой присоединяется элемент. Возможно Вы одну и ту же таблицу добавляете в общий список элементов.
 
Anatoli Kazharski:
Первый параметр это номер формы, к которой присоединяется элемент. Возможно Вы одну и ту же таблицу добавляете в общий список элементов.


что значит в общий список? где он разделяется?

вот метод создания в классе формы:

/*!
   \brief   Создание объекта
   \param   const string a_name - имя программы
   \param   const uint a_pause - пауза для обновления статусной строки
   \return  true в случае успеха, иначе false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- добавим объект таблицы в общий массив групп объектов
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

метод GetTbl возвращает указатель на CCanvasTable m_table

 
Konstantin:

...

Нужен вот такой результат?

//---

Приложил пример в архиве:

Файлы:
 
Konstantin:

вот метод создания в классе формы:

метод GetTbl возвращает указатель на CCanvasTable m_table

//--- Создадим элемент управления
   if(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- Добавим объект в общий массив групп объектов
   CWndContainer::AddToElementsArray(0,m_canvas_table2);
 
Anatoli Kazharski:

Нужен вот такой результат?

//---

Приложил пример в архиве:


сделал так:

/*!
   \brief   Создание объекта
   \param   const string a_name - имя программы
   \param   const uint a_pause - пауза для обновления статусной строки
   \return  true в случае успеха, иначе false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   //--- добавим объект таблицы в общий массив групп объектов
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- добавим объект таблицы в общий массив групп объектов
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

и все заработало, оказывается сразу после создания объекта его нужно помещать в контейнер и только после этого создавать другой объект ))


 
Anatoli Kazharski:

не, у меня таблицы расположены в других классах, я применяю модульное программирование )) так удобнее управлять функционалом - класс главной формы, класс таблицы 1, класс таблицы 2 и т.д. в итоге все элементы собираются в классе главной формы отдельными готовыми объектами
 
Konstantin:

не, у меня таблицы расположены в других классах, я применяю модульное программирование )) так удобнее управлять функционалом - класс главной формы, класс таблицы 1, класс таблицы 2 и т.д. в итоге все элементы собираются в классе главной формы отдельными готовыми объектами
Согласен. Многие пользователи этой библиотеки так делают, только у меня всё руки никак не доходят. )
 
Anatoli Kazharski:
Согласен. Многие пользователи этой библиотеки так делают, только у меня всё руки никак не доходят. )


кстати есть проблема:

CWndEvents::CWndEvents(void) : m_chart_id(0),
                               m_subwin(0),
                               m_active_window_index(0),
                               m_indicator_shortname(""),
                               m_program_name(PROGRAM_NAME),
                               m_subwindow_handle(INVALID_HANDLE),
                               m_subwindow_shortname(""),
                               m_subwindows_total(1)

  {
//--- Включим таймер
   if(!::MQLInfoInteger(MQL_TESTER))
      ::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- Получим ID текущего графика
   m_chart.Attach();
//--- Включим слежение за событиями мыши
   m_chart.EventMouseMove(true);
//--- Отключим вызов командной строки для клавиш Space и Enter
   m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- Определение номера подокна
   DetermineSubwindow();
  }

выделенная строка не дает работать в тестере. Лучше сделать выбор типа такого:

enum ENUM_GRAPHICS {
   GRAPHICS_NO    = 0,  // графика не нужна
   GRAPHICS_REAL  = 1,  // графика для реальной торговли
   GRAPHICS_TEST  = 2   // графика для тестов
};

/*!
   Получает признак работы запущенной программы
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+
/*!
   Признак показа графики
   \return   признак работы программы из перечисления ENUM_GRAPHICS
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
   if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
      m_graphics = GRAPHICS_NO;
   else if(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_REAL;
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_TEST;
//---
   return m_graphics;
}

а в программе делать примерно такой выбор:

   //--- настройка для OnTimer()
   uint _pause = 0;
   if(in_param.graphics == GRAPHICS_REAL)
      _pause = 500;                       // 500 мс
   else if(in_param.graphics == GRAPHICS_TEST)
      _pause = 60000;                     // 1 минута

   if(!main_form.Create(name_mts, _pause)) {
      ::Print(__FUNCTION__," > Не удалось создать графический интерфейс!");
      return INIT_FAILED;
   }

либо просто флагами делать выбор