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