文章 "图形界面 X: 时间控件, 复选框列表控件和表格排序 (集成编译 6)" - 页 3

 
Artyom Trishkin:

我指的是网站上的文章--也许旧的那篇文章被添加到了更新中。我从最新更新中提取了文件,从文章底部的网站下载了压缩包。

在这里,按照我上面写的进行了更正:

很好。或者你可能有什么东西钉在那里,因为它已经发生了很多次。如果有的话,我会记住的。
 
Anatoli Kazharski:
哦,很好。否则你可能会有东西钉在那里,这种情况已经发生过很多次了。但我会记住的。

你在逼我做傻事。


很小,但你能看到。

你可以自己装上,然后看看里面--这很容易,尤其是有人告诉过你。

 
Artyom Trishkin:

你在逼我做傻事

它很小,但你能看到。

你可以自己下载下来,然后看里面的内容,这很简单,更何况有人告诉过你。

我又没问你要证据我只是说我会记住它。但我还没复制呢我会记住的

如果有问题,你的解决方案不一定适用于所有情况。它对你的情况有效,但你需要测试所有模式。如果发现问题,我会自己动手的。

真的,不要乱来。)

 
Anatoli Kazharski:

我没有要求你提供任何证据。我只是说我会记住它。但我还没复制出来呢我会记住的

如果有问题,你的解决方案不一定对所有情况都有效。它对你的情况有效,但你需要测试所有模式。如果发现问题,我会自己动手的。

真的,不要乱来。)

好吧,我不会的;)

Tol,问题:表格按列排序--一切正常。但是......,如果表格有空行,而且有很多空行,那么排序也包括这些空行。事实证明,假设有一个表格有一千行(1001 - 表头为零)- 根据市场概述中的最大字符数。但目前市场概况中只有 10 个字符。它们都在表格的前十行--从第一行到第十行。其余的行都是空的(表格不是动态的,可以在表格中添加/删除符号)。如果尝试对这样的表格进行排序,排序后的列表会到达表格的最末端--第 990 - 1000 行(零--表头),并且可以看到顶部的空行。这并不好,而且我认为这是一个疏漏。

 
Artyom Trishkin:

...表格不是动态的,可以在表格中添加/删除字符...

它们很快就会是动态的。我正在努力。
 
Anatoli Kazharski:
即将充满活力。我现在就在中间。
好极了!排序列表中包含完全空白行的问题是什么?怎么解决?
 
Artyom Trishkin:
...在排序列表中包含完全为空的行有什么问题吗?怎么办?
暂时保持原样。我不会在短期内恢复排序。
 
Anatoli Kazharski:
暂时就这样吧。我很快就不会再分类了
好吧,我确实有一套分类系统 来满足特定的需求有一天你可以调整一下
 
Anatoli Kazharski:
...

ContextMenu.mqh 中上下文菜单 中的分隔线也是如此--菜单项之间的分隔条不在其坐标上。

在该方法中:

//+------------------------------------------------------------------+
//| 创建分界线|
//+------------------------------------------------------------------+
bool CContextMenu::CreateSeparateLine(const int line_number,const int x,const int y)
  {
//--- 保存表单指针
   m_sep_line[line_number].WindowPointer(m_wnd);
//--- 设置属性
   m_sep_line[line_number].TypeSepLine(H_SEP_LINE);
   m_sep_line[line_number].DarkColor(m_sepline_dark_color);
   m_sep_line[line_number].LightColor(m_sepline_light_color);
   m_sep_line[line_number].AnchorRightWindowSide(m_anchor_right_window_side);
   m_sep_line[line_number].AnchorBottomWindowSide(m_anchor_bottom_window_side);
//--- 创建一条分界线
   if(!m_sep_line[line_number].CreateSeparateLine(m_chart_id,m_subwin,line_number,x,y,m_x_size-10,2))
      return(false);
//-- 保存对象指针
   CElement::AddToArray(m_sep_line[line_number].Object(0));
   return(true);
  }
//+------------------------------------------------------------------+

替换为

//+------------------------------------------------------------------+
//| 创建分界线|
//+------------------------------------------------------------------+
bool CContextMenu::CreateSeparateLine(const int line_number,const int x,const int y)
  {
//--- 保存表单指针
   m_sep_line[line_number].WindowPointer(m_wnd);
//--- 设置属性
   m_sep_line[line_number].TypeSepLine(H_SEP_LINE);
   m_sep_line[line_number].DarkColor(m_sepline_dark_color);
   m_sep_line[line_number].LightColor(m_sepline_light_color);
   m_sep_line[line_number].AnchorRightWindowSide(m_anchor_right_window_side);
   m_sep_line[line_number].AnchorBottomWindowSide(m_anchor_bottom_window_side);
//--- 创建一条分界线
   if(!m_sep_line[line_number].CreateSeparateLine(m_chart_id,m_subwin,line_number,x-m_wnd.X(),y-m_wnd.Y(),m_x_size-10,2))
      return(false);
//-- 保存对象指针
   CElement::AddToArray(m_sep_line[line_number].Object(0));
   return(true);
  }
//+------------------------------------------------------------------+

分隔线就在其位置上了。

 
Artyom Trishkin:

ContextMenu.mqh 中上下文菜单的分隔线也是如此,菜单项之间的分隔线不在其坐标上。

我已复制了所有此类情况。这适用于所有用作其他项目组件的项目。在创建图形用户界面 时,如果窗体的初始绝对坐标大于 (1,1),就会检测到这种情况。

修复方法将在下一个版本中提供。作为临时快速修复方法,(1) 您的示例或 (2) 将窗体的初始坐标设置为 (1,1) 均可奏效。第二种方法更好,因为它可能会加入其他元素定位模式。