文章 "制作仪表板以显示指标和EA中的数据" - 页 2

 
Artyom Trishkin #:

你好

那么

声明了一个指向未来动态创建的类对象的指针变量,并立即以NULL 值初始化。


一个类的简单实例声明如下:

但在这种情况下,你不能以这种方式声明和创建实例--该类没有不带形式参数的构造函数。

因此,在以这种方式声明实例时,必须指定类对象的所有必要参数,这些参数必须传递给类的构造函数:

------------------------

在使用该类的示例中,首先在指示器中创建一个指向未来对象的空指针,然后在 OnInit() 中创建面板对象,并将指向已创建对象的指针写入指针变量:


然后在 OnDeinit() 中通过该指针删除内存中的对象:

如果只是通过new 操作符创建一个新对象,而没有将指向所创建对象的指针写入变量,那么以后就无法删除该对象,从而导致内存泄漏。

因此,简而言之,在文章的示例中

  1. 声明一个指向未来类对象的变量指针,并将其初始化为NULL 值、
  2. 创建一个新的类对象,并将其指针写入之前创建的 dashboard 变量中、
  3. 访问创建的对象时,我们使用指针变量和一个点(dashboard.AnyMethod()
  4. 工作结束后,通过指针删除动态创建的类对象。

如果立即创建了必要的类(CDashboard dashboard)实例,就不需要指向它的指针了--可以使用 "point "操作符以同样的方式访问它。工作完成后也不需要删除它--终端子系统会自行删除。但它将是程序中唯一的类实例。

动态创建可以让您即时创建所需类的新对象,并通过指针来引用它们。这就是例子中使用动态创建类对象的原因。简化,但未涉及某些要点。

感谢您的全面回答!因此,每个对象都有自己的构造函数,在另一种情况下,对象带有类中要求的参数,您可以在任何阶段创建不同的对象!(Nus 变得更清晰了)。

实际上,创建信息面板的兴趣,是 DPI 显示器的结果,在我的例子中是 168。Comment();很小!

我想在考虑到分辨率的情况下创建一个 TerminalInfoInteger(TERMINAL_SCREEN_DPI) ...为了方便起见,我想按颜色组创建。

也许你有这样的解决方案?您的代码很好,可读性强...而我的代码冗长、难以理解,因此我不得不多次重写!谢谢您的支持!

 
Igor Bakhrushen #:

谢谢您的全面回答!因此,每个对象都有自己的构造函数,在另一种情况下,一个对象需要类的参数,在任何阶段,您都可以创建不同的对象!(Nous 说得更清楚了)。

实际上,创建信息面板的兴趣,是 DPI 显示器的结果,在我的例子中是 168。Comment();非常小!

我想在考虑到分辨率的情况下创建一个 TerminalInfoInteger(TERMINAL_SCREEN_DPI) ...为了方便起见,我想按颜色组创建。

也许你有这样的解决方案?您的代码很好,可读性强...而我的代码冗长、难以理解,因此我不得不多次重写!谢谢您的支持!

解决方案就在帮助中的示例中:

交易、自动交易系统和交易策略测试论坛。

用 MQL 编写的用户界面图库

Artyom Trishkin, 2024.05.31 10:33 AM

这里(TERMINAL_SCREEN_DPI):

缩放因子计算示例

//--- создаём кнопку шириной 1.5 дюйма на экране
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // получим DPI монитора пользователя
int base_width = 144;                                      // базовая ширина в экранных точках для стандартных мониторов c DPI=96
int width      = (button_width * screen_dpi) / 96;         // вычислим ширину кнопки для монитора пользователя (с учётом его DPI)
...
 
//--- вычисление коэффициента масштабирования в процентах
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- использование коэффициента масштабирования
width=(base_width * scale_factor) / 100;

以这种方式使用时,图形资源 在不同分辨率的显示器上将具有相同的尺寸。同时,控制元素(按钮、对话窗口等)的大小将与个性化设置一致。


 
不幸的是,我没有 4K 显示器,所以无法检查,出于同样的原因,我还没有将这样的重新计算输入到程序库中--未经检查,随意这样做并不严肃。
 
Artyom Trishkin #:
不幸的是,我没有 4K 显示器,所以无法检查,出于同样的原因,我还没有将这种重新计算输入库中--在没有检查的情况下随意这样做并不严肃。
我明白了...谢谢!我们会慢慢解决的!
 
Artyom Trishkin #:
不幸的是,我没有 4K 显示器,所以无法检查,出于同样的原因,我还没有将这种重新计算输入到库中--未经检查就随意进行重新计算是不严肃的。

Artem 你好!以下是考虑到 dpi.... 的构造但事实上,您可以采用另一种方法。比方说,您设定了页眉的大小,然后根据页眉的大小计算面板大小、行高和文本高度。您可以指定两个参数...以及 dpi 是多少。还是有什么问题?我不太确定,您对这个解决方案有什么看法?

附加的文件:
 
Artyom Trishkin #:
不幸的是,我没有 4K 显示器,所以无法检查,出于同样的原因,我还没有将这种重新计算输入到库中--未经检查就随意进行重新计算是不严肃的。

Artem 你好!以下是考虑到 dpi.... 的构造但事实上,您可以采用另一种方法。比方说,您设定了页眉的大小,然后根据页眉的大小计算面板大小、行高和文本高度。您可以指定两个参数...以及 dpi 是多少。还是有什么问题?我不太确定,您对这个解决方案有什么看法?

 
Igor Bakhrushen #:

Artem 你好!这里有一个基于 dpi 的构建.....。但基本上您可以采用另一种方法。比如说,你设置了页眉的大小,然后根据页眉的大小计算面板的行高和文本高度。您可以指定两个参数...以及 dpi 是多少。还是有什么问题?我不太确定,你对这个解决方案有什么看法?

一切都要经过测试没有显示器我做不了。所以很遗憾,我无话可说。
 
很好,谢谢你的代码。)
 

关于面板的想法不错。但我注意到,当从另一个图表切换到面板时,面板会自动降到图表底部。例如


 
Denis Kirichenko #:

关于面板的想法不错。但我注意到,当从另一个图表切换到面板时,面板会自动降到图表底部。例如

嗯,有趣的现象。我得在空闲时研究一下。最有可能的原因是调整了非活动图表的大小。