Galería de interfaces de usuario escritas en MQL - página 16

 
Nikolai Semko #:

Ya veo, Peter.
Gracias. No es conveniente para un desarrollador, por supuesto.
Hay mucho código y movimientos innecesarios. Aún así, la variante con un puntero a una función es mucho mejor.

¿Por qué es inconveniente? Ya lo probarás y luego sacarás conclusiones)).

1. El constructor imprime todos los manejadores de elementos por sí mismo, sólo hay que conectarlos.

2. Intellisense proporciona las funciones necesarias, sólo tienes que elegir))).

3. Todas las reglas son simples, no es difícil de recordar.

Sólo el editor visual puede ser más fácil, pero eso es más tarde.

P.D. Después de un descanso de 4 años completé su tarea en 10 minutos. El resto del tiempo estaba tratando de entender por qué su función no funcionaba, y luego estaba disparando el gif. )))
 
Реter Konow #:
¿Por qué es incómodo? Ya lo probarás y entonces sacarás conclusiones)).

1. Todos los manejadores de elementos son impresos por el propio constructor, sólo tienes que conectarlos.

2. Intellisense proporciona las funciones necesarias, sólo tienes que elegir una)).

3. Todas las reglas son sencillas y fáciles de memorizar.


Sólo el editor visual puede ser más fácil, pero eso será más adelante.

P.D. Después de una pausa de 4 años, completé tu tarea en 10 minutos. El resto del tiempo estuve intentando averiguar por qué tu función no funcionaba, y luego grabando el gif. )))

Veo que el archivo Internal_API.mqh que tendrá que escribir un desarrollador es bastante grande e intrincado.



¿Cuántas líneas de código habrá en él en una tarea de este tipo con un botón? Es importante que un desarrollador desarrolle su GUI de la manera habitual, mediante la creación de un objeto. Por ejemplo, tengo una tarea de este tipo como sigue:

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

todo lo que se refiere a la creación y personalización de GUI está resaltado en amarillo.
No es necesario hacer nada más. Cada nuevo elemento GUI es una línea de código + función manejadora de eventos de este elemento.



Archivos adjuntos:
 
Nikolai, ya te lo he explicado todo.

1. El archivo se imprime automáticamente al guardar la GUI construida.

2. Nadie lo escribe especialmente.

3. Dentro del archivo están listos los manejadores de los controles que el usuario ha declarado en el lenguaje de marcado.

4.. Los manejadores reciben eventos de interfaz del motor.

5. El usuario sólo inserta su código en los manejadores.

Eso es todo. No me repetiré, lo siento.

 
Реter Konow controles que el usuario ha declarado en el lenguaje de marcado.

4.. Los manejadores reciben eventos de interfaz del motor.

5. El usuario sólo inserta su código en los manejadores.

Eso es todo. No me repetiré, lo siento.



OK usted no proporcionó este archivo, es por eso que hago suposiciones. Vamos a esperar a que la versión con todos los archivos, por lo que podemos probar en vivo.

 
Sobre la pregunta de cuántas líneas de código.

Al resolver tu problema, inserté 2 líneas de intellisense en el manejador. Se muestra en la imagen. Sólo escribí el nombre de los colores entre paréntesis. Y dos líneas de función (en lugar de las tuyas). Nada mas.
 
Estoy "limpiando" el código antes del lanzamiento, "reconstruyendo" el motor, eliminando cosas innecesarias (si puedo encontrarlas), al mismo tiempo que recuerdo cómo funcionaba todo.

En general, lo pondré pronto.
 
Реter Konow # :
Estoy "limpiando" el código antes del lanzamiento, "reconstruyendo" el motor, eliminando cosas innecesarias (si puedo encontrarlas), al mismo tiempo que recuerdo cómo funcionaba todo.

En general, lo pondré pronto.

Espero con impaciencia tu lanzamiento, quiero entender tus ideas de codificación.

 
Nikolai Semko # :

Peter, no te entiendo. No has respondido a las preguntas.
Es importante que los programadores sepan cómo interactuar con su GUI mientras trabajan.
Aquí hay un ejemplo de mi GUI. Hice clic en el acceso directo del tema claro/oscuro y este evento activó inmediatamente la función para cambiar los colores de fondo y las líneas. ¿Cómo se hace esta interacción?


¿Qué significa " El usuario NO interactuará (en absoluto) con mi código . "?
El programador necesita interactuar, no con el código, sino con los eventos que deben generar este código.

