Discusión sobre el artículo "Interfaces gráficas I: Funciones para los botones del formulario y eliminación de los elementos de la interfaz (Capítulo 4)"

 

Artículo publicado Interfaces gráficas I: Funciones para los botones del formulario y eliminación de los elementos de la interfaz (Capítulo 4):

Este artículo es la continuación de la primera parte de la serie sobre las interfaces gráficas. El primer artículo de la serie nos cuenta con más detalles para qué sirve esta librería: Interfaces gráficas I: Preparación de la estructura de la librería (Capítulo 1). Al final de cada capítulo se puede encontrar la lista completa de los enlaces a los artículos de la primera parte, así como descargar la versión completa de la librería en la fase actual del desarrollo del proyecto. Es necesario colocar los ficheros en los mismos directorios, tal como están ubicados en el archivo.

En el artículo anterior, hemos introducido en la clase CWindow los cambios adicionales que permiten desplazar el formulario por el gráfico, y sus controles ahora pueden reaccionar al movimiento del cursor. En el presente artículo vamos a continuar desarrollando la clase CWindow. La clase será ampliada con los métodos que permitirán gestionar el formulario haciendo clics en sus controles. Vamos a implementar la posibilidad de cerrar el programa usando el botón en el formulario, así como minimizar y maximizar el formulario en caso de necesidad.

Eliminación de los controles de la interfaz

Si ha llegado a este momento y ha hecho todo en el mismo orden como se expone en el artículo, ha podido notar que cuando el EA se elimina del gráfico, todos los objetos de la interfaz gráfica se eliminan. Pero no hemos considerado aún los métodos para la eliminación de los objetos gráficos del gráfico. ¿Por qué los objetos se eliminan cuando se elimina el EA? Este momento se atiende en la librería estándar de las clases. A saber, en el destructor de la clase CChartObject, cuyas clases derivadas se utilizan en nuestra librería. Al ser eliminado el programa del gráfico, se llaman los destructores de las clases, inclusive éste. Y si el objeto ha sido adjuntado a este gráfico, entonces se elimina (véase el código):

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChartObject::~CChartObject(void)
  {
   if(m_chart_id!=-1)
      ::ObjectDelete(m_chart_id,m_name);
  }

Pero si cambiamos el símbolo del gráfico o su período de tiempo cuando el EA se encuentra en el gráfico, los destructores no se llaman, y los objetos gráficos en este caso no se eliminan. Y como la interfaz gráfica se crea en la función de inicialización OnInit() en el archivo principal del programa, y cuando se cambia el símbolo o el período de tiempo del EA primero se realiza la deinicialización y luego la inicialización, entonces la interfaz gráfica se creará por encima de la que ya existe. Como resultado, la primera manipulación de este tipo le dará dos copias de objetos, y si va a seguir cambiando el símbolo o el período, obtendrá varias copias de objetos de la interfaz.

Fig. 4. Prueba del formulario al cambiar el símbolo y período de tiempo del gráfico.

Fig. 4. Prueba del formulario al cambiar el símbolo y período de tiempo del gráfico

Autor: Anatoli Kazharski

Razón de la queja: