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

 
Nikolai Semko #:

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

Чего ж неудобно то? Вот попробуешь и тогда выводы сделаешь.))

1. Все обработчики элементов конструктор печатает сам, только подлючай. 

2. Интеллисенс подсовывает нужные функции, только выбирай.)) 

3. Все правила простые, запомнить несложно.

 Легче может быть только визуальный редактор, но это потом.

P.S.  После 4-ех летнего перерыва выполнил твою задачу за 10 минут. Остальное время пытался понять почему твоя функция не работала, и потом снимал гиф. ))) 
 
Реter Konow #:
Чего ж неудобно то? Вот попробуешь и тогда выводы сделаешь.))

1. Все обработчики элементов конструктор печатает сам, только подлючай. 

2. Интеллисенс подсовывает нужные функции, только выбирай.)) 

3. Все правила простые, запомнить несложно.

 Легче может быть только визуальный редактор, но это потом.

P.S.  После 4-ех летнего перерыва выполнил твою задачу за 10 минут. Остальное время пытался понять почему твоя функция не работала, и потом снимал гиф. ))) 

Мне видится, что твой файл  Internal_API.mqh, который придется писать разработчику достаточно объемный и замысловатый. Сколько будет строк кода в нем в такой постановки задачи с одной кнопкой?

Для разработчика важно разработать свой GUI привычным способом, создавая объект. 

Например, у меня такая задача выглядит следующим образом:

#resource "//Images//eclipse-alt.png" as uchar eclipse_alt[] // загружаем в ресурс изображение иконки с файла png
#include  <My\IconsMenu.mqh>

//+------------------------------------------------------------------+
IconsMenu menu(5,15,1,ANCHOR_RIGHT_UPPER,true,27, CheckBox, 0x00EEEEEE); // создаем меню
//+------------------------------------------------------------------+
void TimerMenu() { // таймер необходим для всплывающей подсказки
   menu.Timer();
}
//+------------------------------------------------------------------+
int OnInit() {
   InitMenu();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   menu.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
void InitMenu() {
   menu.SetTimerFunction(TimerMenu); // установка функции таймера
   bool dark_mode = W.Color!=0;      // определяем текущую цветовую схему чарта
   menu.AddPng(eclipse_alt,"dark/light theme",ChangeColorScheme,dark_mode); // создаем элемент кнопки-иконки
   menu.Draw();
}
//+------------------------------------------------------------------+
void ChangeColorScheme (bool checked) {
   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}
   };
   int clr_scheme = checked?1:0;

   if (checked) {
      menu.clr_off = 0x00606060;
      menu.clr_hover = 0x30808080;
   } else {
      menu.clr_off = 0x00EEEEEE;
      menu.clr_hover = 0x30FFFFFF;
   }
   menu.ChangeColorAll();
   menu.Draw();

   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();
}

желтым цветом выделено все, что касается создания и настройки GUI. Больше ничего делать не нужно. 
Каждый новый элемент GUI - это одна строка кода + функция обработчик события от этого элемента



Файлы:
 
Николай, я все уже обьяснил. 

1. Файл печатается автоматически при сохранении построенного GUI. 

2. Его никто специально не пишет. 

3. Внутри файла готовые обработчики элементов управления которые пользователь обьявил на языке разметки.

4.. В обработчики приходят события интерфейса  из движка. 

5. Пользователь лишь вставляет в обработчики свой код.

Все. Более повторяться не стану, извини.

 
Реter Konow #:
Николай, я все уже обьяснил. 

1. Файл печатается автоматически при сохранении построенного GUI. 

2. Его никто специально не пишет. 

3. Внутри файла готовые обработчики элементов управления которые пользователь обьявил на языке разметки.

4.. В обработчики приходят события интерфейса  из движка. 

5. Пользователь лишь вставляет в обработчики свой код.

Все. Более повторяться не стану, извини.

ну Ок
ты ж не предоставил этот файл, поэтому и строю предположения. 
Будем ждать вариант со всеми файлами, чтобы можно было протестировать в живую.

 
Насчет вопроса сколько строк кода.

При решении твоей задачи я вставил из интеллисенса 2 строки в обработчик. Показал на картинке. Я написал только название цветов в скобках. И две строки функции (вместо твоей). Больше ничего.
 
Провожу "уборку" в коде перед релизом, "перебираю" движок, удаляю лишнее (если нахожу), заодно вспоминаю как все работало. 

