文章 "图形界面 I: 用于表单按钮的函数与删除界面元素 (第四章)"

 

新文章 图形界面 I: 用于表单按钮的函数与删除界面元素 (第四章)已发布:

在本文中, 我们将继续开发CWindow类, 增加它的类方法, 可以通过点击它的控件来对它进行管理. 我们将可以通过表单按钮来关闭程序, 也会实现表单的最小化和最大化功能.

如果您按照本文中推荐的那样, 跟随了一系列操作并到达了这一点, 您将会看到, 当EA交易被从图表上删除后, 图形界面的对象也会被删除. 我们还没有讨论过从图表上删除图形对象的方法. 为什么当EA交易被删除后, 这些对象也要删除?这是在标准库中包含的, 更加明确一点, 在CChartObject类的析构函数中, 我们的界面库中有它的派生类. 当程序被从图表上删除时, 将会调用各个类的析构函数, 也包含了这个类. 如果一个对象附加到图表, 它就被删除:

//+------------------------------------------------------------------+
//| 析构函数                                                       |
//+------------------------------------------------------------------+
CChartObject::~CChartObject(void)
  {
   if(m_chart_id!=-1)
      ::ObjectDelete(m_chart_id,m_name);
  }

如果图表的交易品种或者时段修改了, 析构函数就不会被调用, 图形界面也不会被删除. 因为图形界面是在主程序文件中的OnInit() 初始化函数中进行的, 而在改变交易品种或者EA交易的时段时会进行去初始化然后再初始化, 图形界面会在已有基础上再创建一个. 结果, 这样就有了两份复制的对象. 如果您继续改变图表交易品种或者时段, 您就会有很多份界面对象的拷贝.

图 4. 当切换图表交易品种和时段时的表单测试.

图 4. 当切换图标交易品种和时段时的表单测试

我们必须在我们开发的函数库中解决这个问题, 也就是说我们必须确认在程序去初始化时, 所有的图形对象都被删除. 另外, 所有包含这些对象指针的数组也要被清空, 它们在维度上的大小要清零. 在做完这些之后, 在初始化的时候, 对象的设置就会是正确的了, 而不是克隆出来. 现在, 我们将实现这种机制.

作者:Anatoli Kazharski