文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 7)" - 页 7

 
Anatoli Kazharski:
数据不足,无法复制。给我一个完整的示例,这样我就可以自己复制了。

那就发私信吧--你需要额外的类。

是的,重建表后会出现这种情况。

 
Anatoli Kazharski:
数据不足,无法重现。请附上一个完整的示例,这样我就可以自己重复一遍了。

Tol,关于上一个问题和私人信息中没有手鼓的代码示例:以 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())
     {
      //--- 在第一行的价格栏中输入当前符号的价格值
      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:

Tol,关于前一个问题和不带手鼓的代码示例的个人信息:以 Experts\Article10\TestLibrary06 中的示例为例。

在定时器中的 Program.mqh 中编写几行 代码,然后编译并观察。

...

如果没有表格更新行,第一行第一列中就没有价格。如果有,价格可以输入和更改,但表格会不断重绘,无法再使用。

如果需要实时更新表格的许多行,该怎么办?(很多符号,每个符号都需要显示当前价格)。

也许(乍一看),有必要稍微修改一下CTable::SetValue() 方法,这样就可以在更改指定单元格的值时,只更新该单元格(如果它在可见区域内),而不是整个表格。

等我写完这篇文章,我再看看。

另外, 我还会修复高亮显示行的闪烁问题。

 
Anatoli Kazharski:

也许(乍一看),您需要稍微修改一下CTable::SetValue() 方法,以便只更改指定单元格的值(如果该单元格位于可见区域),而不是整个表格。

等我写完这篇文章,我再看看。

另外, 我还会修复高亮显示行闪烁的问题。

有没有 "现在 "就能完成的 "快速 "解决方案?
 
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++;
     }

//---

剩下的就需要更多细节了。

阿尔乔姆-特里什金

如果每次收到新的勾时都更新表格,就无法使用表格了--表格会闪烁,选中的行也会闪烁, 等等等等....。

这是什么?:

  1. pr.
  2. pr.
  3. pr...pr...
 
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. Ave.
  2. pr。
  3. pr --
感谢您对代码的更正,以及对 "pr、pr、pr、pr "的更正。- 也许我写得太匆忙了;)我会看看更正后的效果如何,然后再向您汇报。不过有一点我已经可以说了,那就是整个表格都在更新,而不是只更新一行。这导致在更新整个表格时,有时会出现明显的闪烁--这就是 "问题 "之一。
 
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:
托尔,我会看看那个例子的--我已经在我的程序里看过了,但现在我得走了。等我回来,再给你回信。
好的。稍后,让我们继续刚才的例子。完成它,直到问题开始出现。