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

 
Anatoli Kazharski:
Недостаточно данных для воспроизведения. Приложи полный пример, чтобы я мог у себя повторить.

В личку тогда - там дополнительные классы ещё нужны.

Да, после перестроения таблицы происходит.

 
Anatoli Kazharski:
Недостаточно данных для воспроизведения. Приложи полный пример, чтобы я мог у себя повторить.

Толь, по предыдущему вопросу и по личке с примером кода без бубнов: Берёшь свой пример из Experts\Article10\TestLibrary06

В 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();
     }
  }
//+------------------------------------------------------------------+

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

Как быть, если нужно реалтайм обновление многих строк таблицы? (много символов, и для каждого нужно отобразить текущую цену)

 
Artyom Trishkin:

Толь, по предыдущему вопросу и по личке с примером кода без бубнов: Берёшь свой пример из Experts\Article10\TestLibrary06

В Program.mqh в таймере просто вписываешь несколько строчек, компилируешь и смотришь.

...

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

Как быть, если нужно реалтайм обновление многих строк таблицы? (много символов, и для каждого нужно отобразить текущую цену)

Возможно (на первый взгляд), нужно будет немного модифицировать метод CTable::SetValue(), чтобы можно было изменять значение указанной ячейки с обновлением только этой ячейки (если она в видимой области), а не всей таблицы. 

Посмотрю, когда закончу работать над текущей статьёй. 

P.S. Мигание выделенной строки тоже поправлю. 

 
Anatoli Kazharski:

Возможно (на первый взгляд), нужно будет немного модифицировать метод CTable::SetValue(), чтобы можно было изменять значение указанной ячейки с обновлением только этой ячейки (если она в видимой области), а не всей таблицы. 

Посмотрю, когда закончу работать над текущей статьёй. 

P.S. Мигание выделенной строки тоже поправлю. 

"Быстрого" решения, которое "вот прям сейчас" нету?
 
Artyom Trishkin:
"Быстрого" решения, которое "вот прям сейчас" нету?

Чтобы выделенный ряд таблицы не мигал, в метод 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++;
     }

//---

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

Artyom Trishkin:

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

Вот это что? :

  1. пр.
  2. пр.
  3. пр... 
 
Anatoli Kazharski:

Чтобы выделенная строка не мигала, в метод 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. пр... 
Спасибо за корректировку кода, а насчёт "пр.,пр.,пр." - может я поторопился так написать ;) Погляжу с исправлениями как и что будет, тогда и отпишусь. Но одно, что могу уже сказать - обновляется же вся таблица, а не одна её строка по-моему. Вот это приводит к заметному иногда миганию при обновлении всей таблицы - это одно из "пр."
 
Anatoli Kazharski:

Чтобы выделенная строка не мигала, в метод 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++;
     }

Не, ничего не изменилось в поведении - как моргало, так и моргает. Если курсор мышки находится над таблицей, то моргает, если курсор мышки за пределами окна, то вообще нет видимого выделения строки.
 
Artyom Trishkin:
Не, ничего не изменилось в поведении - как моргало, так и моргает. Если курсор мышки находится над таблицей, то моргает, если курсор мышки за пределами окна, то вообще нет видимого выделения строки.
У меня с внесёнными изменениями такого не наблюдается. Выделенная строка больше не моргает на том примере, который ты предложил тестировать.
 
Anatoli Kazharski:
У меня с внесёнными изменениями такого не наблюдается. Выделенная строка больше не моргает на том примере, который ты предложил тестировать.
Толь, погляжу тот пример - я в своей программе просмотрел, а сейчас уже убегать нужно. Вернусь, погляжу - отпишусь.
 
Artyom Trishkin:
Толь, погляжу тот пример - я в своей программе просмотрел, а сейчас уже убегать нужно. Вернусь, погляжу - отпишусь.
Хорошо. Продолжим потом на том примере, с которого начали здесь. Дополни его до уровня, когда проблема начинает проявляться.