Discusión sobre el artículo "Interfaces gráficas VI: Controles "Casilla de verificación", "Campo de edición" y sus tipos combinados (Capítulo 1)"

 

Artículo publicado Interfaces gráficas VI: Controles "Casilla de verificación", "Campo de edición" y sus tipos combinados (Capítulo 1):

Este artículo empieza la sexta parte de la serie sobre el desarrollo de la librería para la creación de las interfaces gráficas en los terminales MetaTrader. En el primer capítulo hablaremos sobre los siguientes controles: “casilla de verificación”, “campo de edición” y los tipos combinados de estos controles.

El control “Casilla de verificación” o “Checkbox” está destinado para manejar los parámetros que pueden tener sólo dos estados. El botón con dos iconos se utiliza para identificar el estado actual del parámetro con el que está vinculado el control. El icono con el signo “marca de verificación” significa el estado “activado” (on). El icono sin el signo “marca de verificación” significa el estado “desactivado” (off). Junto con el botón se encuentra la descripción breve del parámetro. 

Vamos a utilizar tres objetos gráficos para diseñar este control. Son los siguientes:

  1. Fondo
  2. Icono (botón)
  3. Etiqueta de texto


Fig. 1. Partes integrantes del control “Casilla de verificación”.

Vamos a ver cómo está organizada la clase de este control.

Autor: Anatoli Kazharski

 

Pero el "guiño" al alcanzar valores extremos no funcionará en los indicadores - Sleep()...

Anatoly, anote una solicitud más para la mejora: retraso debe organizarse a través de temporizador, sobre todo porque ya tiene casi todo para eso.

 
Artyom Trishkin:

Pero el "guiño" al alcanzar valores extremos no funcionará en los indicadores - Sleep() ...

Anatoly, anota una petición más de mejora: el retardo debería organizarse a través de un temporizador, sobre todo porque ya tienes casi todo para ello.

Lo he anotado. La lista está creciendo. Gracias. )
 
Impresionante.... :)
 

Anatoly, la biblioteca creada por usted está en un alto grado de preparación y decidí tratar de crear un pequeño proyecto para mí usándolo. Escribo en este tema para que quede claro a que elemento se refiere la pregunta. Para el campo de entrada (SpinEdit) es necesario introducir valores con una precisión de dos décimas. Establecí las propiedades correspondientes (StepValue y StepDigits) en el procedimiento de creación del campo (ver el código más abajo):

...
   m_spin_edit_Depo.MaxValue(10000000);
   m_spin_edit_Depo.MinValue(0);
   m_spin_edit_Depo.StepValue(0,01);
   m_spin_edit_Depo.SetDigits(2);
   m_spin_edit_Depo.SetValue(v);
...

Y después de la compilación obtuve un error: 'StepValue' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función.

Lógicamente, si el número de caracteres de un valor es inferior a 1, entonces el incremento del valor del paso también puede ser inferior a uno. Al mismo tiempo, en el código de la clase, la comprobación del valor introducido pasa sólo por la no negatividad.

...

   //--- Шаг значения

   double            StepValue(void)                          const { return(m_step_value);               }
   void              StepValue(const double value)                  { m_step_value=(value<=0)? 1 : value; }
...

La cuestión es que no me queda claro de donde viene el error.

Entonces tengo una pregunta o un deseo. ¿Qué pasa si no necesitamos controlar el valor mínimo/máximo y sólo está limitado por el tamaño de la variable de tipo double utilizada para almacenarlo? Según he entendido del código, establecer los valores mínimo/máximo es obligatorio. ¿Es posible añadir mi deseo a la lista de mejoras? Es decir, si no se especifican los valores mínimo/máximo para un campo, el control de los valores introducidos se realiza sólo al entrar en el rango de la variable de tipo doble.

 
Pavel Trofimov:

Y después de la compilación obtuve el siguiente error: 'StepValue' - ninguna de las sobrecargas se puede aplicar a la llamada a la función.

...

