文章 "自定义图形控件。第 3 部分 表单"

 

新文章 自定义图形控件。第 3 部分 表单已发布:

专门讲解图形控件的有三篇文章,此为最后一篇。其中涵盖主要图形界面组件的创建 - 表单 - 及其同其它控件的搭配使用。除表单类之外,CFrame、CButton、CLabel 类亦已添加到此控件库。

图 5. “EA 交易”函数与表单类方法间的相互作用 

作者:Dmitry Fedoseev

 

迪米特里,这是一部有用的好作品。关于第四部分,我有个建议:"你觉得怎么样?

 

尊敬的迪米特里你做得很好。

请接受对v4 类下一版本的一些批评。

1. 基本项目的抽象性不够。您的每个控件都是一个独立的单元。因此,您无法将它们组合成一个数组。

2.现在,元素的每个类基本上都有自己独特的功能。这不是一件好事。应该有一个共同的祖先,其函数只需在后代中覆盖即可。尤其是当前的类中有这么多同名函数,有什么理由不创建一个共同的祖先呢?

3. 如果出现了基类,就有可能将事件处理隐藏在子类中,而不是全部放在窗体外面。


但总的来说,这篇文章的三个部分都值得称赞,尤其是我喜欢按下按钮时的 "轻推",以及根据元素的状态对按下按钮做出的交互式响应。

PS.
关于多级菜单,你还是写完吧,没必要单独写一篇文章,这么小的任务写一篇新文章太肥了。就让它成为 v4 版本的升级吧。
CTreeCtrl 树类可以从文章https://www.mql5.com/zh/articles/272 或 MT 工具包中提供的 CTreeNode 中获取。

Трассировка, отладка и структурный анализ кода
Трассировка, отладка и структурный анализ кода
  • 2011.03.16
  • o_O
  • www.mql5.com
Весь комплекс задач создания структуры работающего кода и его трассировки можно решить без особых сложностей. Эта возможность появилась в MetaTrader 5 благодаря новому свойству языка MQL5 - автоматическое создание переменных сложного типа данных (структуры и классы) и их уничтожение при выходе из локальной области видимости. В статье описана методика и предоставлен готовый инструмент.
 
Lizar:

迪米特里,这是一部有用的好作品。关于第四部分,我有个建议:"你怎么看?

我个人对此持肯定态度。可视化只是简化了对象的放置。如果操作得当,还需要为创建的对象绑定代码生成、将变量或类绑定到对象上。最重要的是事件处理

但在这些非抽象类中却无法做到这一点。它们是非常手工的。很多地方都需要编写新创建的对象及其处理程序。
例如,对于事件而言,系统和用户之间并没有这样的划分--比如 Draw(基本系统)和 OnDraw--用户通过自己的绘图来添加。

在其他结构中(例如 Joomla!),不仅有一个自定义函数 OnDraw。它还分为两个--BeforDraw 和 AfterDraw。也就是说,程序员可以在系统绘图开始前和结束后处理系统事件 EVENT_DRAW。

 
sergeev:

尊敬的迪米特里你做得很好。

请接受对v4 类下一版本的一些批评。

1. 基本项目的抽象性不够。您的每个控件都是一个独立的单元。因此,您无法将它们组合成一个数组。

2.现在,元素的每个类基本上都有自己独特的功能。这不是一件好事。应该有一个共同的祖先,其函数只需在后代中覆盖即可。尤其是当前的类中有这么多同名函数,有什么理由不创建一个共同的祖先呢?

3. 如果出现了基类,就有可能将事件处理隐藏在子类中,而不是全部放在窗体外面。


但总的来说,这篇文章的三个部分都值得表扬,尤其是我喜欢按下按钮时的 "轻推",以及根据元素的状态对按下按钮做出的交互式响应。

PS.
4.多级菜单你还是写完了,没必要单独写一篇文章,这么小的任务写一篇新文章太肥了。
CTreeCtrl 树类可以从 MT 工具包中提供的文章https://www.mql5.com/zh/articles/272 或 CTreeNode 中获取。

1- 您可以将单一类型的控件集合到一个数组中。为什么要将不同类型的控件集合到一个数组中?

2.如果您使用一个基类(所有控件都使用一个基类),这意味着该基类必须拥有所有子类可以拥有的方法。如果使用独立类,在方法的下拉列表中(在开发过程中),我们只有类中实际存在的方法。在我看来,这是非常重要的一点。我可以想象有人坐在那里,试图调用垂直滚动条的 SetWidth() 方法。

第二个论点--所有类都有 doxygen 注释,如果有基类和子类,文档中就不会有那么明显的结构。

我尝试制作现成的解决方案,以便 "闭着眼睛 "也能使用。为了加快创建新控件的过程,可以使用包含所有必用方法的模板。

3.我不太明白。如果一个控件中包含另一个控件,那么它的事件处理就会被隐藏。无论如何,您都必须为每个控件调用 Event()。

