Discusión sobre el artículo "Cómo crear un panel informativo para mostrar datos en indicadores y asesores" - página 2

 
Artyom Trishkin #:

Hola.

Hola.

se declara una variable puntero a un futuro nuevo objeto creado dinámicamente de la clase y se inicializa inmediatamente con valor NULL.


Una instancia simple de una clase se declara de la siguiente manera:

Pero en este caso no se puede declarar y crear una instancia de esta manera - la clase no tiene constructor sin parámetros formales.

Por lo tanto, al declarar una instancia de esta manera, es necesario especificar todos los parámetros necesarios del objeto de clase, que deben pasarse al constructor de la clase:

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

En el ejemplo de trabajo con la clase, primero se crea un puntero vacío al futuro objeto en el indicador, y luego, en OnInit() se crea el objeto panel, donde el puntero al objeto creado se escribe en la variable puntero:


Luego en OnDeinit() se borra el objeto en memoria por este puntero:

Si usted simplemente creara un nuevo objeto a través del operador new sin escribir un puntero al objeto creado en una variable, no podría borrarlo más tarde, resultando en una fuga de memoria.

Así que, en resumen, en el ejemplo del artículo

  1. declarar una variable-puntero al futuro objeto de clase e inicializarla con valor NULL,
  2. creamos un nuevo objeto de clase y escribimos el puntero al mismo en la variable dashboard creada anteriormente,
  3. al acceder al objeto creado utilizamos la variable-puntero y un punto ( dashboard.AnyMethod() )
  4. al final del trabajo eliminar el objeto de clase creado dinámicamente por el puntero a la misma.

Si la instancia necesaria de la clase (dashboard CDashboard) se hubiera creado inmediatamente, no habría sido necesario ningún puntero a la misma - se habría accedido a ella de la misma manera utilizando el operador "point". Y no habría necesidad de borrarlo cuando el trabajo hubiera terminado - el subsistema terminal lo hace por sí mismo. Pero sería la única instancia de la clase en el programa.

La creación dinámica permite crear sobre la marcha nuevos objetos de la clase deseada y referirse a ellos mediante punteros. Por eso en el ejemplo se utilizó la creación dinámica de un objeto de clase. Simplificado, sin cubrir algunos puntos.

Gracias por la respuesta completa! así que para cada objeto su propio constructor en otro caso objeto con argumentos solicitados de la clase, en cualquier etapa puede crear diferentes objetos!(Nus se vuelve un poco más claro).

En realidad el interés de crear un panel de información, es una consecuencia de la DPI del monitor, en mi caso 168. ¡Comentario(); es muy pequeño!

Hay TerminalInfoInteger(TERMINAL_SCREEN_DPI) Quiero crear teniendo en cuenta la resolución ... y quiero crear por grupo de colores, por conveniencia.

Tal vez usted tiene una solución de este tipo? Su código es bueno, legible ... ¡Yo, por el contrario, largo, incomprensible, como resultado tengo que reescribir todo varias veces! Gracias por su ayuda.

 
Igor Bakhrushen #:

Gracias Por una respuesta completa! por lo que para cada objeto tiene su propio constructor en el otro caso objeto con argumentos solicitados a la clase, en cualquier etapa puede crear diferentes objetos!(Nous se vuelve un poco más claro).

En realidad el interés de crear un panel de información, es una consecuencia del monitor DPI, en mi caso 168. ¡Comment(); es muy pequeño!

Hay TerminalInfoInteger(TERMINAL_SCREEN_DPI) Quiero crear teniendo en cuenta la resolución ... y quiero crear por grupo de colores, por comodidad.

Tal vez usted tiene una solución de este tipo? Su código es bueno, legible ... ¡Yo, por el contrario, largo, incomprensible, como resultado tengo que reescribir todo varias veces! Gracias por su ayuda.

La solución está justo en los ejemplos en la ayuda:

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.

Galería de interfaces de usuario escritas en MQL

Artyom Trishkin, 2024.05.31 10:33 AM

Aquí(TERMINAL_SCREEN_DPI):

Ejemplo de cálculo del factor de escala:

//--- crear un botón de 1,5 pulgadas de ancho en la pantalla
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // obtener los PPP del monitor del usuario
int base_width = 144;                                      // anchura base en puntos de pantalla para monitores estándar con DPI=96
int width      = (button_width * screen_dpi) / 96;         // calcular el ancho del botón para el monitor del usuario (teniendo en cuenta su DPI)
...
 
//--- cálculo del factor de escala en porcentaje
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- utilizando el factor de zoom
width=(base_width * scale_factor) / 100;

Cuando se utiliza de esta manera, un recurso gráfico tendrá el mismo tamaño a ojo en monitores con diferentes resoluciones. Al mismo tiempo, los tamaños de los elementos de control (botones, ventanas de diálogo, etc.) corresponderán a los ajustes de personalización.


 
Desgraciadamente no tengo un monitor 4K, así que no puedo comprobarlo, y por la misma razón no introduzco tal recálculo en la biblioteca todavía - no es serio hacerlo al azar, sin comprobarlo.
 
Artyom Trishkin #:
Por desgracia, no tengo un monitor 4K, así que no puedo comprobarlo, y por la misma razón no introduzco ese recálculo en la biblioteca todavía - no es serio hacerlo al azar, sin comprobarlo.
Ya veo... ¡Gracias! ¡Lo resolveremos poco a poco!
 
Artyom Trishkin #:
Por desgracia, no tengo un monitor 4K, así que no puedo comprobarlo, y por la misma razón no introduzco ese recálculo en la biblioteca todavía - no es serio hacerlo al azar, sin comprobarlo.

Artem ¡hola! Aquí está la construcción teniendo en cuenta dpi.... Pero en realidad se puede ir de otra manera. Digamos que se establece el tamaño de la cabecera, calcular el tamaño del panel, altura de la línea y la altura del texto basado en el tamaño de la cabecera. Especificas dos parámetros... y cualquiera que sea el dpi. ¿o hay algún problema con eso? No estoy muy seguro, ¿Cuál es tu opinión sobre esta solución?

 
Igor Bakhrushen #:

Artem hola! Aquí hay un build basado en dpi..... Pero básicamente se puede ir de otra manera. Digamos que se establece el tamaño de la cabecera, calcular el tamaño de la altura de la línea del panel y la altura del texto basado en el tamaño de la cabecera. Usted especifica dos parámetros... y cualquiera que sea el dpi. ¿o hay algún problema con eso? No estoy muy seguro, ¿Cuál es tu opinión sobre esta solución?

Todo tiene que ser probado. No puedo hacerlo sin un monitor. Así que no tengo nada que decir, por desgracia.
 
Bien, gracias por este código :)
 

Buena idea lo del panel. Pero me he dado cuenta de que el panel cae espontáneamente a la parte inferior del gráfico cuando se cambia a él desde otro gráfico. Ejemplo:


 
Denis Kirichenko #:

Buena idea lo del panel. Pero me he dado cuenta de que el panel cae espontáneamente a la parte inferior del gráfico cuando se cambia a él desde otro gráfico. Ejemplo:

Hmm. Interesante fenómeno. Tendré que investigarlo en mi tiempo libre. Lo más probable es que el motivo sea el cambio de tamaño del gráfico inactivo.

 
Hasta ahora he averiguado que así es como se gestiona el evento CHARTEVENT_CHART_CHANGE(9).