В общем, скоро выставлю.
 
Реter Konow # :
Я "чищу" код перед релизом, "перестраиваю" движок, убираю ненужные вещи (если удается их найти), одновременно вспоминая, как все работало.

В общем, скоро выложу.

С нетерпением жду вашего релиза, хочу понять ваши идеи по кодированию.

 
Nikolai Semko # :

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


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

В конце концов, GUI - это не отдельная независимая программа. GUI в конечном итоге должен взаимодействовать с основной программой разработчика. Будь то индикатор или советник.

GUI, который вы показываете на своих фотографиях, просто потрясающий, не могли бы вы рассказать нам, как вы этого добились?

 
hini #:

С нетерпением жду вашего релиза, хочу понять ваши идеи по кодированию.

Хорошо. 

Сделаю небольшое пояснение насчет релиза. После 4-ех летнего перерыва, оказалась утеряна последняя версия движка. Обнаружилось это не сразу. Старая версия рабочая, но требует апгрейда до версии конструктора. Для этого я должен достаточно глубоко вникнуть в код, который немного подзабыл. Поэтому возникла задержка.  Однако, ничего страшного и все будет закончено. 

Из за задержки с движком, я решил что релиз будет разделен на 2 части. Сначала выставлю конструктор. Желающие ознакомятся с языком разметки и напишут нужный графический интерфейс. Через некоторое время я передам публике обновленный движок. После помогу подключить созданный GUI и он заработает совместно с пользовательскими советниками или индикаторами. Далее каждый освоит простые принципы работы с языком разметки и методы подключения к интерфейса своим приложениям.

Сделать релиз из двух частей проще потому что конструктор уже почти готов к релизу, а движок требует небольшой доработки. 

Ну и конечно примеры кода разметки и дополнительные инструкции его написания тоже предоставлю вместе с релизом конструктора.

Ждите на выходных.)
 
Добавлю уточнение к сказанному выше: после релиза конструктора, желающие сразу получат возможность проектировать свой GUI на лету прямо из МЕ. 

1. Для этого они откроют файл инклюдник "KIB-source.mqh" из сборки релиза.

2. Сохранят его в папке индикаторов и скомпилируют после этого.

3. В результате они увидят новый индикатор под названием "KIB-source.ex5" в ветках навигатора МТ5 и закинут его на свободный график.

4. Пользователь создаст в навигаторе MQL5\include\... папку для файлов с кодом разметки. 

Например MQL5\include\My_GUI\Project_1\...

В этой папке он будет хранить файлы с интерфейсом своих проектов. В них же будет писать, редактировать, экспериментировать и проектировать UI на коде разметки.

5. Важно уточнить, во время работы с языком разметки при построении гр.интерфейса, результат выводится на график МТ5, где стоит индикатор "KIB-source.ex5" и советник (конструктор) "KIB.ex5", которые предоставлю в первом релизе. Они оба должны быть на одном графике. 

Далее (очень важно), во время компиляции файла "KIB-source.mq5" параллельно открытого в МЕ, (вместе с файлами пользовательского GUI-проекта), весь код разметки пересылается в конструктор на том же графике и он полностью перестраивает граф.интерфейс заново. Это занимает от 200мс  до 1000мс в зависимости от количества окон и элементов в интерфейсе. И юзер сразу видит результат внесенных изменений. Все происходит очень быстро и почти в реальном времени - внес изменения в код разметки, скомпилировал "KIB-source.mq5" и через долю секунды видишь результат на графике МТ5. Поэтому, желательно работать на двух мониторах. На одном открыт МТ5, на втором МЕ. 

6. Удобство языка разметки в простоте и возможности создания шаблонов элементов и окон, которые легко копипастить между окнами или проектами.

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

1. Открыть архив.
2. Поместить папку KIB в папку MQL5\include\
3. Файл CONNECTION.mqh из архива тоже поместить в папку MQL5\inlude\ (не помещать в подпапки).
4. Файл KIB.mq5 положить в папку MQL5\Experts\, открыть в МЕ, скомпилировать и сохранить, чтобы в навигаторе МТ5 возник советник KIB.ex5.
5. Забросить этот советник на тот же график что и индикатор КIB-source.mq5.
6. После этого, файл конструктора KIB.mq5 в МЕ можнл закрыть. Более он не понадобится.


Все готово к работе.