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

 
Nikolai Semko #:

Петр, я тебя не понял. Ты не ответил на вопросы.
Для программистов важно узнать, как взаимодействовать с твоим GUI в процессе работы. 
Вот пример моего GUI. Я нажал ярлык светлой/темной темы, и это событие сразу вызвало функцию смены цветов фона и линий. Как это взаимодейстие сделать у тебя?


Что значит " Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом.  "?
Программисту нужно взаимодействовать не с кодом, а с событиями, который должен генерировать этот код.

Хорошо. Для ясности попробую использовать только картинки.

1. 





2. 


3. 


4. 

Наш лист опций и чекбокс в окне и файле Internal_API:




5. Выполняем действия с окном и элементами в коде пользователя:




6.

ИНТЕЛЛИСЕНС НАМ ВСЕ ПОДСКАЗЫВАЕТ!!!


 
Ну Ок. Попробую спросить по другому.
На примере вэб разработки.
Т.к. твой GUI пишется с помощью созданного тобой языка разметки. В вэб разработке так же существует свой язык разметки (HTML) и язык стилей (CSS).
Если ты создал вэб сайт только на HTML, то ты можешь создавать элементы управления на чистом html. Вот пример с checkbox.
Но в этом случае сайт будет мертвым, т.к. ничего не будет происходить при работе элементов управления. 
Чтобы что-то происходило, необходимо на каждое событие повесить обработчик этого события с помощью JavaScript  и функции addEventListener
Вот пример такой обработки: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4

Мой главный вопрос можно переформулировать: Как у тебя реализован для программиста обработчик событий, генерируемый GUI при работе пользоваля. Т.е. какой твой аналог addEventListener ?
Как я говорил, у меня это реализовано через то, что при программном формировании GUI каждому элементу управления назначается своя функция-обработчик этого события с помощью указателя на функцию.
 
Там на картинке получения значения от элемента забыл прописать переменную в которую оно записывается. Сорри, давно не программировал.)))
 
Nikolai Semko #:
Ну Ок. Попробую спросить по другому.
На примере вэб разработки.
Т.к. твой GUI пишется с помощью созданного тобой языка разметки. В вэб разработке так же существует свой язык разметки (HTML) и язык стилей (CSS).
Если ты создал вэб сайт только на HTML, то ты можешь создавать элементы управления на чистом html. Вот пример с checkbox.
Но в этом случае сайт будет мертвым, т.к. ничего не будет происходить при работе элементов управления. 
Чтобы что-то происходило, необходимо на каждое событие повесить обработчик этого события с помощью JavaScript  и функции addEventListener
Вот пример такой обработки: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4

Мой главный вопрос можно переформулировать: Как у тебя реализован для программиста обработчик событий, генерируемый GUI при работе пользоваля. Т.е. какой твой аналог addEventListener ?
Как я говорил, у меня это реализовано через то, что при программном формировании GUI каждому элементу управления назначается своя функция-обработчик этого события с помощью указателя на функцию.

Николай, все работает. Позже ты сам попробуешь. Все намного проще чем ты думаешь. Я по этой технологии много рабочих интерфейсов сделал. Так что... Скоро все увидишь.

 
Реter Konow #:

Николай, все работает. Позже ты сам попробуешь. Все намного проще чем ты думаешь. Я по этой технологии много рабочих интерфейсов сделал. Так что... Скоро все увидишь.

ну Ок. Буду ждать. Реально хочу понять твое Творение. 
Все же, чтобы легче было понять на примере, создай, пожалуйста, простой пустой индикатор (или советник), в котором подключен твой GUI в виде отдельной кнопки, при нажатии которой меняется цвет фона окна с черного на белый и с белого на черный. Только желательно, чтобы смена цвета происходило в теле индикатора, а не в одном из подключенных файлов. Т.к. программист, действительно, не должен лезть в твой код. 
Для простоты написания вот код функции, которая должна выполняться в теле программы при нажатии кнопки:

void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}
 
Nikolai Semko #:

ну Ок. Буду ждать. Реально хочу понять твое Творение. 
Все же, чтобы легче было понять на примере, создай, пожалуйста, простой пустой индикатор (или советник), в котором подключен твой GUI в виде отдельной кнопки, при нажатии которой меняется цвет фона окна с черного на белый и с белого на черный. Только желательно, чтобы смена цвета происходило в теле индикатора, а не в одном из подключенных файлов. Т.к. программист, действительно, не должен лезть в твой код. 
Для простоты написания вот код функции, которая должна выполняться в теле программы при нажатии кнопки:

Хорошо. Для понимания сделаю максимально простую реализацию. Без прибамбасов.)

  • Индикатор
  • Внутри индикатора пользовательское окно
  • В окне одна кнопка 
  • Кнопка вызывает твою функцию.
  • Все действо прописано в теле индикатора.
 
Реter Konow #:

Хорошо. Для понимания сделаю максимально простую реализацию. Без прибамбасов.)

  • Индикатор
  • Внутри индикатора пользовательское окно
  • В окне одна кнопка 
  • Кнопка вызывает твою функцию.
  • Все действо прописано в теле индикатора.

Супер! Спасибо.

 

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

То есть, я могу вызывать твою функцию на событии нажатии кнопки из ее обработчика в этом файле. Однако, я могу устанавливать состояния кнопки программно из тела индикатора на событии таймера, например. Но тогда не нужно на кнопку нажимать. Короче, есть разные элементы. С одними можно работать внутри тела индикатора (в основном неинтерактивные элементы, как прогресс-бар например) и есть те, которые имеют обработчик в файле  Internal_API.mqh и работают от туда. Хотя их состояния можно программно устанавливать из тела советника/индикатора.

Твою задачу выполнил. (если белый квадрат - нажми)


Код:

//+------------------------------------------------------------------+
//|                                                 Indicators 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include<GUI_DRIVE_2.mqh>
#include<MyProject_1\CORES.mqh>
#include<MyProject_1\Internal_API.mqh> 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------
   D_OnInit();
   //-------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //УСТАНОВИТЬ ВЫЗОВ В САМОМ НИЗУ, ПОД ПОЛЬЗ.КОДОМ.------------------
   //---------------------------
   RMSG(1);
   //---------------------------
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //УСТАНОВИТЬ ВЫЗОВ НА САМОМ ВЕРХУ, НАД ПОЛЬЗ.КОДОМ.---------------
   //----------------------------------------------------------------
   D_OnChartEvent(id,lparam,dparam,sparam);
   //----------------------------------------------------------------
  }
//+------------------------------------------------------------------+

/*void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[13] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}*/


void ChangeColorScheme(uint _color)
{
 ChartSetInteger(0,CHART_COLOR_BACKGROUND,_color);
}

 

Закомментировал твою функцию потому что компилятор ругался. Сделал проще.


Вот код в файле  Internal_API.mqh



 

Кстати, нужно добавить:

файл Internal_API.mqh содержит обработчики элементов управления и СПЕЦИАЛЬНО предназначен для их подключения. 

Этот файл предназначен для пользователя и не является частью движка или другого моего кода.

 
Реter Konow #:

Кстати, нужно добавить:

файл Internal_API.mqh содержит обработчики элементов управления и СПЕЦИАЛЬНО предназначен для их подключения. 

Этот файл предназначен для пользователя и не является частью движка или другого моего кода.

Понятно Петр. Спасибо.
Не удобно, конечно, для разработчика. Очень много лишнего кода и телодвижений. 
Все же вариант с указателем на функцию намного лучше.