文章 "图形界面 X: 在多行文本框中选择文本 (集成构建 13)" - 页 8

 
Konstantin:

对了,有个问题:

突出显示的字符串无法在测试器中运行。

我还没有在测试器中测试过,因为之前有很多限制。目前暂时如此。

您是否已尝试在测试器中测试图形用户界面?结果如何?事件是否有效?是否显示了所有图形对象?

 
Anatoli Kazharski:

我还没有在测试器中测试过,因为之前有很多限制。所以现在暂时是这样的。

您是否已经尝试过在测试器中测试图形用户界面?结果如何?事件是否有效?是否显示了所有图形对象?


是的,所有对象都显示了,但在测试器中,图表上的鼠标事件不起作用,但整个界面是活的,事实上以前也是这样。

总的来说,我可能会暂时放弃内置计时器,以免编辑库 ))

 

我不知道如何使表单在 X 上以一定大小创建,并与图表的右边界绑定,即当改变 X 上图表的大小时,表单不会改变大小,而是向右/向左移动而不改变其大小。

可以选择覆盖CWndEvents 类中 的 ChartEventChartChange 方法,该方法位于私有部分,也许将方法移动到私有部分是有意义的:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

移动到受保护部分,但同样,私有部分的方法也会在这里使用?总之,如果有人遇到过这样的问题,请提出解决方案

 
Konstantin:

我不知道如何使表单在 X 上以一定大小创建,并与图表的右边界绑定,即当改变 X 上图表的大小时,表单不会改变大小,而是向右/向左移动而不改变其大小。

可以选择覆盖CWndEvents 类中 的 ChartEventChartChange 方法,该方法位于私有部分,也许将方法移动到私有部分是有意义的:

移动到受保护部分,但同样,私有部分的方法也会在这里使用?总之,如果有人遇到过这样的问题,请提出解决方案

大约是这样的

//+------------------------------------------------------------------+
//|| 为控件创建表单
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- 将窗口指针添加到窗口数组中
   CWndContainer::AddWindow(m_window);
//--- 尺寸
   int x_size =200;
   int y_size =200;
//--- 坐标
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- 属性
...
//--- 创建表格
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

在 MQL 应用程序用户类的事件处理程序中,处理CHARTEVENT_CHART_CHANGE 事件时:

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

结果:

//---

还可以添加图表窗口大小(宽度)是否发生变化的检查,因为CHARTEVENT_CHART_CHANGE 事件会在不同情况下生成。例如,滚动图表时。

 
Anatoli Kazharski:

它是这样的

//---

在处理CHARTEVENT_CHART_CHANGE 事件时,在自定义 MQL 应用程序类的事件处理程序中:

//---

结果:

//---

还可以添加图表窗口大小(宽度)是否发生变化的检查,因为CHARTEVENT_CHART_CHANGE 事件会在不同情况下生成。例如,滚动图表时。


哎呀,成功了 ))
 

如果创建表格 时设置了SelectableRow(false),如何在表格中获取点击鼠标左键所在行的索引?在OnEvent 中解析sparam 参数看起来并不优雅。当然也可以使用SelectableRow(true),然后使用SelectedItem(),但任务是不选择表中的行。

 
Konstantin:

如果创建表格时设置了SelectableRow(false),如何在表格中获取点击鼠标左键所在行的索引?在OnEvent 中解析sparam 参数看起来并不优雅。当然,我们可以使用SelectableRow(true),然后使用SelectedItem(),但任务是不选择表中的行。

目前只能这样做,但我会添加这一功能。
 
如何区分在表格中选择一行的事件和在组合框中选择一项的事件? 从代码中可以看出,它们使用相同的ON_CLICK_LIST_ITEM 事件。
 
Konstantin:
如何区分在表格中选择一行的事件和在组合框中选择一项的事件? 从代码中可以看出,它们使用相同的ON_CLICK_LIST_ITEM 事件。
为什么会这样?究竟是什么阻碍了您这样做?
 

我在表单中显示一个表格,在表格中选择一行,在组合框中选择一个值,表格行中的 数据和组合框中的值应写入一个单独的实体。现在,这些事件没有分隔,因此有必要制作能完成任务的拐杖:


也许您能提出其他机制?

基本上,表格是一个股票对数组,组合框包含信号类型,单独的实体是信号数组的对象。对象本身并不是一个单独的字段,而是复杂的自定义数据类型,表中的一对代号和一种信号类型被记录在对象中,然后进行另一种处理。