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

 

我仍然不明白如何更新表....

表中有动态数据,我们需要用定时器更新它。

我尝试使用 Clear() 方法先清除数据,但弹出了一个错误:

 invalid pointer access in 'Element.mqh' (106,70)

如何更新?我在文章中没有找到任何示例。在所有文章中,表格都是用静态数据填充的。

 
Juer:

如何更新我尚未理解的表....

表中有动态数据,我们需要用定时器更新它。

我尝试使用 Clear() 方法先清除数据,但弹出了一个错误:

如何更新?我在文章中没有找到任何示例。在所有文章中,表格都是用静态数据填充的。

 
Anatoli Kazharski:

谢谢。只是它没有考虑排序。

排序时,行可以改变位置....

 
Juer:

谢谢。只是它没有考虑到分类。

排序时,行可以改变位置...

您可以自己控制排序。为此有一个公共方法CTable::SortData()。

这里有CTable 类的示例和最新版本:EasyAndFast 库更新

 
Anatoli Kazharski:

您可以自己控制排序。为此,我们提供了一个公共方法CTable::SortData()。

这里有CTable 类的示例和最新版本:EasyAndFast 库更新

仍然不清楚。没有方法确定表中有多少行是非空的。我正在向表中上传未结订单的信息。订单可以出现或关闭。每次我都必须查看表中的所有值,并通过 ticket.... 进行比较。虽然不方便,但还是可以做到的。

另外,您能否帮助我进行排序。我需要在表格中创建一行类似于 "交易 "选项卡上的一行。这一行汇总未结头寸的利润、佣金等。也就是说,这一行的列将与表格中的列相同,但要有总值。那么,如何才能将这一行放在列表的第一位,从而不对其进行排序呢?

 
Juer:

还是不清楚。没有方法确定表中有多少行是非空行。我正在向表中上传未结订单的信息。订单可以出现,也可以关闭。我必须每次都查看表中的所有值,并通过 ticket.... 进行比较。这并不方便,但可以做到。

...

自己查看各行是否为空。

带图形用户界面的智能交易系统:功能填充(第二部分)》一文详细介绍了如何实现这一点。

尤尔

...

另外,您能告诉我排序的方法吗?我需要在表格中创建一行类似于 "交易 "选项卡上的一行。这一行汇总未结头寸的利润、佣金等。也就是说,这一行的列将与表格中的列相同,但要有总值。那么,如何才能将这一行放在列表的第一位,而不对其进行排序呢?

库中没有这种可能性。作为一种选择,您可以在第一个表格上方创建一个不带标题的第二表格,并在其中输出总值。

 
Anatoli Kazharski:

自己去看看线路是否空闲。

带图形用户界面的智能交易系统:功能填充(第二部分)》一文详细介绍了如何实现功能填充

程序库没有这项功能。作为一种选择,您可以在第一张表格的上方创建一个不带标题的第二张表格,并在其中输出总值。

在文章中的示例中,行数也是恒定的,但我的行数是动态的。但我意识到必须手动操作。

上面的第二个表格不失为一个好办法,但如何处理改变主表列宽的问题?如何与第二个表同步?

还有一个问题。如果第一列只表示记录的序列号。它不需要排序。有没有办法让某一列不排序?

 
Juer:

在文章中的例子中,行数也是恒定的,但我的是动态的。但我明白,这是手工制作,有什么问题呢?

你在哪里看到不变的行数?位置数 和使用的字符数是会变化的,这些变化会反映在表格中。


尤尔

上面的第二个表格是个不错的解决方案,但改变主表中列的宽度......怎么办?如何与第二个表格同步?

还有一个问题。如果第一列只表示记录的序列号。它不需要排序。有没有办法让某一列不排序?

没有,没有办法。

 
Anatoli Kazharski:

你在哪里看到恒定的行数?位置数 和使用的字符数会发生变化,这些变化会反映在表格中。

老实说,我不太明白你是如何更新位置的。我知道要更新字符表,只需删除所有行即可。但我不明白位置表是如何更新的:

//+------------------------------------------------------------------+
//| 设置位置表中的值
//+------------------------------------------------------------------+
void CProgram::SetValuesToPositionsTable(string &symbols_name[])
  {
//--- 检查是否超出范围
   uint symbols_total =::ArraySize(symbols_name);
   uint rows_total    =m_table_positions.RowsTotal();
   if(symbols_total<rows_total)
      return;
//--- 让我们在表格中获取指标
   for(uint r=0; r<rows_total; r++)
     {
      int    positions_total =PositionsTotal(symbols_name[r]);
      double pos_volume      =PositionsVolumeTotal(symbols_name[r]);
      double buy_volume      =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_volume     =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_SELL);
      double pos_profit      =PositionsFloatingProfitTotal(symbols_name[r]);
      double buy_profit      =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_profit     =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_SELL);
      double average_price   =PositionAveragePrice(symbols_name[r]);
      string deposit_load    =::DoubleToString(DepositLoad(false,average_price,symbols_name[r],pos_volume),2)+"/"+
                              ::DoubleToString(DepositLoad(true,average_price,symbols_name[r],pos_volume),2)+"%";
      //--- 设置值
      m_table_positions.SetValue(0,r,symbols_name[r]);
      m_table_positions.SetValue(1,r,(string)positions_total);
      m_table_positions.SetValue(2,r,::DoubleToString(pos_volume,2));
      m_table_positions.SetValue(3,r,::DoubleToString(buy_volume,2));
      m_table_positions.SetValue(4,r,::DoubleToString(sell_volume,2));
      m_table_positions.SetValue(5,r,::DoubleToString(pos_profit,2));
      m_table_positions.SetValue(6,r,::DoubleToString(buy_profit,2));
      m_table_positions.SetValue(7,r,::DoubleToString(sell_profit,2));
      m_table_positions.SetValue(8,r,deposit_load);
      m_table_positions.SetValue(9,r,::DoubleToString(average_price,(int)::SymbolInfoInteger(symbols_name[r],SYMBOL_DIGITS)));
      //--- 设置颜色
      m_table_positions.TextColor(3,r,(buy_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(4,r,(sell_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(5,r,(pos_profit!=0)? (pos_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(6,r,(buy_profit!=0)? (buy_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(7,r,(sell_profit!=0)?(sell_profit>0)? clrGreen : clrRed : clrLightGray);
     }
  }

我有一点不明白。如果表中的符号少于行数,就不更新吗?

我需要在每个跳动点更新数值。如果每次都删除所有行并重新填写表格,正确的做法是什么?

 

Juer:

我需要在每次勾选时更新实际值。如果每次都删除所有行并重新填写表格,这样做正确吗?

如果只需更新数值,则无需删除任何内容。

如果需要更改表中的行数,一种方法如图所示。

第二种方法是使用CTable::Rebuilding() 方法。但这样就必须重新设置一些表格属性(标题、列宽等)。