用 MQL 编写的用户界面图库 - 页 58

 

大家好、

鉴于最近的讨论,我建议将 Peter Konow项目 的成果和进展记录在 "代码库 "中,而不是论坛上。论坛非常适合讨论和即时反馈,但它缺乏展示项目全貌和一致政策所需的结构和连贯性。

通过使用 "代码库",我们可以确保所有相关信息条理清晰、易于访问,并提供项目状态的清晰概览。这不仅有助于保持清晰度,还能促进所有团队成员和利益相关者之间更好地合作和理解。

如果您能考虑这一建议,我将不胜感激。

 
Yutaka Okamoto 项目 的成果和进展记录在 Codebase 中,而不是论坛上。论坛非常适合讨论和即时反馈,但它缺乏展示项目全貌和一致政策所需的结构和连贯性。

通过使用 "代码库",我们可以确保所有相关信息井井有条、易于访问,并清晰地展示项目的状态。这不仅有助于保持清晰度,还能促进所有团队成员和利益相关者之间的合作与理解。

如果您能考虑这一建议,我将不胜感激。

这是一个非常合理的建议,谢谢。毫无疑问,代码库便于发布更新和与用户交流。这对项目的发展是一个很好的补充。虽然我过去几乎没有使用过代码库,但现在我看到了探索条款和条件并适应要求的实际意义。为了了解这个平台的可能性和局限性,我将寻找社区知名成员的项目。以他们为榜样,我将能够以一种翔实和称职的方式在代码库中开展项目。

 

我计划今天发布新版本。

不过,我决定听从论坛一位成员的有益建议,在代码库中发布新版本。为了做好这项工作,我需要几天时间来研究类似的发布示例,制定在论坛和其他地方并行运行项目的计划。此外,我还需要通过审核。

关于此版本的几点说明

1.构思并实现了用户程序与其图形界面 之间的程序交互系统。

更多细节:

  • 在进行技术测试并分析结果后,决定使用元素封装函数 而不是抽象全局属性。事实证明,这是将算法与图形环境进行程序耦合的最有效、最简单的变体。
  • 我们对项目保存和打印UIDATA.mqh 和 API.mqh 文件的功能进行了添加,以便在保存项目时,界面上的每个交互式元素都能自动接收一个封装函数。
  • 同时,元素包装函数的主体非常小,其主要任务是调用中心函数,传递三个主要参数--元素编号属性 值。
  • 函数的外部简洁性并不妨碍其应用的多样性:

1.当使用空括号调用时,函数返回元素参数值的三种类型之一: int、double、string 取决于元素的类型。

     int i    = w6_i_CHECKBOX_Some_checkbox(); //Элемент чекбокс. Буква i  после префикса означает что тип возвращаемого/устанавливаемого значения int.
     
     double d = w6_d_S_EDIT_Spin_the_value();  //Элемент поле ввода с кнопками. Буква d после префикса означает что тип возвращаемого/устанавливаемого значения double.

     string s = w7_s_EDIT_Comment_1();         //Элемент текстовое поле ввода. Буква s означает что тип возвращаемого/устанавливаемого значения string.

2 当调用时括号内有一个值,函数会将传递的值设置为元素参数,然后重新绘制(根据元素类型,值被设置为intdouble字符串)。

     int i    = w6_i_CHECKBOX_Some_checkbox(0/1/2/3); //Элемент чекбокс. Передача нуля,единицы, двойки или тройки для смены между нейтральным, активированным, нетр.блокир. и актив. блокир. состояниями элемента. 
                                                      //Тот же метод работает для всех кнопок.
     
     double d = w6_d_S_EDIT_Spin_the_value(653.89);   //Элемент поле ввода с кнопками. Передача значения параметра в функцию для установки его в элемент.

     string s = w7_s_EDIT_Comment_1("Any text");      //Элемент текстовое поле ввода. Передача текста для установки в поле ввода.   


3. 当调用第一个参数的默认值和一个属性号(从可用属性中选择)时,函数将返回元素该属性的值(所有属性号都是int 类型,在属性参数 中传递)。

      int i = w6_i_BUTTON_Start(get_i,_A_COLOR); //Элемент Кнопка. Возврат значения цвета из свойства _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                  //Однако, данных тип функции принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).
                                                                  //Значение первого параметра get_i говорит функции что не нужно принимать значение первого параметра в расчет, а лишь вернуть значение свойства _A_COLOR.


4 . 4.当调用value括号属性值时,函数会将传递的值设置为元素的可用属性。 属性编号在 属性 参数中传递 属性参数中传递

     int i = w6_i_BUTTON_Start(C'255,0,0',_A_COLOR); //Элемент Кнопка. Передача и установка польз. значения цвета в свойство _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                      //Однако, тип функции этого элемента принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).


函数包装器名称的结构: w6_i_BUTTON_Start();

1.w所有 封装函数的首字母。它是window 的缩写。

6(或其他数字)--包含元素的窗口的序列号。

3. i(d 或 s)- 表示元素参数返回值/设置值的类型。

  • 可以是int用于按钮、复选框、滑块、带/不带按钮的输入框、进度条、图表条、单选按钮
  • 可以是双 用于滑块、带/不带按钮的输入框。
  • 可以是字符串 用于文本输入框、VALUE 元素、表格单元格、弹出列表


