Галерея UI написанных на MQL - страница 59

 

Была поставлена задача реализовать программное взаимодействие пользовательского кода с графическим интерфейсом программы.

По задумке:

  • После написания и отладки KIB-кода, пользователь получает желаемый результат (в виде готовых окон) и сохраняет проект.
  •  В итоге генерации возникают два файла: технический UIDATA.mqh и "API.mqh". Первый необходим для загрузки и работы интерфейса, второй - для фиксации событий элементов. 
  • Пользователь переносит оба файла из папки Files в свой проект (на данный момент: KIB PROJECTS\(5) USER PROJECTS\Project 1).
  • Компилирует свой советник или индикатор со строками подключающими движок и оба файла: 
//+------------------------------------------------------------------+
#include<(1) KIB 1.0\(4) CONNECTIONS\KIB-DRIVE CONNECTIONS.mqh>
//--------------------------------------------------------------------
#include<(2) KIB PROJECTS\(5) USER PROJECTS\Project 1\UIDATA.mqh>
//--------------------------------------------------------------------
#include<(2) KIB PROJECTS\(5) USER PROJECTS\Project 1\API.mqh> 
//+------------------------------------------------------------------+
  • Закидывает советник на график и видит интерфейс.
В демо-проекте в качестве примера используется советник EA Shell v1.mq5, который "изображает" пользовательскую программу. Он имеет идентичные подлючения, которые необходимы пользовательскому аналогу.  

 

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

Однако, до этого релиза, пользователь мог лишь получать события интерактивных элементов в подлюченный API файл.

Важно подчеркнуть: у пользователя не было многих, абсолютно необходимых программных возможностей.

Перечислю:

  • Программно открывать/закрывать окна графического интерфейса.
  • Получать/ставить значения в параметр разных типов элементов.
  • Программно переключать состояния элементов: например включать/отключать, запирать/отпирать элементы при действиях пользователя, или на внешних событиях фиксируемых запущенным советником/индикатором.
  • Программно получать/устанавливать иные значения свойств элементов: цвет основания, текста, рамки. Менять иконку. 


В этом обновлении решены почти все поставленные задачи.

Перечислю: 

  • Пользователь может программным вызовом открывать/закрывать окна графического интерфейса.
  • Может получать/ставить значения в параметр элементов которые его имеют. В том числе неинтерактивных элементов, как ячейки таблиц (CELL) и текстовые метки с параметром (VALUE). 
  • Реализовано программное переключение между двумя, и четыремя состояниями разных типов элементов. Для кнопок и чекбоксов доступны четыре состояния программного переключения (on/off/locked on/locked off), для остальных элементов - два (locked/unlocked).  
  • Для программного возврата/установки значений сделаны доступными небольшие наборы индивидуальных свойств элементов. Каждый набор представлен префиксом из открывается списком интеллисенс. Он обобщает небольшую, родственную группу элементов имеющих похожие свойства. Подобный подход исключает путаницу во множестве свойств разнообразных типов элементов.
  • Программная установка значения в параметр посылает событие в место элемента в файле API, где пользователь может прописать дополнительный код его обработки.
  • Ячейки таблиц именуются автоматически складыванием названия своего ряда и колонки. Они получают имя и функциональную обертку в файле UIDATA.mqh. Однако, в файле API они отсутствуют, потому что не являются интерактивными элементами. Их можно найти в списке элементов окна и в остальном они реагируют на программное управление как все элементы.


Благодаря возможностям программного управления реализуются недоступные ранее вещи:

1. Рассылка значений. Получение значения одного элемента и пересылка в другие элементы в том же, или другом окне.

2. Программное открытие окон предупреждений и диалога. Например, в ситуации когда необходимо вывести срочное сообщение или рекомендацию пользователю.

3. Получение общей картины настроек и статуса исполнения через запросы параметров элементов. Можно использовать как дополнение к анализу других программных параметров.

4. Динамичная переустановка настроек программы не прерывающая процесс работы.

5. Благодаря возможностям изменения цветов оснований, текста и рамок (рамок пока нет), интерфейс становится более интерактивным и информативным. Например, при перемотке значения и попадания его в зону риска, в поле ввода с кнопками может сигнализировать пользователю об опасности красным цветом своего основания или текста. Теперь это легко реализовать. Тоже самое касается полосы слайдера. В зоне опасных значений, можно программно менять цвет полосы. Получается интерактивно, информативно и практично.


На данный момент я не до конца осознал все грядущие возможности и уверен, многое впереди.


Далее, перейдем к практической части разбора новой версии.

 


 

