Discussão do artigo "Interfaces Gráficas VI: Os Controles Caixa de Seleção, Campo de Edição e seus Tipos Combinados (Capítulo 1)" - página 2

 
Thomas Schwabhäuser:

...

Obrigado pela dica!

Vou adicionar esse recurso. Fique atento às atualizações dos futuros artigos desta série.

 

Em seus exemplos, sempre há id de saída, 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());

     }

obtemos o seguinte

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

id - identificador de elemento

lparam - ?

dparam - ?

sparam - nome do elemento

Estamos considerando um campo de entrada - é claro que é interessante obter o valor inserido, mas como fazer isso o mais rápido possível?

 
Pavel Kolchin:

Em seus exemplos, sempre há saída de id, lparam, dparam e sparam.

...

id - identificador de elemento

lparam - ?

dparam - ?

sparam - nome do elemento

Os controles geram mensagens e parâmetros que, na maioria dos casos, significam o seguinte:

  • id - identificador de evento.
  • lparam - identificador do elemento.
  • dparam - índice do elemento.
  • sparam - texto exibido especificado pelo usuário da biblioteca (nome do elemento).

Mais tarde, prepararei uma tabela mostrando o conjunto de parâmetros de evento de cada elemento.

Pavel Kolchin:

...

Consideramos um campo de entrada - é claro que é interessante obter o valor inserido, mas como fazer isso o mais rápido possível?

Basta usar o método CSpinEdit::GetValue() para obter o valor atual no campo de entrada.

Exemplo:

//--- Chegou um evento do campo de entrada
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- Se o ID do item for do primeiro campo de entrada
      if(lparam==m_spin_edit1.Id())
        {
         //--- Emite seu valor
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
 
E se não soubermos o nome ou se tivermos centenas de campos, talvez haja um método por id para ver o que está lá ou algo como this.GetValue()
 
Pavel Kolchin:
E se não soubermos o nome ou se tivermos cem campos, talvez haja um método por id para ver o que há lá ou algo como this.GetValue().
Assim, cada elemento tem seu próprio ID de elemento exclusivo.
 
Anatoli Kazharski:
Assim, cada elemento tem seu próprio identificador de elemento exclusivo.


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());}

   ...

}

Eu pretendia não escrever esse código, mas talvez faça sentido fazê-lo.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

Mas como não tenho muitos campos, a primeira opção é adequada para mim.

 

Pavel Kolchin:

...

Eu pretendia não escrever esse código, mas talvez faça sentido fazê-lo.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

Ainda não tenho uma solução de como fazer isso para todos os métodos get de todos os elementos. Mas vou pensar sobre isso.
 
//+------------------------------------------------------------------+
//| Função 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);
     }
  }
//+------------------------------------------------------------------+
Tarefa simples. Alterar a cor do rótulo da caixa de seleção ao clicar na caixa de seleção. Marcada - texto verde, desmarcada - vermelho. Isso não funciona. Se desmarcada, ela fica azul, se marcada, continua azul.
 

Alexander Fedosov:

Tarefa simples. Alterar a cor do rótulo da caixa de seleção ao clicar na caixa de seleção. Marcada - texto verde, desmarcada - vermelho. Isso não funciona. Se desmarcada, ela fica azul, se marcada, continua azul.

Agora você pode definir cores para diferentes estados somente antes de o item ser instalado(exemplo abaixo):

//+------------------------------------------------------------------+
//| Cria a caixa de seleção 1|
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- Salvar o ponteiro da janela
   m_checkbox1.WindowPointer(m_window1);
//--- Definir propriedades antes da criação
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- Criar um controle
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- Adicione o objeto à matriz comum de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| Função 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);
     }
  }
//+------------------------------------------------------------------+
Tarefa simples. Alterar a cor do rótulo da caixa de seleção ao clicar na caixa de seleção. Marcada - texto verde, desmarcada - vermelho. Isso não funciona. Se não estiver marcada, ela fica azul, se estiver marcada, continua azul.

O que você acha disso?

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