Обсуждение статьи "Делаем информационную панель для отображения данных в индикаторах и советниках" - страница 2

 
Artyom Trishkin #:

Здравствуйте.

Таким образом

объявляется переменная-указатель на будущий новый, динамически создаваемый, объект класса, и сразу же инициализируется значением NULL.


А просто экземпляр класса объявляется так:

Но в данном случае объявить и создать экземпляр таким образом не получится - у класса нет конструктора без формальных параметров.

Значит, при таком объявлении, необходимо указать все нужные параметры объекта класса, которые должны быть переданы в конструктор класса:

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

В примере работы с классом в индикаторе создаётся сначала пустой указатель на будущий объект, а далее, в OnInit() создаётся объект панели, где в переменную-указатель записывается указатель на созданный объект:


Далее в OnDeinit() объект удаляется в памяти по этому указателю:

Если бы просто создали новый объект посредством оператора new без записи указателя на созданный объект в переменную, то не смогли бы его потом удалить, что привело бы к утечке памяти.

Получается, если вкратце, то в примере к статье

  1. объявляем переменную-указатель на будущий объект класса  и инициализируем её значением NULL,
  2. создаём новый объект класса и записываем указатель на него в созданную ранее переменную dashboard,
  3. при обращении к созданному объекту используем переменную-указатель и точку ( dashboard.AnyMethod() )
  4. по окончании работы удаляем динамически созданный объект класса по указателю на него.

Если бы был сразу же создан нужный экземпляр класса (CDashboard  dashboard), то никаких указателей на него использовать не нужно было - обращение шло бы к нему точно так же посредством оператора "точка". И удалять бы его не нужно было по окончании работы - подсистема терминала сама это делает. Но это был бы единственный экземпляр класса в программе.

Динамическое создание позволяет на лету создавать новые объекты нужного класса и обращаться к ним по указателю. Поэтому в примере было использовано динамическое создание объекта класса. Упрощённо, без освещения некоторых моментов.

Спасибо За исчерпывающий ответ! так для каждого объекта свой конструктор в другом случае объект с запрошенными аргументами из класса, на любом этапе можно создать разные объекты!(Нус становится немного ясней).

Собственно интерес к созданию инфо панели, это следствие DPI монитора, в моем случае 168. Comment(); сильно мелко получается!

Есть TerminalInfoInteger(TERMINAL_SCREEN_DPI)  хочу создавать с учетом разрешения... и хочу по цветовой группе,для удобства.

Может у вас такое решение есть? Ваш код хороший, понятно читается... я же, долго, непонятно, в результате приходится все несколько раз переписывать! Спасибо за вашу поддержку!  

 
Igor Bakhrushen #:

Спасибо За исчерпывающий ответ! так для каждого объекта свой конструктор в другом случае объект с запрошенными аргументами из класса, на любом этапе можно создать разные объекты!(Нус становится немного ясней).

Собственно интерес к созданию инфо панели, это следствие DPI монитора, в моем случае 168. Comment(); сильно мелко получается!

Есть TerminalInfoInteger(TERMINAL_SCREEN_DPI)  хочу создавать с учетом разрешения... и хочу по цветовой группе,для удобства.

Может у вас такое решение есть? Ваш код хороший, понятно читается... я же, долго, непонятно, в результате приходится все несколько раз переписывать! Спасибо за вашу поддержку!  

Решение же есть прямо в примерах в справке:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Галерея UI написанных на MQL

Artyom Trishkin, 2024.05.31 10:33

Здесь (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;

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


 
Я, к сожалению, не имею 4К монитора, поэтому не могу проверить, и по той же причине пока не ввожу такой перерасчёт в библиотеку - делать наобум, без проверки - не серьёзно.
 
Artyom Trishkin #:
Я, к сожалению, не имею 4К монитора, поэтому не могу проверить, и по той же причине пока не ввожу такой перерасчёт в библиотеку - делать наобум, без проверки - не серьёзно.
Ясно... Спасибо! Потихоньку разберемся!
 
Artyom Trishkin #:
Я, к сожалению, не имею 4К монитора, поэтому не могу проверить, и по той же причине пока не ввожу такой перерасчёт в библиотеку - делать наобум, без проверки - не серьёзно.

Артем привет! Вот строится с учетом dpi... Но по сути можно пойти другим путем. Скажем задать размер заголовка, посчитать размер панели высоту строк и высоту текста, исходя из размера заголовка. Указываешь два параметра... и пофиг какой там dpi.. или с этим могут быть проблемы? Я не совсем уверен, Какое ваше мнение по поводу такого решения? 

 
Igor Bakhrushen #:

Артем привет! Вот строится с учетом dpi... Но по сути можно пойти другим путем. Скажем задать размер заголовка, посчитать размер панели высоту строк и высоту текста, исходя из размера заголовка. Указываешь два параметра... и пофиг какой там dpi.. или с этим могут быть проблемы? Я не совсем уверен, Какое ваше мнение по поводу такого решения? 

Всë нужно тестировать. Без монитора я не могу. Соответственно, и сказать мне нечего, к сожалению. 
 
Отлично, спасибо за этот код :).
 

Хорошая идея насчёт панели. Но заметил, что панель самопроизвольно падает вниз графика при переключении на него с другого графика. Пример:


 
Denis Kirichenko #:

Хорошая идея насчёт панели. Но заметил, что панель самопроизвольно падает вниз графика при переключении на него с другого графика. Пример:

Хм. Интересное явление. Нужно поглядеть будет в свободное время. Скорее всего причина в изменении размеров неактивного графика.

 
Пока что выяснил, что так обрабатывается событие CHARTEVENT_CHART_CHANGE(9).