Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 7
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Недостаточно данных для воспроизведения. Приложи полный пример, чтобы я мог у себя повторить.
В личку тогда - там дополнительные классы ещё нужны.
Да, после перестроения таблицы происходит.
Недостаточно данных для воспроизведения. Приложи полный пример, чтобы я мог у себя повторить.
Толь, по предыдущему вопросу и по личке с примером кода без бубнов: Берёшь свой пример из 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();
}
}
//+------------------------------------------------------------------+
Без строки с обновлением таблицы нет никакой цены в первом столбце первого ряда. Если она есть, то цена вписывается, меняется, но таблица постоянно перерисовывается, и работать с ней уже нет возможности.
Как быть, если нужно реалтайм обновление многих строк таблицы? (много символов, и для каждого нужно отобразить текущую цену)
Толь, по предыдущему вопросу и по личке с примером кода без бубнов: Берёшь свой пример из Experts\Article10\TestLibrary06
В Program.mqh в таймере просто вписываешь несколько строчек, компилируешь и смотришь.
Без строки с обновлением таблицы нет никакой цены в первом столбце первого ряда. Если она есть, то цена вписывается, меняется, но таблица постоянно перерисовывается, и работать с ней уже нет возможности.
Как быть, если нужно реалтайм обновление многих строк таблицы? (много символов, и для каждого нужно отобразить текущую цену)
Возможно (на первый взгляд), нужно будет немного модифицировать метод CTable::SetValue(), чтобы можно было изменять значение указанной ячейки с обновлением только этой ячейки (если она в видимой области), а не всей таблицы.
Посмотрю, когда закончу работать над текущей статьёй.
P.S. Мигание выделенной строки тоже поправлю.
Возможно (на первый взгляд), нужно будет немного модифицировать метод CTable::SetValue(), чтобы можно было изменять значение указанной ячейки с обновлением только этой ячейки (если она в видимой области), а не всей таблицы.
Посмотрю, когда закончу работать над текущей статьёй.
P.S. Мигание выделенной строки тоже поправлю.
"Быстрого" решения, которое "вот прям сейчас" нету?
Чтобы выделенный ряд таблицы не мигал, в метод 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++;
}
//---
А с остальным нужно больше подробностей.
Если же обновлять таблицу каждый раз при получении нового тика, то с таблицей становится невозможно работать - мигает, выделенная строка моргает, и пр,пр.пр...
Вот это что? :
Чтобы выделенная строка не мигала, в метод 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++;
}
//---
А с остальным нужно больше подробностей.
Вот это что? :
Чтобы выделенная строка не мигала, в метод 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++;
}
Не, ничего не изменилось в поведении - как моргало, так и моргает. Если курсор мышки находится над таблицей, то моргает, если курсор мышки за пределами окна, то вообще нет видимого выделения строки.
У меня с внесёнными изменениями такого не наблюдается. Выделенная строка больше не моргает на том примере, который ты предложил тестировать.
Толь, погляжу тот пример - я в своей программе просмотрел, а сейчас уже убегать нужно. Вернусь, погляжу - отпишусь.