Al fin y al cabo, la GUI no es un programa independiente. La GUI debe interactuar en última instancia con el programa principal del programador. Ya se trate de un indicador o EA.

La GUI que muestras en tus fotos es impresionante, ¿puedes decirnos cómo la has conseguido?

 
hini #:

Espero con impaciencia su publicación, quiero entender sus ideas de codificación.

De acuerdo.

Voy a hacer una pequeña aclaración acerca de la liberación. Después de una pausa de 4 años, la última versión del motor se perdió. No se descubrió de inmediato. La versión antigua funciona, pero requiere una actualización a la versión constructora. Para ello tengo que profundizar bastante en el código, que había olvidado un poco. Sin embargo, no es gran cosa y estará terminado.

Debido al retraso con el motor, he decidido que la publicación se dividirá en 2 partes. Primero, mostraré el constructor. Aquellos que lo deseen se familiarizarán con el lenguaje de marcado y escribirán la GUI necesaria. Después de algún tiempo daré al público el motor actualizado. Después ayudaré a conectar la GUI creada y trabajará junto con Expert Advisors o indicadores personalizados. Entonces todo el mundo aprenderá principios simples de trabajo con el lenguaje de marcado y métodos de conexión a la interfaz a sus aplicaciones.

Es más fácil hacer un lanzamiento en dos partes porque el constructor está casi listo para su lanzamiento, y el motor requiere una pequeña modificación.

Bueno, por supuesto, voy a proporcionar ejemplos de código de marcado y las instrucciones adicionales para escribirlo junto con la liberación del constructor.

Espéralo el fin de semana).
 
Me gustaría añadir una aclaración a lo anterior: después de la liberación del diseñador, aquellos que quieran diseñar su GUI sobre la marcha directamente desde ME.

1. Para ello, abrirán el archivo de inclusión "KIB-source.mqh" de la release build.

2. Lo guardarán en la carpeta de indicadores y lo compilarán después.

3. Como resultado, verán un nuevo indicador llamado "KIB-source.ex5" en las ramas del navegador MT5 y lo lanzarán en un gráfico libre.

4. El usuario creará en el navegador MQL5\include\... carpeta de archivos con código de marcado.

Por ejemplo, MQL5\include\My_GUI\Project_1\.....

En esta carpeta almacenará los archivos con la interfaz de sus proyectos. En ellos también escribirá, editará, experimentará y diseñará UI sobre código markup.

5. Es importante especificar que mientras se trabaja con el lenguaje de marcado al construir la interfaz de usuario, el resultado se muestra en el gráfico MT5, donde el indicador "KIB-source.ex5" y el Asesor Experto (constructor) "KIB.ex5", que voy a proporcionar en la primera versión. Ambos deben estar en el mismo gráfico.

Además (muy importante), durante la compilación del archivo "KIB-source.mq5" abierto en paralelo en ME, (junto con los archivos del proyecto GUI personalizado), todo el código de marcado se envía al constructor en el mismo gráfico y reconstruye completamente la GUI de nuevo. Tarda de 200ms a 1000ms dependiendo del número de ventanas y elementos de la interfaz. Y el usuario ve inmediatamente el resultado de los cambios realizados. Todo sucede muy rápidamente y casi en tiempo real - se hacen cambios en el código de marcado, se compila "KIB-source.mq5" y en una fracción de segundo se ve el resultado en el gráfico MT5. Por lo tanto, es conveniente trabajar en dos monitores. MT5 está abierto en uno y ME en el otro.

6. La conveniencia del lenguaje de marcas está en su sencillez y en la posibilidad de crear plantillas de elementos y ventanas que se pueden copiar fácilmente entre ventanas o proyectos.

7. Me gustaría añadir que el diseñador es de código abierto en el archivo. Por lo tanto, el usuario tendrá las siguientes tareas:

1. Abrir el archivo.
2. Colocar la carpeta KIB en la carpeta MQL5\include\.
3. Coloca el archivo CONNECTION.mqh del archivo en la carpeta MQL5\inlude\ (no lo coloques en subcarpetas).
4. 4. Coloque el archivo KIB.mq5 en la carpeta MQL5\Experts\, ábralo en ME, compílelo y guárdelo para que aparezca el Asesor Experto KIB.ex5 en el navegador MT5.
5. Cargue este Asesor Experto en el mismo gráfico que el indicador KIB-source.mq5.
6. Después de eso, el archivo constructor KIB.mq5 en ME puede ser cerrado. Ya no será necesario.


Todo está listo para trabajar.