BUTTON- 包装函数所属元素类型的名称。它可以是任何其他元素。

Start - 特定 元素的名称


  • 所有封装函数都具有相同的名称结构。
  • 重复一遍: 所有函数都是自动打印

//----------------------------------------------------------------------------------------------------

intellisense 系统的智能应用:

我们决定使用一个特殊的前缀系统来帮助快速搜索和查找必要的函数--窗口和元素的包装器。下面就是一个例子:

所有窗口和元素包装函数都以字母w 开头。但是,如果在 w 后面加上一个下破折号:_,就会打开 一个intellisense 窗口,其中列出了所有 UI 窗口函数的名称接下来,您需要在列表中找到带有您要查找的名称的窗口,查看其编号(编号印在函数名称中),然后擦除破折号并将该编号放在 w 后面。带有窗口中元素函数名称的 intellisense 列表就会立即出现。具体操作如下

这是快速浏览元素封装函数列表的简单方法你甚至不需要打印它们。

//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------

此外,还对 API 文件进行了修改和添加。现在,用户可以获得更多有关元素和窗口的信息:

 switch(Element)
   {
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      BUTTON
//NAME:         Start
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_BUTTON_Start(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Start:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:  Alert("BUTTON Start pressed!");   break;
  
                case released:  Alert("BUTTON Start released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set an option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_an_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_an_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_an_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_an_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set another option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_another_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_another_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_another_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_another_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      D_LIST
//NAME:         D_LIST 1
//PARAMETER:    string
//INIT OPTION:  L_ITEM  1
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   string w6_s_D_LIST_D_LIST_1(string value = get_s, int Property = 0)      | PFX: w6
//=====================================================================================================================
 
希望能尽快尝试这些功能。
 
hini #:
我希望能尽快试用这些功能。
我将在明天晚上把新版本上传到 codobase。
 
深夜发布。
 

我介绍了一个与图形用户界面 进行编程交互的引擎版本。

我已经做了很多。有一些东西需要讲述和展示。

公开测试后,我将把它上传到代码库。

一个有趣的事情出现了...

明天会有更多细节。

附加的文件:
4uh38_06.08.24.zip  1712 kb
 

我可以说,我已经为用户找到了一个非常方便的解决方案。在代码中,他们可以轻松浏览窗口、元素和属性,无需记住元素或属性的名称,就能轻松找到并使用它们。同时,每个元素都有一个获取/设置属性列表,只有该元素和 "相关 "元素才能使用。在元素的函数名称中嵌入前缀后,用户在调用时就不会再犯试图返回或设置元素不具备的属性的错误。

包装函数的用途如此广泛且易于使用,让我自己都感到惊讶。当括号为空时,返回参数值;当参数值为一时,设置参数值;当第一个参数为空且属性索引在第二个参数中时,从列表中返回属性值。当第一个参数中有一个值且第二个参数中有一个属性索引时,它们会设置一个属性值。成功时返回结果通知 1,错误时返回结果通知-1(值或属性无效)。函数本身会重绘元素。您不需要处理这个问题。

使用封装函数可以做什么

1.获取元素参数的值。

2.设置元素参数的值

3.从属于元素类型的单个属性列表中获取元素属性值(用函数名中的前缀调用)。

4.4. 从同一列表中设置元素属性值。

5.5. 设置元素的状态:中性、激活、(开/关)、阻塞中性、阻塞激活。

6.返回元素的当前状态。


在第一种情况下,函数返回参数值。

第二种情况是返回结果:成功或错误。错误会输出到日志中。

第三种情况是返回属性值。

第四种情况 - 返回结果:设置属性成功或错误。

第五种情况,返回 1 或-1。

第六种情况是返回元素的状态索引(详情如下)。


所有操作都由一个包装函数完成,该函数会自动打印出来。要找到它,请键入 w_,intellisense 列表将打开,其中包含窗口名称。您要查找的元素就在其中一个窗口中。您需要大致记住它在哪个窗口中。然后,擦除魔鬼,键入窗口编号,并从项目列表中选择所需的窗口。无需记忆。

您也不需要记住元素的属性。查看功能名称,查看前缀,打开单个属性列表。输入,打开,选择属性。你根本不需要记住任何东西。也无需输入。Intellisense 提供了一切。

Windows 也有自己的封装器。它们可以打开和关闭。其余功能尚未实现。


对 API 文件进行了重大升级。现在它包含了大量更有用的元素信息。即:前缀、单个属性、元素包装函数 及其窗口的原型、元素 确切位置(元素所属的表格、画布和选项卡(如有))、参数类型(int、double、string...)、参数属性(min.value、max.value、step、小数点后的位数)。初始值或所选选项(取决于元素)。一切都设计得相当易读易懂。

我已经对新功能进行了部分测试,并对其表示满意。一切都按预期运行。

明天我将实际演示一下。

 
目录仍然是俄语的……希望可以像KIB PROJECTS 一样,目录和文件名是英文的……这是我的一个小小请求
 
#include<(2) KIB PROJECTS\(6) DEMO PROJECTS\Demo project 1.mqh>

在 (1) KIB-source v1 中包含了 Demo project 1,但是在图表上为什么没有看到相关的窗口呢