Как оказалось, практическая часть разбора достаточно обширна и ее охват потребует время. Подробно и доступно, с комментариями, картинками и гифами, расскажу и покажу новые возможности. Возможно, придется разделить подачу материала на два дня - сегодня и завтра. Ничего страшного, понимание от этого улучшиться. Отдохнуть тоже нужно.


План разбора функциональных возможностей новой версии движка:

1. Напомню, что новые папки и файлы нужно установить в МЕ после полного стирания предыдущих. Замену делать не нужно.

2. Для работы нам потребуются открыть файлы (1) EA Shell v1.mq5 и API.mqh. Остальные файлы открывать нет необходимости. Будем использовать прежний интерфейс и знакомые окна из Demo project 1.mqh. Первый файл должен быть в папке Экспертов (думаю он там уже есть), а второй можно найти здесь:



Файл UIDATA.mqh и API.mqh в этой папке уже содержат все неоходимое. Генерировать новые файлы в конструкторе не нужно.


3. Основная работа будет проходить в файле  (1) EA Shell v1.mq5, в функции _OnInit() и _OnTimer, но иногда будем заглядывать в файл  API.mqh. Если есть любопытство, можно открыть файл  UIDATA.mqh и посмотреть как выглядят функции обертки окон и элементов. Они напечатаны в самом низу. В остальном этот файл не нужен для работы и его можно закрыть.


Темы которые рассмотрим:

1. Ориентирование в списке интеллисенс и выбор функции нужного окна.

2. Программное открытие и закрытие окон. 

3. Ориентирование в списке интеллисенс и выбор нужного элемента в нужном окне.

4. Ориентирование в списках индивидуальных свойств элементов.

5. Разбор названия функции обертки элемента и окна.

6. Возврат значения параметра выбранного элемента в переменную его типа. Рассмотрим три типа нескольких разных элементов.

7. Установка значений в параметры разных типов элементов. Посмотрим как значения будут появляться в окнах интерфейса этих элементов. 

8. Возврат значений параметра одного элемента, изменение и пересылка этого значения в другой элемент. Рассмотрим разные типы элементов и значений, и проведем тест на пересылку между разными типами элементов в разных окнах.

9. Возврат предыдущего значения (_V_LAST). Когда и для каких случаев требуется последнее значение (не путать с текущим).

10. Протестируем устновку состояний ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK для различных типов элементов.

11. Попробуем связать и синхронизировать изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Допустим, чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.

12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.

13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.

14. Получим и установим цвета для текста и оснований элементов. Можно попытаться связать эти цвета с какими то незамысловатыми событиями или границами значений.

15. Расскажу подробнее как ориентироваться и читать новую распечатку файла API.


Пока все, но дополнения возможны по ходу дела. 

 

Начнем рассмотрение тем упомянутых выше.

1.  Ориентирование в списке интеллисенс и выбор функции нужного окна:

Вводим w_, появляется список функций окон пользовательского интерфейса этого проекта.


2. Ориентирование в списке интеллисенс и выбор нужного элемента из выбранного окна:

Выбрав окно, смотрим на его номер.

Стираем черточку после w и печатаем его номер.

Это префикс для списка всех интерактивных элементов внутри этого окна:


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

Гиф показывает легкость и динамику этого процесса:



Далее, рассмотрим открытие и закрытие окон графического интерфейса.

 

3. Открытие и закрытие окон:

  • Чтобы открыть окно нужно выбрать его название из списка интеллисенс и добавить скобки с точкой запятой.  Внутри вызова ничего не ставить.

  • Чтобы закрыть окно нужно сделать тоже самое, но в скобках поставить 0.



Так это выглядит в процессе:





Продолжим разбор тем завтра, со свежими силами. 

 
бесшовные
 

选择窗口后,我们查看其编号。

Мы стираем тире после буквы w и печатаем ее номер.

Это префикс всех списков взаимодействия в этом окне:

Что такое p1~p7? Понятно. Это атрибут

 
Графический интерфейс пока не работает в тестере.
 
hini #:

Что такое p1~p7? Понятно. Это атрибут

Это префикс для открытия списка индивидуальных свойств элемента, доступных для возврата и установки значений его функцией обертки. 


 
hini #:
Графический интерфейс пока не работает в тестере.
Данный вопрос пока не исследовал, не было времени. После завершения написания основного функционала, посмотрю возможно ли что то сделать. 
 
Реter Konow #:
Я еще не изучал этот вопрос, потому что у меня не было времени. Когда я закончу писать базовую функциональность, я посмотрю, можно ли что-то с этим сделать.
Потому что в тестере он не вызывает OnChartEvent