Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 8

 
Anatoli Kazharski:
Хорошо. Продолжим потом на том примере, с которого начали здесь. Дополни его до уровня, когда проблема начинает проявляться.

Не, Толь, и в твоём примере то же самое - ничего не изменилось. В Table.mqh добавил в последний цикл:

//--- Столбцы
   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],m_vcolumns[h].m_cell_color[v],m_vcolumns[h].m_text_color[v],m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

В Program.mqh добавил в таймер:

//+------------------------------------------------------------------+
//| Таймер                                                           |
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- Пауза между обновлением элементов
   if(m_counter1.CheckTimeCounter())
     {
      //--- Обновление второго пункта статусной строки
      m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
      //--- Перерисовать график
      m_chart.Redraw();
     }
//--- Пауза между обновлением элементов
   if(m_counter2.CheckTimeCounter())
     {
      //--- Вписать в Price первого ряда значение цены текущего символа
      MqlTick tick;                                                    
      if(SymbolInfoTick(Symbol(),tick))                                
        {                                                              
         int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);        
         m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);         
         m_table.UpdateTable();                                        
        }                                                              
      //--- Добавить ряд в таблицу, если общее кол-во меньше указанного
      if(m_table.RowsTotal()<m_spin_edit1.GetValue())
         m_table.AddRow();
      //--- Добавить столбец в таблицу, если общее кол-во меньше указанного
      if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
         m_table.AddColumn();
      //--- Добавить пункт в список, если общее кол-во меньше указанного
      if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
         //--- Переместить ползунок полосы прокрутки в конец списка
         m_listview.Scrolling();
        }
      //--- Добавить пункт в список из чек-боксов, если общее кол-во меньше указанного
      if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
         //--- Переместить ползунок полосы прокрутки в конец списка
         m_checkbox_list.Scrolling();
        }
      //--- Перерисовать график
      m_chart.Redraw();
     }
  }
//+------------------------------------------------------------------+

Всё как и было - без изменений - моргает.

Может у тебя уже другая версия Table.mqh, и в ней уже работает с такими изменениями?

 
Artyom Trishkin:

...

Может у тебя уже другая версия Table.mqh, и в ней уже работает с такими изменениями?

Версия та же, что и в статье с примером. У себя проблем не вижу. Ничем пока больше помочь не могу, так как причины не ясны.
 
Anatoli Kazharski:
Версия та же, что и в статье с примером. У себя проблем не вижу. Ничем пока больше помочь не могу, так как причины не ясны.
И у тебя таймер отрабатывает, цена обновляется в таблице с каждым новым тиком, но при этом таблица ведёт себя нормально?
 
Artyom Trishkin:
И у тебя таймер отрабатывает, цена обновляется в таблице с каждым новым тиком, но при этом таблица ведёт себя нормально?
Да.
 
Anatoli Kazharski:
Да.
Чудеса. А у меня на всех терминалах одно и то же. И даже на МТ4 точно так же - без каких-либо видимых изменений...
 
Anatoli Kazharski:
Работу с мышкой не менял? Зависит от состояния курсора - двигаешь - выделенная строка становится выделенной, правда моргает, если курсор на месте, то никакого выделения строки не видно.
 
Artyom Trishkin:
Работу с мышкой не менял? Зависит от состояния курсора - двигаешь - выделенная строка становится выделенной, правда моргает, если курсор на месте, то никакого выделения строки не видно.
Всё, что ты описываешь, у меня воспроизводилось до тех изменений, которые я указал. Теперь проблем у себя не вижу. Попробуй перекомпилировать все файлы библиотеки и посмотри ещё раз.
 
Anatoli Kazharski:
Всё, что ты описываешь, у меня воспроизводилось до тех изменений, которые я указал. Теперь проблем у себя не вижу. Попробуй перекомпилировать все файлы библиотеки и посмотри ещё раз.
Не помогло.
 
Artyom Trishkin:
Не помогло.
Тогда остаётся попробовать разобраться самостоятельно.
 
Artyom Trishkin:
Не помогло.

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)"

Anatoli Kazharski, 2017.01.24 12:26

Чтобы выделенный ряд таблицы не мигал, в метод CTable::UpdateTable() в последнем цикле добавить вот эти строки:

//--- Столбцы
   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++;
     }

//---

А с остальным нужно больше подробностей.  

Вот это что? :

  1. пр.
  2. пр.
  3. пр...