La cuestión es que no me queda claro de dónde viene el error.

Tienes un error tipográfico. Utiliza un punto "." como separador. :

   m_spin_edit_Depo.StepValue(0. 01);

//---

A continuación, tengo una pregunta o un deseo. ¿Qué pasa si no necesito controlar el valor mínimo/máximo y sólo está limitado por el tamaño de la variable de tipo doubleutilizada para su almacenamiento ? Según he entendido del código, establecer los valores mínimo/máximo es obligatorio. ¿Es posible añadir mi deseo a la lista de mejoras? Es decir, si no se especifican los valores mínimo/máximo para un campo, el control de los valores introducidos se realiza sólo al entrar en el rango de la variable de tipo doble.

Por ahora se puede establecer el máximo y el mínimo forzosamente. Así

   m_spin_edit_Depo.MaxValue(DBL_MAX);
   m_spin_edit_Depo.MinValue(-DBL_MAX);
 
Anatoli Kazharski:

Tiene un error tipográfico. Utiliza un punto "." como separador. :

//---

Puedes forzar el máximo y el mínimo por ahora. Ya está:

Muchas gracias por el aviso sobre la errata. En mi código, mis ojos están "enjabonados". Y sobre forzar el máximo y el mínimo - está bien. Lo escribiré para mí. Muchas gracias de nuevo.
[Eliminado]  

Hola señor soy interesante en su artículo, pero yo todavía novato sobre GUI y mql,
puede usted por favor dígame cómo obtener el valor de Spin editar para que pueda ser leído a la EA.

Saludos

 
Hidayat Nur Wahit:

Hola señor soy interesante en su artículo, pero yo todavía novato sobre GUI y mql,
puede usted por favor dígame cómo obtener el valor de Spin editar para que pueda ser leído a la EA.

Saludos

Por ejemplo, de un artículo en CProgram::OnEvent() controlador de eventos:

void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      //--- Если нажали на первом чекбоксе
      if(lparam==m_checkbox1.Id())
        {
         m_checkbox2.CheckBoxState(m_checkbox1.CheckButtonState());
         m_spin_edit1.SpinEditState(m_checkbox1.CheckButtonState());
         
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }

      if(lparam==m_checkbox3.Id())
        {
         m_checkboxedit1.CheckBoxEditState(m_checkbox3.CheckButtonState());
         
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }

      if(lparam==m_checkbox4.Id())
        {
         m_checkcombobox1.CheckComboBoxState(m_checkbox4.CheckButtonState());
        }

      if(lparam==m_checkbox5.Id())
        {
         m_slider1.SliderState(m_checkbox5.CheckButtonState());
         m_dual_slider1.SliderState(m_checkbox5.CheckButtonState());
         
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
      
      if(lparam==m_slider1.Id())
        {
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
        }
        
      if(lparam==m_dual_slider1.Id())
        {
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_CLICK_INC || id==CHARTEVENT_CUSTOM+ON_CLICK_DEC)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
     }
  }
[Eliminado]  
Anatoli Kazharski:

Por ejemplo, de un artículo en CProgram::OnEvent() controlador de eventos:

Gracias señor y ahora bien leer el valor, y se aplicará en mi EA.

Regard's
 

Estimado Anatoli Kaz harski, ¡muchas gracias por esta gran biblioteca!

Me encanta el aspecto de las interfaces resultantes.

Al empezar a adaptar Test Library 10.mq5 a mis necesidades personales pensé que merecía la pena mencionar que me ayudó mucho añadir el método

void CSpinEdit::LabelText(const string new_text)

a la clase CSpinEdit que no hace otra cosa que diferir cualquier llamada a CLabel::Description(const string new_text). La razón es que estoy usando un CSpinEdit para diferentes tipos de valores dependiendo del estado de un CComboBox. Después de cambiar la etiqueta con LabelText(text) y elegir el formato de edición apropiado los valores se muestran como se desea después de llamar a

void CSpinEdit::ChangeValue(const double value)

Gracias de nuevo y saludos