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

 
Nikolai Semko #:

Pyotr, no te entiendo.

No has respondido a las preguntas. Es importante para los programadores saber como interactuar con tu GUI mientras trabajas. 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 el código debe generar.

Bien. Intentaré usar sólo imágenes para mayor claridad.

1.





2.


3.


4.

Nuestra hoja de opciones y la casilla de verificación en la ventana y el archivo Internal_API:




5. Realización de acciones sobre la ventana y los elementos en el código de usuario:




6.


¡¡¡INTELLISENSE NOS LO DICE TODO!!!


 
DE ACUERDO.

Intentaré hacer una pregunta diferente. Usando el desarrollo web como ejemplo. Porque tu GUI está escrita usando el lenguaje de marcas que has creado.
El desarrollo web también tiene su propio lenguaje de marcado (HTML) y lenguaje de estilo (CSS). Si has creado un sitio web sólo en HTML, puedes crear controles en html puro.




Aquí hay un ejemplo con checkbox. Pero en este caso el sitio estará muerto, porque no pasará nada cuando los controles estén trabajando. Para hacer que algo pase, necesitas poner un manejador para cada evento usando JavaScript y la función addEventListener Aquí hay un ejemplo de tal manejador:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Mi pregunta principal puede ser reformulada: ¿Cómo implementaspara el programador el manejador de eventos generado por GUI cuando el usuario trabaja.
Es decir, ¿cuál es su análogo de addEventListener ? Como he dicho, lo tengo implementado a través del hecho de que cuando la GUI se genera programáticamente, a cada control se le asigna su propia función manejadora de eventos utilizando unpuntero a una función.
 
En la imagen de obtener un valor de un elemento, se me olvidó escribir la variable a la que se escribe. Lo siento, hace mucho que no programo.))))))
 
Nikolai Semko #:
DE ACUERDO.

Intentaré hacer una pregunta diferente. Usando el desarrollo web como ejemplo. Porque tu GUI está escrita usando el lenguaje de marcas que has creado.
El desarrollo web también tiene su propio lenguaje de marcado (HTML) y lenguaje de estilo (CSS). Si has creado un sitio web sólo en HTML, puedes crear controles en html puro.




Aquí hay un ejemplo con checkbox. Pero en este caso el sitio estará muerto, porque no pasará nada cuando los controles estén trabajando. Para hacer que algo pase, necesitas poner un manejador para cada evento usando JavaScript y la función addEventListener Aquí hay un ejemplo de tal manejador:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Mi pregunta principal puede ser reformulada: ¿Cómo implementaspara el programador el manejador de eventos generado por GUI cuando el usuario trabaja.
Es decir, ¿cuál es su análogo a addEventListener ? Como ya he dicho, lo tengo implementado a través del hecho de que cuando la GUI se genera mediante programación, a cada control se le asigna su propia función manejadora de eventos utilizando unpuntero a la función.

Nicolás, todo funciona. Ya lo probarás tú mismo más adelante. Todo es mucho más sencillo de lo que crees. He hecho muchas interfaces que funcionan usando esta tecnología. Así que... Pronto lo verás.

 
Реter Konow #:

Nikolai, está funcionando. Lo probarás tú mismo más tarde. Es mucho más simple de lo que piensas. He hecho muchas interfaces de trabajo utilizando esta tecnología. Así que... Pronto lo verás.

De acuerdo. Estaré esperando.
Realmente quiero entender su Creación. Sin embargo, para que sea más fácil de entender con un ejemplo, por favor, cree un simple indicador vacío (o Asesor Experto), en el que su GUI está conectado en forma de un botón separado, cuando se pulsa, el color de fondo de la ventana cambia de negro a blanco y de blanco a negro. Sólo es deseable que el cambio de color tenga lugar en el cuerpo del indicador, y no en uno de los archivos conectados.
Porque el programador realmente no debe meterse en su código. Para simplificar la escritura aquí está el código de la función que debe ejecutarse en el cuerpo del programa cuando se pulsa el botón:

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 #:

De acuerdo. Voy a esperar.
Realmente quiero entender su creación. Sin embargo, para que sea más fácil de entender con un ejemplo, por favor, cree un simple indicador vacío (o Asesor Experto), en el que su GUI está conectado en forma de un botón separado, cuando se pulsa, el color de fondo de la ventana cambia de negro a blanco y de blanco a negro. Sólo es deseable que el cambio de color tenga lugar en el cuerpo del indicador, y no en uno de los archivos conectados.
Porque el programador realmente no debe meterse en su código. Para simplificar la escritura aquí está el código de la función que debe ejecutarse en el cuerpo del programa cuando se pulsa el botón:

Ok. Haré una implementación lo más simple posible para que se entienda. Sin florituras).

  • Indicador
  • Dentro del indicador hay una ventana de usuario
  • Hay un botón en la ventana
  • El botón llama a su función.
  • Todas las acciones se escriben en el cuerpo del indicador.
 
Реter Konow #:

De acuerdo. Haré la implementación más sencilla posible para que se entienda. Sin florituras).

  • Indicador
  • Dentro del indicador hay una ventana de usuario
  • Hay un botón en la ventana
  • El botón llama a su función.
  • Todas las acciones se escriben en el cuerpo del indicador.

Muy bien. Gracias.

 

Nikolay, no puedo escribir una llamada a una función dentro del cuerpo del indicador, porque su manejador está dentro del archivo Internal_API.mqh.

Es decir, puedo llamar a tu función en el evento de pulsar el botón desde su manejador en este archivo. Sin embargo, puedo establecer los estados del botón programáticamente desde el cuerpo del indicador en el evento del temporizador, por ejemplo. Pero entonces no necesito pulsar el botón. En resumen, hay diferentes elementos. Algunos de ellos pueden ser manejados dentro del cuerpo del indicador (en su mayoría elementos no interactivos, como la barra de progreso, por ejemplo) y hay los que tienen un controlador en el archivo Internal_API.mqh y trabajar desde allí. Aunque sus estados se pueden establecer programáticamente desde el cuerpo del EA/indicador.

Su tarea se ha completado. (si cuadrado blanco - click)


Código:

//+------------------------------------------------------------------+
//|                                                 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);
}

Comentada tu función porque el compilador maldecía. Lo hice más simple.


Aquí está el código en el archivo Internal_API.mqh



 

Por cierto, usted debe agregar:

El archivo Internal_API.mqh contiene manejadores de control y esta ESPECIFICAMENTE diseñado para conectarlos.

Este archivo está destinado al usuario y no es parte del motor o cualquiera de mi otro código.

 
Реter Konow controles y está ESPECIFICAMENTE diseñado para conectarlos.

Este archivo está destinado al usuario y no es parte del motor o cualquiera de mi otro código.

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