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

 
Konstantin:

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

выделенная строка не дает работать в тестере.

В тестере вообще пока не тестировал, так как там раньше было много ограничений. Поэтому временно пока так.

Вы уже пробовали в тестере протестировать графический интерфейс? Какой результат? События работают? Графические объекты все отображаются?

 
Anatoli Kazharski:

В тестере вообще пока не тестировал, так как там раньше было много ограничений. Поэтому временно пока так.

Вы уже пробовали в тестере протестировать графический интерфейс? Какой результат? События работают? Графические объекты все отображаются?


да, все объекты отображаются, события мыши на чартах в тестере работать не будут, а так весь интерфейс живой, да собственно и раньше так было

в общем пока наверное от встроенного таймера откажусь, что бы библиотеку не править ))

 

Ни как не могу сообразить, как сделать так, что бы форма создавалась определенного размера по Х и была привязана к правой границе чарта, т.е. при изменении размера чарта по Х форма не меняя размера сдвигалась бы в право / влево не меняя своего размера.

Как вариант переопределить метод ChartEventChartChange в классе CWndEvents, этот метод находится в секции private, может имеет смысл методы:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

перенести в секцию protected, но опять же, там так же используются методы из секций private? В общем если кто сталкивался с такой задачей, подскажите решение

 
Konstantin:

Ни как не могу сообразить, как сделать так, что бы форма создавалась определенного размера по Х и была привязана к правой границе чарта, т.е. при изменении размера чарта по Х форма не меняя размера сдвигалась бы в право / влево не меняя своего размера.

Как вариант переопределить метод ChartEventChartChange в классе CWndEvents, этот метод находится в секции private, может имеет смысл методы:

перенести в секцию protected, но опять же, там так же используются методы из секций private? В общем если кто сталкивался с такой задачей, подскажите решение

Примерно так:

//+------------------------------------------------------------------+
//| Создаёт форму для элементов управления                           |
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Добавим указатель окна в массив окон
   CWndContainer::AddWindow(m_window);
//--- Размеры
   int x_size =200;
   int y_size =200;
//--- Координаты
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- Свойства
...
//--- Создание формы
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

В обработчике событий пользовательского класса MQL-приложения при обработке события CHARTEVENT_CHART_CHANGE:

//+------------------------------------------------------------------+
//| Обработчик событий                                               |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

Результат:

//---

Можно ещё добавить проверку на то, изменились ли размеры (ширина) окна графика, так как событие CHARTEVENT_CHART_CHANGE генерируется в различных случаях. Например, при скроллинге графика.

 
Anatoli Kazharski:

Примерно так:

//---

В обработчике событий пользовательского класса MQL-приложения при обработке события CHARTEVENT_CHART_CHANGE:

//---

Результат:

//---

Можно ещё добавить проверку на то, изменились ли размеры (ширина) окна графика, так как событие CHARTEVENT_CHART_CHANGE генерируется в различных случаях. Например, при скроллинге графика.


спс, получилось ))
 

Как получить в таблице индекс строки, на которой произошел клик левой кнопкой мыши, если при создании таблицы установили SelectableRow(false)? Через парсинг параметра sparam в OnEvent не элегантно как то выглядит. Можно конечно использовать SelectableRow(true) и использовать SelectedItem(), но стоит задача без выделения строк в таблице.

 
Konstantin:

Как получить в таблице индекс строки, на которой произошел клик левой кнопкой мыши, если при создании таблицы установили SelectableRow(false)? Через парсинг параметра sparam в OnEvent не элегантно как то выглядит. Можно конечно использовать SelectableRow(true) и использовать SelectedItem(), но стоит задача без выделения строк в таблице.

Пока только так, но добавлю такую возможность.
 
как разграничить событие выделения строки в таблице и выделение пункта в комбо-бокс? из кода видно, что они используют одно и то же событие ON_CLICK_LIST_ITEM
 
Konstantin:
как разграничить событие выделения строки в таблице и выделение пункта в комбо-бокс? из кода видно, что они используют одно и то же событие ON_CLICK_LIST_ITEM
Зачем? Что именно это мешает Вам сделать?
 

Вывожу таблицу в форме, выделяю в ней строку, в комбо-бокс выбираю значение и данные из строки таблицы и значение из комбо-бокс нужно записать в отдельную сущность. Сейчас события не разграничиваются и нужно делать костыли, что бы реализовать задачу:


может подскажете какой другой механизм?

По сути таблица это массив пар тикеров, в комбо-бокс находятся типы сигналов, отдельная сущность это объекты массива сигналов. Сами объекты это не единичное поле, а сложные пользовательские типы данных, в них записываются пара тикеров из таблицы и тип сигнала, дальше уже другая обработка.