文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 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++;
     }

在 Programme.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())
     {
      //--- 在第一行的价格栏中输入当前符号的价格值
      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:
是的
真是奇迹我在所有终端上的操作都是一样的。即使在 MT4 上也是一模一样,没有任何明显的变化....。
 
Anatoli Kazharski:
您是否改变了鼠标操作?这取决于光标的状态--如果移动光标,高亮显示的线条就会高亮显示,但会闪烁;如果光标在原处,则看不到高亮显示的线条。
 
Artyom Trishkin:
您是否改变了鼠标操作?这取决于光标的状态--如果移动光标,高亮显示的行会高亮显示,但会闪烁;如果光标在原处,则看不到高亮显示的行。
您所描述的一切,在我进行修改之前就已经存在了。现在我没有发现任何问题。试着重新编译所有库文件,然后再看看。
 
Anatoli Kazharski:
在我提到的更改之前,您所描述的一切对我来说都是可行的。现在我没发现任何问题。试试重新编译所有库文件,然后再看看。
没用。
 
Artyom Trishkin:
没有用。
那就只能自己想办法了。
 
Artyom Trishkin:
没有帮助。

不仅要注意突出显示的内容,还要注意在何处使用:

关于交易、自动交易系统和测试交易策略的论坛

讨论文章 "图形界面 X:高级列表和表格管理。代码优化(第 7 版)

Anatoli Kazharski, 2017.01.24 12:26 pm.

为防止表格中高亮显示的行闪烁,请在最后一个循环的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. pr。
  2. pr.
  3. pr--