文章 "图形界面 X: 简单快速开发库的更新 (版本 2)" - 页 2

 
Alexey Oreshkin:

也许我的代码被删除了,现在还不能确定。

...

图形界面 I:准备库结构(第 1 章) >>>

注意上面代码列表中函数前面的双冒号。事实上,不加冒号也能正常工作。但在编程中,在语言的 系统函数 前加双冒号被认为是一种好的做法。这样可以清楚地表明该函数是一个系统函数。

阿列克谢-奥列什金

当我关闭指标创建的带十字的窗口时,就会出现错误。我稍微修改了位于此处的示例中的 MainWindow.mqh 文件:Indicators\Article 10\SeparateWindow

我将通过额外检查排除错误。修复程序将在下次更新中发布。重放失败。在MainWindow.mqh 文件中做了哪些修改?

阿列克谢-奥列什金

我也不知道如何删除已创建表中的一行?

目前没有办法。下一版程序库中会有。以后就可以在表格和列表中添加和删除行了。

 

我一定是删除了一些不必要的东西。我附上了文件。

另外,我能否为表格中的每一列设置不同的宽度?

附加的文件:
 
Alexey Oreshkin:

我一定是删除了一些不必要的东西。我附上了文件。

另外,我能否为表格中的每一列设置不同的宽度?

原因是您在元素库中添加了两次相同表格的对象。首先是在CProgram::CreateTable()表格创建 方法中,应该在这里完成,然后是在您的CProgram::ModifyTable() 方法中。删除下面代码列表中用红色 标出的一行。

//+------------------------------------------------------------------+
//|| 创建符号表|
//+------------------------------------------------------------------+
bool CProgram::ModifyTable(int id)
  {
   int r=1;
   switch(id){
      case  0:         
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL;r++)
            m_table.SetValue(c,r,"rb1 "+(string)c+" "+(string)r);                                  
      break;
      
      case 1:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-5;r++)
            m_table.SetValue(c,r,"rb2 "+(string)c+" "+(string)r);  
      break;
      case 3:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-10;r++)
            m_table.SetValue(c,r,"rb3 "+(string)c+" "+(string)r);                                      
      break;
   }
      for(int c=0;c<COLUMNS2_TOTAL;c++)
      for(int rr=r;rr<ROWS2_TOTAL;rr++) m_table.SetValue(c,rr,"");

//-- 更新表格以显示变化
   m_table.UpdateTable();
//--- 将对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0,m_table);
   return(true);
  }  

//---

从图表中删除方案或重新加载方案时,例如更改时间框架或符号时,会再次尝试删除之前已经删除的项目。删除表格对象时,数组被释放,再次调用删除项目的方法时会出错。

阿列克谢-奥列什金

p.s. 能否为表格中的每一列设置不同的宽度?

在这种类型的表格(CTable)中不行。只有在CCanvasTable 类型的表格中才能设置列宽。但目前这种类型的表格还有很多其他限制,很可能不适合您。CCanvasTable 类型表格的可能性将得到扩展。

 
Anatoli Kazharski:

原因是您在元素库中添加了同一个表对象两次。首先是在CProgram::CreateTable() 方法中,应该在这里添加,然后是在CProgram::ModifyTable() 方法中。删除下面代码列表中用红色 标出的一行。


我试试CCanvasTable,也许能行。
谢谢!

附注:如果不能删除表中的行,我可以删除整个表,然后重新创建我需要的表。我也没有找到任何删除方法。我还不能删除表吗?

p.s2:由于我无法创建不同宽度的表格列,因此将两个表格相邻放置是合乎逻辑的,但据我了解,我无法这样做,因为表格会自动扩展到右边界。有一个AutoXResizeMode 方法,但它还不起作用? 当设置为 false 时,不会发生任何变化。

 
Alexey Oreshkin:

...

附注:如果我不能删除表中的行,我可以删除整个表,然后重新创建我需要的表。我也没有找到任何删除方法。我还不能删除表格?

现在所有图形用户界面 元素都是一次性创建的,然后可以使用Show() 和Hide() 方法控制它们的可见性。

