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)" - página 2

 
Thomas Schwabhäuser:

...

Gracias por el consejo.

Voy a añadir esta capacidad. Esté atento a las actualizaciones de futuros artículos de esta serie.

 

en tus ejemplos siempre sale id, lparam, dparam, sparam.

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)

     {

      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

      //Print(m_spin_edit1.GetValue());

     }

obtenemos lo siguiente

TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:

id - identificador del elemento

lparam - ?

dparam - ?

sparam - nombre del elemento

estamos considerando un campo de entrada - por supuesto es interesante obtener el valor introducido, ¿cómo hacerlo lo más rápido posible?

 
Pavel Kolchin:

en tus ejemplos siempre sale id, lparam, dparam, sparam.

...

id - identificador del elemento

lparam - ?

dparam - ?

sparam - nombre del elemento

Los controles generan mensajes y los parámetros en la mayoría de los casos significan lo siguiente:

  • id - identificador del evento.
  • lparam - identificador del elemento.
  • dparam - índice del elemento.
  • sparam - texto mostrado especificado por el usuario de la biblioteca (nombre del elemento).

Más adelante prepararé una tabla que muestre el conjunto de parámetros de evento de cada elemento.

Pavel Kolchin:

...

consideramos un campo de entrada - por supuesto es interesante obtener el valor introducido, ¿cómo hacerlo lo más rápido posible?

Simplemente usando el método CSpinEdit::GetValue() puedes obtener el valor actual en el campo de entrada.

Ejemplo:

//--- Ha llegado un evento del campo de entrada
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- Si el ID del artículo es del primer campo de entrada
      if(lparam==m_spin_edit1.Id())
        {
         //--- Imprimir su valor
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
 
Y si no sabemos el nombre o tenemos cien campos, quizás haya un método por id para ver lo que hay o algo como this.GetValue()
 
Pavel Kolchin:
Y si no sabemos el nombre o tenemos un centenar de campos, tal vez hay un método por id para ver lo que hay o algo así como this.GetValue().
Así que cada elemento tiene su propio id de elemento único.
 
Anatoli Kazharski:
Así que cada elemento tiene su propio identificador de elemento único.


if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   if(lparam==m_spin_edit1.Id()){Print(m_spin_edit1.GetValue());}

   if(lparam==m_spin_edit2.Id()){Print(m_spin_edit2.GetValue());}

   if(lparam==m_spin_edit3.Id()){Print(m_spin_edit3.GetValue());}

   if(lparam==m_spin_edit4.Id()){Print(m_spin_edit4.GetValue());}

   if(lparam==m_spin_edit5.Id()){Print(m_spin_edit5.GetValue());}

   if(lparam==m_spin_edit6.Id()){Print(m_spin_edit6.GetValue());}

   if(lparam==m_spin_edit7.Id()){Print(m_spin_edit7.GetValue());}

   if(lparam==m_spin_edit8.Id()){Print(m_spin_edit8.GetValue());}

   if(lparam==m_spin_edit9.Id()){Print(m_spin_edit9.GetValue());}

   ...

}

Me refería a no escribir tal código, tal vez tenga sentido hacerlo.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

pero no tengo muchos campos, la primera opción está bien para mí.

 

Pavel Kolchin:

...

Me refería a no escribir ese código, tal vez tenga sentido hacerlo.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

No tengo una solución todavía cómo hacerlo para todos los get-métodos de todos los elementos. Pero voy a pensar en ello.
 
//+------------------------------------------------------------------+
//| Función ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Tarea sencilla. Cambiar el color de la etiqueta de la casilla de verificación al hacer clic en ella. Marcado - texto verde, desmarcado - rojo. No funciona. Desmarcada se vuelve azul, marcada sigue siendo azul.
 

Alexander Fedosov:

Tarea sencilla. Cambiar el color de la etiqueta de la casilla de verificación al hacer clic en ella. Marcado - texto verde, desmarcado - rojo. No funciona. Desmarcada se vuelve azul, marcada sigue siendo azul.

Ahora puede establecer colores para diferentes estados sólo antes de que el elemento se instale(ejemplo de abajo):

//+------------------------------------------------------------------+
//|| Crea la casilla 1|
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- Guardar el puntero de la ventana
   m_checkbox1.WindowPointer(m_window1);
//--- Establecer propiedades antes de la creación
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- Crear un control
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- Añade el objeto al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| Función ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Tarea sencilla. Cambiar el color de la etiqueta de la casilla de verificación al hacer clic en ella. Marcado - texto verde, desmarcado - rojo. No funciona. Desmarcada se vuelve azul, marcada sigue siendo azul.

¿Qué te parece esto?

   if(lparam==program.m_checkbox.Id())
     {
      if(program.m_checkbox.CheckButtonState()) program.m_checkbox.LabelColor(clrGreen);
      else program.m_checkbox.LabelColor(clrRed);
     }