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)"

 

Novo artigo Interfaces Gráficas VI: Os Controles Caixa de Seleção, Campo de Edição e seus Tipos Combinados (Capítulo 1) foi publicado:

Este artigo é o começo da sexta parte da série dedicada ao desenvolvimento da biblioteca para a criação de interfaces gráficas nos terminais MetaTrader. No primeiro capítulo, nós vamos discutir o controle caixa de seleção, o controle campo de edição e seus tipos combinados.

Este elemento será composto por três objetos gráficos. Eles são:

  1. Fundo
  2. Ícone (botão)
  3. Rótulo de texto

Fig. 1. Partes integrantes do controle caixa de seleção.

Fig. 1. Partes integrantes do controle caixa de seleção.

Autor: Anatoli Kazharski

 

Mas "piscar" ao atingir valores extremos não funcionará nos indicadores - Sleep()...

Anatoly, escreva mais uma solicitação de melhoria: o atraso deve ser organizado por meio de um cronômetro, especialmente porque você já tem quase tudo para isso.

 
Artyom Trishkin:

Mas "piscar" ao atingir valores extremos não funcionará nos indicadores - Sleep() ...

Anatoly, escreva mais uma solicitação de melhoria: o atraso deve ser organizado por meio de um cronômetro, especialmente porque você já tem quase tudo para isso.

Eu anotei. A lista está crescendo. Obrigado. )
 
Impressionante.... :)
 

Anatoly, a biblioteca criada por você está em um alto grau de prontidão e decidi tentar criar um pequeno projeto para mim mesmo usando-a. Estou escrevendo neste tópico para que fique claro a qual elemento a pergunta se refere. Para o campo de entrada (SpinEdit), é necessário inserir valores com uma precisão de dois décimos. Eu defini as propriedades correspondentes (StepValue e StepDigits) no procedimento de criação do campo (veja o código abaixo):

...
   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);
...

E, após a compilação, recebi um erro: 'StepValue' - nenhuma das sobrecargas pode ser aplicada à chamada de função.

Logicamente, se o número de caracteres de um valor for menor que 1, o incremento do valor da etapa também poderá ser menor que um. Ao mesmo tempo, no código da classe, a verificação do valor inserido é feita apenas para não negatividade.

...

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

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

A questão é que não está claro para mim de onde vem o erro.

Então, tenho uma pergunta ou um desejo. E se não precisarmos controlar o valor mínimo/máximo e ele for limitado apenas pelo tamanho da variável do tipo double usada para armazená-lo? Pelo que entendi do código, a definição dos valores mínimo e máximo é obrigatória. É possível adicionar meu desejo à lista de aprimoramentos? Ou seja, se os valores mínimo/máximo de um campo não forem especificados, o controle dos valores inseridos será realizado somente quando ele entrar no intervalo da variável do tipo double.

 
Pavel Trofimov:

E, após a compilação, recebi o seguinte erro: 'StepValue' - nenhuma das sobrecargas pode ser aplicada à chamada de função.

...

A questão é que não está claro para mim de onde vem o erro.

Você tem um erro de digitação. Use um ponto "." como separador. :

   m_spin_edit_Depo.StepValue(0. 01);

//---

Em seguida, tenho uma pergunta ou um desejo. E se eu não precisar controlar o valor mínimo/máximo e ele for limitado apenas pelo tamanho da variável do tipo doubleusada para seu armazenamento ? Pelo que entendi do código, a definição dos valores mínimo/máximo é obrigatória. É possível adicionar meu desejo à lista de aprimoramentos? Ou seja, se os valores mínimo/máximo de um campo não forem especificados, o controle dos valores inseridos será realizado somente quando eles entrarem no intervalo da variável do tipo double.

Por enquanto, você pode definir o máximo e o mínimo à força. Assim:

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

Você cometeu um erro de digitação. Use um ponto final "." como separador. :

//---

Você pode forçar o máximo e o mínimo por enquanto. Aqui está:

Muito obrigado pela dica sobre o erro de digitação. No meu código, meus olhos estão "ensaboados". E sobre forçar a configuração do máximo e do mínimo - tudo bem. Vou escrever isso para mim mesmo. Mais uma vez, muito obrigado!
[Excluído]  

Olá, senhor, estou interessado em seu artigo, mas ainda sou novato em GUI e mql,
. Por favor, diga-me como obter o valor do Spin edit para que ele possa ser lido no EA.

Atenciosamente

 
Hidayat Nur Wahit:

Olá, senhor, estou interessado em seu artigo, mas ainda sou novato em GUI e mql,
. Por favor, diga-me como obter o valor do Spin edit para que ele possa ser lido no EA.

Atenciosamente

Por exemplo, de um artigo no manipulador de eventos CProgram::OnEvent():

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());
        }
     }
  }
[Excluído]  
Anatoli Kazharski:

Por exemplo, de um artigo no manipulador de eventos CProgram::OnEvent():

Obrigado, senhor, e agora ele leu bem o valor e o aplicará em meu EA.
 

Caro Anatoli Kazharski, muito obrigado por essa excelente biblioteca!

Adoro a aparência e a sensação das interfaces resultantes.

Ao começar a adaptar a Test Library 10.mq5 às minhas necessidades pessoais, achei que valia a pena mencionar que me ajudou muito adicionar o método

void CSpinEdit::LabelText(const string new_text)

à classe CSpinEdit que não faz nada além de adiar qualquer chamada para CLabel::Description(const string new_text). O motivo é que estou usando um CSpinEdit para diferentes tipos de valores, dependendo do estado de um CComboBox. Depois de alterar o rótulo com LabelText(text) e escolher o formato de edição apropriado, os valores são exibidos conforme desejado depois de chamar

void CSpinEdit::ChangeValue(const double value)

Mais uma vez, obrigado e cumprimentos