阿列克谢-奥列什金

p.s2: 因为我无法创建不同宽度的表格列,所以将两个表格相邻放置是合乎逻辑的,但我发现我做不到,因为表格会自动扩展到右边界。有一个AutoXResizeMode 方法,但它还不起作用吗? 当设置为 false 时,不会发生任何变化。

使用XSize() 方法设置表格的宽度。

示例

m_table.XSize(300);
 

感谢您的回答。

还有几个问题:

1.如果数据不适合放在表格单元格中,将来是否有计划在该单元格中制作工具提示或勾选器?

2.是否有可能在某些表格中禁用水平滚动?

p.s:

当我们创建一个有 5 列的表格,但试图显示更多列时,就会出现错误。我同意这个选项很傻,但它是必要的。尤其是当表格将来可能成为动态表格时。

附注 2:"显示 "和 "隐藏 "方法工作得非常好,不允许临时更改表格,而是显示必要的表格。在每个标签页上,我都创建了必要的表格,这些表格与单选按钮绑定,当它们被激活时,必要的表格就会显示,而那些不需要的表格就会隐藏。这里一切正常。但出于某种原因,我无法在创建无关表格后立即隐藏它们。我认为这就是滚动条 无法正常工作的原因,但只要点击一下单选按钮,所有不相关的表格都会被隐藏,一切都会开始正常工作。

 
Alexey Oreshkin:

1.如果数据不适合放在表格单元格中,将来是否有计划在该单元格中制作工具提示或提示符?

已添加到未来更新列表中。我将制作表格中的工具提示模式。

阿列克谢-奥列什金

2.能否在某些表格中禁用水平滚动?

当表格的可见部分小于总部分时,会出现滚动条

阿列克谢-奥列什金

当我们创建一个有 5 列的表格并试图显示更多列时,就会出现错误。我同意这个选项很傻,但我们需要检查一下。尤其是当表格将来可能成为动态表格时。

我已经做了更正。将在下一次更新中提供。

阿列克谢-奥列什金

p.s2:"显示 "和 "隐藏 "方法效果很好,不需要临时更改表格,只需显示需要的表格即可。我在每个选项卡上创建了必要的表格,这些表格与单选按钮绑定,激活后,必要的表格就会显示,不激活的表格就会隐藏。这里一切正常。但出于某种原因,我无法在创建无关表格后立即隐藏它们。因此,我认为滚动条无法正常工作,但只要点击一次单选按钮,所有不必要的东西都被隐藏起来,一切就都开始正常工作了。

在更新选项卡元素后再隐藏它们:

//--- 显示活动选项卡的项目
   m_tabs.ShowTabElements();
//--- 隐藏表格
...

如果还不行,请把你的代码发给我,我帮你看看。

 
在启动时,滚动条 几乎不起作用,但如果我使用单选按钮更新滚动条,一切都会正常工作。当切换到新标签页时,也会出现同样的问题,直到我点击单选按钮为止。
,我已将存档发送到 PM。
 
Alexey Oreshkin:

在启动时,滚动条几乎不起作用,但如果我使用单选按钮更新滚动条,一切都会正常工作。当切换到新标签页时,也会出现同样的问题,直到我点击单选按钮。 ,我已将存档发送到 PM。

我查看了您的文件。问题很明显。滚动条 之间存在冲突,滚动条 在可见表格中一个位于另一个之上。问题在于,当您切换选项卡时,分配给当前选定选项卡的所有项目都会变为可见。由于你的所有表格都是一个在另一个上面,所以你没有看到它。请看下面的截图,为了清晰起见,我改变了该选项卡中两个表格的坐标:

//---

我们需要一个事件来告诉我们切换了标签页。然后在自定义类处理程序中接收该事件,并采取必要的操作。在您的例子中,您可以获取所选单选按钮的索引,然后显示与之相关联的表格,并隐藏其他表格。

目前,切换选项卡时不会生成这样的事件。下一次库更新时将会提供。

 
何时等待更新?