4.我不知道,也许...我自己有一个专门为创建菜单而设计的类,不需要调用 AddNode(),而是调用 AddItem(),级别由项目名称开头的空格数决定。创建树形菜单的过程非常清晰。到目前为止,它可以在注释和按键控件中显示。一般来说,可以制作几种树形菜单:1)带下拉选项卡的常规主菜单;2)显示一个选项卡的项目和通向顶部的路径;3)带树形显示(如 Windos Explorer)。

 
sergeev:

1. 就我个人而言,我认为这是积极的。可视化只是简化了对象的放置。如果操作得当,还需要为创建的对象绑定代码生成,将变量或类绑定到对象上。最重要的是,还要处理事件

2.但在这些非抽象类中却无法做到这一点。它们是非常手工的。
例如,对于事件来说,就没有系统和用户之分--如 Draw(基本系统)和 OnDraw--用户添加自己的绘图。

在其他结构中(例如 Joomla!),不仅有一个自定义函数 OnDraw。它分为两个 - BeforDraw 和 AfterDraw。也就是说,程序员可以在系统绘图开始前和结束后处理系统事件 EVENT_DRAW。


1.可以自动生成处理控件事件的代码,并获取所有控件的事件函数,如 HScrollBar1_OnChange()....。

2.目前还没有任何事件,例如,当通过编程设置值时,只有当用户输入值时才会产生事件。这是最起码的要求,没有额外的要求。否则,自学编程的人就会被事件淹没。

 
Lizar:

迪米特里,这是一部有用的好作品。关于第四部分,我有一个建议:"你怎么看?

肯定的。我已经想好了如何不费吹灰之力就完成它。只是近期我要放假,如果罗什不介意的话,假期结束后就有可能了。
 
Lizar:

...有一个关于第四部分的建议"表单向导 "或 "可视化表单编辑器",你觉得怎么样?

"在我们面前,一切都已被偷走"(Y 行动)。
 
Integer:

1. 单一类型的控件可以组合成一个阵列。为什么要将不同类型的控件集合到一个数组中?

将所有控件集中到一个循环中,并在事件服务中删除特定类型的控件。

2.2. 如果使用基类(所有控件都使用一个基类),则意味着该基类必须拥有所有子类可以拥有的方法。如果使用独立类,在方法的下拉列表中(在开发过程中),我们只有类中实际存在的方法。在我看来,这是非常重要的一点。我可以想象,有人坐在那里试图调用垂直滚动条的 SetWidth() 方法。

基类中的所有函数都是空洞的拦路虎,一般功能微乎其微。即使有人在不知情的情况下调用了某个元素的无关函数,也绝对不会发生任何不好的事情。这就是 OOP 的力量。多态性

第二个论点--所有的类都会在 doxygen 中进行注释,如果存在基类和子类,文档中就不会有如此明显的结构。

会有的,只是会有所不同......:)

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
sergeev:

1. 将所有内容都纳入一个循环,并摆脱事件服务中的特定类型。

基类中的所有函数都是空的,只具有最基本的一般功能。即使有人在不知情的情况下调用了某个元素的无关函数,也绝对不会发生任何坏事。这就是 OOP 的威力。然而,多态性

3. 会的。只是会有所不同....。:)

1 就这些?为了这一点,要不要搞搞第 2 点--方法转储?

替代方案:

1) 需要为每个类手动添加一个 Event() 调用(包括用鼠标复制一行并在点的左边修改几个字母),同时,在每个类的方法列表中,我们只有与该类相对应的工作方法,点击点,列表弹出,一切都清楚了。

2) 自动处理所有类的 Event(),但仍需要从 OnChartEvent() 中调用一个函数,另一方面:在列表中转储方法。此外,你还必须在 deinit 时销毁指针。

再深入研究一下,为什么要在一个循环中处理所有的 Event(),每个控件都应该有自己的事件()操作,控件不仅仅是用来输入值的,不仅仅是用来让所有东西在屏幕上移动和闪烁的,而且(在主要程度上)还要在程序中使用输入的值。

3.您需要在文档的一个地方阅读一个控件的一半方法,而在另一个地方阅读另一半方法。

 
Integer:

1 就这样?就为了这一点,搞乱第 2 点--倾销方法?

替代方案:

1) 需要为每个类手动添加一个 Event() 调用(包括用鼠标复制一行,并在点的左侧更改几个字母),同时,在每个类的方法列表中,我们只有与该类相对应的工作方法。

2) 自动处理所有类的 Event(),但仍需要从 OnChartEvent() 中调用一个函数,另一方面:在列表中转储方法。此外,我们还需要在 deinit 中销毁指针。

再深入研究一下,为什么要在一个循环中处理所有的 Event(),每个控件都应该有自己的事件()操作,控件不仅仅是用来输入值的,不仅仅是用来让屏幕上的所有东西移动和闪烁的,而且(在主要程度上)还要在程序中使用输入的值。

3.您需要在文档的一个地方阅读一个控件的一半方法,而在另一个地方阅读另一半方法。


您所做的一切都是正确的。

考虑到 ME 的各种可能性,在这个完全媚俗的时代,日式极简主义是相当方便的,一切都在那里,没有多余的东西。

那些想要在对象中循环的人可以实现一个后缀外壳,在那里他们可以写任何他们想要的东西。