Galeria de UIs escritas em MQL - página 66

 
Vamos continuar com uma nova página.
 

12. Obter/definir programaticamente os limites de valor docontrole deslizante e docampo com botões (_V_MIN, _V_MAX, _V_STEP, _DIGITS).

1. vamos abrir uma janela com elementos com os parâmetros acima:

int _OnInit()
  {
   //------------------------------------------------
   //Open the window "Settings example 1".
   //------------------------------------------------
   w_6_Settings_example_1();
   //------------------------------------------------


2. Vamos escrever os valores de _V_MIN, _V_MAX, _V_STEP, _DIGITS e enviá-los para o registro:

   //------------------------------------------------
   //Get parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   int Min_value = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_MIN);
   int Max_value = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_MAX);
   int Step      = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_V_STEP);
   int digits    = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_DIGITS);
   //------------------------------------------------
   //Print the results:
   //------------------------------------------------
   Print("Min_value:  ",Min_value,"  Max_value:  ",Max_value,"  Step:  ",Step,"  digits:  ",digits);
   //------------------------------------------------

Resultado: os valores das propriedades dos parâmetros do controle deslizante são registrados.


//---------------------------------------------------------------------------------------------------------------------------------------


3. Vamos repetir a operação com o campo com botões. Ao contrário do controle deslizante, o campo tem outros limites numéricos e seu tipo de valor é duplo.

   //------------------------------------------------
   //Get parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   double _Min_value  =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_MIN);
   double _Max_value  =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_MAX);
   double _Step       =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_V_STEP);
   double _digits     =  w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_DIGITS);
   //------------------------------------------------
   Print("Min_value:  ",_Min_value,"  Max_value:  ",_Max_value,"  Step:  ",_Step,"  digits:  ",_digits);
   //------------------------------------------------ 

Resultado:os valores das propriedades de parâmetro do campo com botões são exibidos no registro.


//---------------------------------------------------------------------------------------------------------------------------------------


4. Defina outros limites do intervalo do controle deslizante (testado pela primeira vez, o resultado é desconhecido).

   //------------------------------------------------
   //Set parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP.
   //------------------------------------------------
   Min_value = -100;
   Max_value = 100;
   Step      = 1;
   //-----------------
   w6_i_p3_H_SLIDER_Roll_the_value(Min_value, p3_V_MIN);
   w6_i_p3_H_SLIDER_Roll_the_value(Max_value, p3_V_MAX);
   w6_i_p3_H_SLIDER_Roll_the_value(Step,      p3_V_STEP);
   //------------------------------------------------

Resultado: *Encontrado umproblema com o intervalo em números negativos (correção na próxima versão).




Vamos verificar com limites de intervalo positivos:

   //------------------------------------------------
   //Set parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP.
   //------------------------------------------------
   Min_value = 0;
   Max_value = 1000;
   Step      = 1;
   //-----------------
   w6_i_p3_H_SLIDER_Roll_the_value(Min_value, p3_V_MIN);
   w6_i_p3_H_SLIDER_Roll_the_value(Max_value, p3_V_MAX);
   w6_i_p3_H_SLIDER_Roll_the_value(Step,      p3_V_STEP);
   //------------------------------------------------


Resultado: os limites do intervalo foram alterados com sucesso.


Ponto principal: O intervalo do controle deslizante pode ser alterado usando sua função.

**Importante:você não pode alterar retroativamente o tipo de valor do parâmetro de int para double ou vice-versa.

//-------------------------------------------------------------------------------------------------


Vamos realizar um experimento semelhante com o campo de entrada:

   //------------------------------------------------
   //Set NEW parameter properties, such as: 
   //_V_MIN, _V_MAX, _V_STEP, _DIGITS
   //------------------------------------------------
   double _Min_value  = -100.0;
   double _Max_value  =  100.0;
   double _Step       =  2.5;
   //-----------------
   //Set another default value---
   w6_d_p5_S_EDIT_Spin_the_value(50.5);
   //-----------------
   w6_d_p5_S_EDIT_Spin_the_value(_Min_value,p5_V_MIN);
   w6_d_p5_S_EDIT_Spin_the_value(_Max_value,p5_V_MAX);
   w6_d_p5_S_EDIT_Spin_the_value(_Step     ,p5_V_STEP);
   //------------------------------------------------

Resultado: Funciona como planejado. O campo com botões aceita o intervalo e a etapa especificados. Se o intervalo for excedido, ele relatará um erro no registro.

//--------------------------------------------------------------------------------------------------


5. Por fim, vamos definir o value_DIGITS para o campo com botões (o controle deslizante não funcionará porque seu tipo de parâmetro é int):

  • Vamos definir o valor da etapa com quatro dígitos após o ponto final.
  • A variável digits é definida como 4 (quatro casas decimais).

       //------------------------------------------------
       //Set parameter properties, such as: 
       //_V_MIN, _V_MAX, _V_STEP, _DIGITS
       //------------------------------------------------
       double _Min_value  = -100.0;
       double _Max_value  =  100.0;
       double _Step       =  2.5567;
              digits      =  4;
       //-----------------
       //Set another default value---
       w6_d_p5_S_EDIT_Spin_the_value(50.5);
       //-----------------
       w6_d_p5_S_EDIT_Spin_the_value(_Min_value,p5_V_MIN);
       w6_d_p5_S_EDIT_Spin_the_value(_Max_value,p5_V_MAX);
       w6_d_p5_S_EDIT_Spin_the_value(_Step     ,p5_V_STEP);
     
       //Set the new number of digits:
       w6_d_p5_S_EDIT_Spin_the_value(digits    ,p5_DIGITS);
       //------------------------------------------------


    Resultado:

    • No início, havia três dígitos após o ponto decimal (o número original antes da alteração do software).


    • Em seguida, a chamada de software aumentou a precisão para quatro dígitos:


    • Em seguida, para 7 dígitos:
    //Setting 7 digits after the decimal point:
    
    w6_d_p5_S_EDIT_Spin_the_value(7,p5_DIGITS);



    Resultados:

    • A capacidade de redefinir programaticamente os limites originais do intervalo de números do campo de botão e do controle deslizante está disponível.
    • É possível alterar programaticamente a precisão inicial do valor duplo, definindo um número diferente de casas decimais.
    • O controle deslizante tem um problema com o cálculo de valores dentro dos limites de números negativos (será corrigido).
    • O tipo original do parâmetro do elemento não pode ser redefinido.

    Isso conclui este tópico.

    Графические интерфейсы VI: Элементы "Слайдер" и "Двухсторонний слайдер" (Глава 2)
    Графические интерфейсы VI: Элементы "Слайдер" и "Двухсторонний слайдер" (Глава 2)
    • www.mql5.com
    В предыдущей статье разрабатываемая библиотека была пополнена сразу четырьмя довольно часто используемыми в графических интерфейсах элементами управления: «чекбокс», «поле ввода», «поле ввода с чекбоксом» и «комбобокс с чекбоксом». Вторая глава шестой части серии будет посвящена таким элементам управления, как слайдер и двухсторонний слайдер.
     

    13. Consultando o estado dos elementos _GET_STATE.

    Muitas vezes, há situações em que é necessário obter programaticamente o estado de um ou outro elemento da interface. Para resolver esse problema, foi criado o identificador _GET_STATE.

    //--------------------------------------------------------------------------------------------------------------------

    *Importante:na função request_GET_STATE, a função retorna o índice do estado atual do elemento.

    //--------------------------------------------------------------------------------------------------------------------

    A imagem abaixo mostra a lista de estados do elemento.

    1. identificadores de estado :

    (*napróxima versão, o prefixo v_ será substituído pelo prefixo s_)


    Saída de índices para o registro:

      v_NEUTRAL_STATE           15
      //-----------------------------
      v_ACTIVATED_STATE         62
      //-----------------------------
      v_NEUTRAL_BLOCKED         64
      //-----------------------------
      v_ACTIVATED_BLOCKED       65   
      //----------------------------- 
      v_NEUTRAL_HIGHLIGHTED     66  
      //-----------------------------
      v_ACTIVATED_HIGHLIGHTED   67


    Vamos testar a consulta e a recuperação de estados de elementos:

    1. abra a janela e obtenha o estado inicial do botão "Iniciar":


    int _OnInit()
      {
       //------------------------------------------------
       //Open the window "Settings example 1".
       //------------------------------------------------
       w_6_Settings_example_1();
       //------------------------------------------------
       //Get state of button "Start":
       //------------------------------------------------
       int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
       //------------------------------------------------
       //Print out:
       //------------------------------------------------
       Print("Button state:  ",Button_state);
       //------------------------------------------------


    Resultado: é obtido o valor 15 correspondente ao estado v_NEUTRAL_STATE.



    2. Vamos registrar os estados do botão quando ele for pressionado e liberado:

    Para fazer isso:

    • Vamos localizar o botão no arquivo da API.
    • Escreva uma solicitação _GET_STATE para ambos os casos - pressionado e liberado.
    case Settings_example_1___Start:
    
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the button is pressed or released?
                   //------------------------------------------------------------------------------------------------------
                   switch((int)action)
                   {
                    //------------------------------------------------------------------------
                    case pressed: 
                                   {
                                    //Get button's state when it pressed:
                                    int Button_state =  w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Button state:  ",Button_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case released: 
                                   {
                                    //Get button's state when it released:
                                    int Button_state =  w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Button state:  ",Button_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                   }
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    


    Resultado: no evento pressionado/liberado, o índice do estado atual é impresso no registro.

    Lembrete:

    15 = v_NEUTRAL_STATE
    
    62 = v_ACTIVATED_STATE

    //----------------------------------------------------------------------------------------------------------------


    3. Vamos repetir a consulta com a caixa de seleção.



    1. Vamos obter o estado da caixa de seleção no evento de abertura da janela:

       //------------------------------------------------
       //Open the window "Settings example 1".
       //------------------------------------------------
       w_6_Settings_example_1();
       //------------------------------------------------
       
       //Get the state of the checkbox when it checked:
       int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
       
       //Print out the result:
       Print("Checkbox state:  ",Checkbox_state);
       //------------------------------------------------

    Resultado: o valor 15 é obtido, correspondendo ao estado neutro v_NEUTRAL_STATE (onde está a caixa de seleção).




    2. Em seguida, vamos consultar os estados da caixa de seleção no evento de pressionar e liberar.

    Para fazer isso:

    • Vamos localizar a caixa de seleção"Set an option" no arquivo de API.
    • Vamos escrever a consulta _GET_STATE para ambos os casos - marcada e desmarcada.
    case Settings_example_1___Set_an_option:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the checkbox is checked or unchecked? 
                   //------------------------------------------------------------------------------------------------------
                    case checked: 
                                   {
                                    //Get checkbox state when it checked:
                                    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Checkbox state:  ",Checkbox_state);
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case unchecked: 
                                   {
                                    //Get checkbox state when it unchecked:
                                    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
                                    
                                    //Print out the result:
                                    Print("Checkbox state:  ",Checkbox_state);
                                   }
                    break;
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;


    Resultado: obtemos os valores 66 (v_NEUTRAL_HIGHLIGHTED) e 67 (v_ACTIVATED_HIGHLIGHTED), que significam o estado neutro destacado e o estado pressionado destacado.

    //-----------------------------------------------------------------------------------------------

    Isso conclui a primeira parte do tópico.

    Na segunda parte, retornaremos os estados da lista suspensa D_LIST, do controle deslizante H_SLIDER e dos campos de entrada S_EDIT e EDIT.

    [Excluído]  
    Comecei a usar uma bolsa de ativos criptográficos chamada coinsbitfx.com. A Coins Bit FX afirmava estar registrada na National Futures Association para convencer os usuários de sua legitimidade. Em algum momento, acreditei que minha conta havia aumentado de valor para US$ 135.134. Mas quando tentei sacar fundos da minha conta, a bolsa me informou que a transação estava "sob análise". Desde então, o residente não conseguiu entrar em contato com ninguém no site e não pode acessar os fundos investidos. Isso mexeu com minha cabeça, então li sobre o RECOVERYCOINGROUP AT GMAIL DOT COM em um blog, fiz minha pesquisa e decidi usar seus serviços; em menos de 72 horas, meus fundos foram todos recuperados e, como se isso não bastasse, eles também recuperaram o BTC de meus amigos. Por isso, tenho a coragem de informar o mundo sobre esses caras. Fique à vontade para entrar em contato com o Recovery Coin Group hoje mesmo e me agradeça depois !
     

    13. Solicitação de status _GET_STATE.

    Parte 2: Obtendo os estados dos elementos D_LIST, H_SLIDER, EDIT, S_EDIT.

    Na última parte, vimos como retornar programaticamente os estados do botão BUTTON e da caixa de seleção CHECKBOX . A consulta _GET_STATE foi usada e a lista de nomes de estados retornados pelas funções foi mostrada. Há seis nomes no total, e cada um começa com o prefixo v_. (Uma abreviação de value, que será substituída por s_ - uma abreviação de state).

    Lembre-se dos índices de estado:

      v_NEUTRAL_STATE           15
      //-----------------------------
      v_ACTIVATED_STATE         62
      //-----------------------------
      v_NEUTRAL_BLOCKED         64
      //-----------------------------
      v_ACTIVATED_BLOCKED       65   
      //----------------------------- 
      v_NEUTRAL_HIGHLIGHTED     66  
      //-----------------------------
      v_ACTIVATED_HIGHLIGHTED   67

    Nesse caso, os números de índice específicos não são importantes. Quando o usuário precisa colocar um determinado estado em uma condição, ele usa um identificador.

    Exemplo 1:

    //Getting state of the first element:
    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
    
    //Getting state of the second element:
    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
    
    
    //Setting conditions for both elements when they're simultaneously ON:
    if(Button_state == v_ACTIVATED_STATE)
      { 
       //Is the checkbox was already on:
        if(Checkbox_state == v_ACTIVATED_STATE)
          {
           Function_1();
          }
        //If the checkbox was the last pressed element and still highlighted:
        if(Checkbox_state == v_ACTIVATED_HIGHLIGHTED)
          {
           Function_2();
          }
      }


    Exemplo 2:

    //Getting state of the first element:
    int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
    
    //Getting state of the second element:
    int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
    
    
    //Setting conditions for one element being ON, while the other is OFF:
    if(Button_state == v_ACTIVATED_STATE)
      { 
       //If the checkbox was already off:
        if(Checkbox_state == v_NEUTRAL_STATE)
          {
           Function_A();
          }
        //If the checkbox was just turned off and still highlighted:
        if(Checkbox_state == v_NEUTRAL_HIGHLIGHTED)
          {
           Function_B();
          }
      }

    //-----------------------------------------------------------------------------------------------------------------

    *Muito importante:

    Vou explicar a diferença essencial entre os estados v_NEUTRAL_STATE e v_NEUTRAL_HIGHLIGHTED, e entre v_ACTIVATED_STATE e v_ACTIVATED_HIGHLIGHTED:

    v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время.
    
    v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED. 

    o mesmo se aplica ao estado ativado:

    v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время.
    
    v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED. 

    Essa diferença faz uma grande diferença.

    Atualmente, o botão e alguns outros elementos retornam apenas v_NEUTRAL_STATE e v_ACTIVATED_STATE, e não retornam estados REALÇADOS como uma caixa de seleção. Isso significa que o usuário não tem como saber se os itens foram clicados/desclocados agora ou quando, há um tempo indefinido. No entanto, o usuário pode capturar o momento em que eles foram pressionados no arquivo da API. Sim, mas esse recurso ainda não está disponível no restante do programa. Na próxima versão, o retorno de estado em DESTAQUE será adicionado a todos os elementos interativos. Dessa forma, de qualquer lugar do programa, o usuário poderá saber se um elemento acabou de ser pressionado/despressurizado ou se está em seu estado há muito tempo.

    //----------------------------------------------------------------------------------------------------------


    Vamos passar para a parte prática:

    • Vamos abrir duas janelas com os elementos D_LIST, H_SLIDER, EDIT e S_EDIT.
    • Vamos retornar os estados dos elementos imediatamente após a abertura.

    1. abra as janelas:

    int _OnInit()
      {
       //------------------------------------------------
       //Open the windows "Settings example 1" and "Settings example 2".
       //------------------------------------------------
       w_6_Settings_example_1();
       w_7_Settings_example_2();
       //------------------------------------------------


    2. Vamos obter os estados dos elementos:

       //------------------------------------------------
       //Get the states of the elements S_EDIT, H_SLIDER, EDIT and D_LIST
       //------------------------------------------------
       //1. State index is type int, S_EDIT's function is double. Convert the types.
       int S_edit_state   = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_GET_STATE); 
       
       //2. Getting the slider's state. 
       int H_slider_state =      w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
       
       //3.State index is type int, EDIT's function is string. Convert the types. 
       int Edit_state     = (int)w7_s_p4_EDIT_Comment_3(get_s,p4_GET_STATE);
       
       //State index is type int, D_LIST's function is string. Convert the types.
       int D_list_state   = (int)w7_s_p6_D_LIST_D_LIST_1(get_s,p6_GET_STATE);
       //------------------------------------------------
       
       //Print out the results:
       Print("S_edit_state   = ",S_edit_state);
       Print("H_slider_state = ",H_slider_state);
       Print("Edit_state     = ",Edit_state);
       Print("D_list_state   = ",D_list_state);
       //------------------------------------------------


    Resultado: todos os elementos do cnome D_LISTtêm o índice de estado 15 (estado neutro v_NEUTRAL_STATE). D_LIST retornou um erro (-1).


    Motivo: o retorno dos estados desse elemento não está especificado na função central. Defeito técnico.Ele será corrigido na próxima versão.

    Como a função D_LIST ainda não retorna o índice de estado, vamos nos concentrar em três itens cujos estados foram recebidos com êxito: EDIT , S_EDIT e H_SLIDER.

    O que verificar:

    • Quais índices a função retorna quando os elementos são bloqueados e clicados.
    • Se os elementos fornecidos têm um estadoREALÇADO ( destacado). Em outras palavras, se é possível saber se o elemento acabou de ser clicado ou não.

    Acabamos de verificar que as funções de elemento EDIT, S_EDIT e H_SLIDER retornam um índice do estado neutro quando a janela é aberta. Resta verificar os outros estados. Como esses tipos de elementos, em teoria, só podem estar nos estados neutro, bloqueado e realçado (ao contrário dos botões e caixas de seleção, que têm mais estados), temos que verificar os dois estados possíveis a seguir: bloqueado e realçado. Há também um grupo de estados"sob o cursor", que não quero adicionar ainda para evitar confusão. Nas próximas versões, criarei um prefixo especial que abre uma lista individual de possíveis estados de cada tipo de elemento. Isso facilitará o trabalho programático.

    Como verificaremos o retorno dos estados bloqueados e destacadosEDIT, S_EDIT e H_SLIDER:

    • Vamos localizar a caixa de seleção "Definir uma opção" no arquivo da API.
    • Vamos escrever o bloqueio/desbloqueio dos elementos EDIT, S_EDIT e H_SLIDER dentro de seu caso e imprimir() os estados dos elementos lá.
    • Vamos localizar os elementos EDIT, S_EDIT e H_SLIDER no arquivo de API.
    • Escreva um retorno de estado no evento de inserção de um valor nesses elementos.
    • Vamos imprimir o resultado obtido por meio de Print().
    //-------------------------------------------------------------------------------------------------

    1. Localize a caixa de seleção "Set an option" (Definir uma opção) no arquivo de API e escreva o bloqueio/desbloqueio dos elementosEDIT, S_EDIT e H_SLIDER em seu caso.Em seguida, produza os estados por meio de Print().

    case Settings_example_1___Set_an_option:
      
                switch((int)action)
                   {
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the checkbox is checked or unchecked? 
                   //------------------------------------------------------------------------------------------------------
                    case checked: 
                                   {
                                    //-----------------------------------------------
                                    //Locking EDIT:
                                    w7_s_p4_EDIT_Comment_1(p4_LOCK);
                                    
                                    //Locking H_SLIDER:
                                    w6_i_p3_H_SLIDER_Roll_the_value(p3_LOCK);
                                    
                                    //Locking S_EDIT:
                                    w6_d_p5_S_EDIT_Spin_the_value(p5_LOCK); 
                                    
                                    //-----------------------------------------------
                                    //Getting state of EDIT:
                                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
    
                                    //Getting state of H_SLIDER:
                                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
    
                                    //Getting state of S_EDIT:
                                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    //-----------------------------------------------
                                    
                                    //Printing results:
                                    Print("EDIT_state      = ",EDIT_state);
                                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                                    Print("S_EDIT_state    = ",S_EDIT_state);
                                    //-----------------------------------------------
                                   }
                    break;
                    //------------------------------------------------------------------------
                    case unchecked: 
                                   {
                                    //-----------------------------------------------
                                    //Unlocking the element EDIT:
                                    w7_s_p4_EDIT_Comment_1(p4_UNLOCK);
                                    
                                    //Unlocking H_SLIDER:
                                    w6_i_p3_H_SLIDER_Roll_the_value(p3_UNLOCK);
                                    
                                    //Unlocking S_EDIT:
                                    w6_d_p5_S_EDIT_Spin_the_value(p5_UNLOCK);
                                    
                                    //-----------------------------------------------
                                    //Getting state of EDIT:
                                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
    
                                    //Getting state of H_SLIDER:
                                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
    
                                    //Getting state of S_EDIT:
                                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    //-----------------------------------------------
                                    
                                    //Printing results:
                                    Print("EDIT_state      = ",EDIT_state);
                                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                                    Print("S_EDIT_state    = ",S_EDIT_state);
                                    //-----------------------------------------------
                                   }
                    break;
                   } 
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;


    Resultado:

    • No caso de clicar na caixa de seleção, as funções de elemento retornam o índice 64, que corresponde ao estado v_NEUTRAL_BLOCKED (neutro-bloqueado).
    • No caso de desmarcar a caixa de seleção, as funções de elemento retornam um índice de 15, que corresponde ao estado v_NEUTRAL_STATE (estado neutro).

    //--------------------------------------------------------------------------------------------------

     

    2. Segunda tarefa:

    • Localize os elementosEDIT, S_EDIT, H_SLIDER no arquivo de API e prescreva a obtenção do estado quando um valor for inserido para ver se suas funções retornam um índice HIGHLIGHTED ( realçado).

    Primeiros passos:

    case Settings_example_2___Comment_1:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the text is entered?
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of EDIT:
                    int EDIT_state =  (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
                                    
                    //Printing the results:
                    Print("EDIT_state      = ",EDIT_state);
                   } 
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    case Settings_example_1___Roll_the_value:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the slider's handle is moved?
                   //------------------------------------------------------------------------------------------------------
                   //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  75  |  Digits: Integer value
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of H_SLIDER:
                    int H_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE); 
                                    
                    //Printing results:
                    Print("H_SLIDER_state  = ",H_SLIDER_state);
                   }           
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;
    case Settings_example_1___Spin_the_value:
      
                   //------------------------------------------------------------------------------------------------------
                   //What to do when the value is set?
                   //------------------------------------------------------------------------------------------------------
                   //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
                   //------------------------------------------------------------------------------------------------------
                   {
                    //Getting state of S_EDIT:
                    int S_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE); 
                                    
                    //Printing results:
                    Print("S_EDIT_state    = ",S_EDIT_state); 
                   }
                   //------------------------------------------------------------------------------------------------------
                   //Your comment:
                   //------------------------------------------------------------------------------------------------------
                   break;

    Resultado:

    • EDIT: em um evento de interação do usuário, retorna um índice de estado de 67, o que significav_ACTIVATED_HIGHLIGHTED ( ativado, realçado).

    • S_EDIT: Em um evento de interação do usuário, retorna um índice de estado de 67, o que significav_ACTIVATED_HIGHLIGHTED ( ativado, realçado).
    • H_SLIDER: Em um evento de interação do usuário, retorna alternadamente os índices 66 e 67, o que significav_NEUTRAL_HIGHLIGHTED ( neutro, iluminado) ev_ACTIVATED_HIGHLIGHTED (ativado, iluminado).Bug. Correção na próxima versão.



    //-----------------------------------------------------------------------------------------------------

    Resultados:

    Em geral, os resultados podem ser avaliados como satisfatórios. Os elementos retornam índices de estados neutros e bloqueados conforme pretendido. No entanto, há algumas deficiências:

    • A função do elemento D_LIST não retorna nenhum estado.
    • A função do elemento H_SLIDER retorna alternadamente os índices dos estadosv_NEUTRAL_HIGHLIGHTED ev_ACTIVATED_HIGHLIGHTED em vez de um índice - v_ACTIVATED_HIGHLIGHTED(ativado, iluminado).

    Conclusões:

    • É necessário corrigir as deficiências.
    • É necessário criar uma lista de intellisense chamada por um prefixo especials_ para que o usuário possa saber quais tipos de elementos têm quais estados e usá-los facilmente no código.

    Potencialmente, é possível adicionar novos estados de elementos. Por exemplo, Neutro apontado e Ativado apontado ( neutro sob o cursor e ativado sob o cursor), mas há uma questão de praticidade e a necessidade real do usuário de ter esses recursos. Até que tais requisitos não sejam recebidos, não adicionarei novos estados.

    Esse é o fim deste tópico.


    Mais adiante, nos tópicos a seguir.

     

    Passei a última semana pesquisando como escrever uma interface usando o WinForm e incorporá-la aos gráficos do MT5. Hoje, finalmente, consegui fazer isso.

     
    O upload de um vídeo é mais fácil do que o upload de um gif e o arquivo é menor.
     

    Uma lista geral de tópicos a serem considerados:

    1. orientação na lista do intellisense e seleção da função da janela correta.

    2. Abertura e fechamento de janelas de forma programática.

    3. abertura de uma lista de elementos de janela disponíveis programaticamente.

    4. abertura de uma lista de propriedades de elementos individuais.

    5. Analisar o nome do elemento e a função do wrapper da janela.

    6. retorno do valor de um parâmetro de elemento para uma variável de seu tipo.

    7. Definir valores para parâmetros de elementos de tipos diferentes.

    8. Retorno, alteração e encaminhamento de valores entre parâmetros de diferentes elementos. Considere diferentes tipos de elementos e valores e teste o encaminhamento entre diferentes tipos de elementos em diferentes janelas.

    9. Retornar o valor anterior (_V_LAST). Quando e para quais casos o último valor é necessário (não confundir com o valor atual).

    10. Teste de configuração dos estados ON, OFF, LOCK_ON, LOCK_OFF, LOCK, UNLOCK para diferentes tipos de elementos.

    11. Teste de vinculação e sincronização de valores variáveis de elementos: por exemplo, campo de entrada com botões e controle deslizante. Assim, quando o valor de um elemento (manual ou de software) for alterado, o valor do segundo elemento será alterado de acordo.

    12. teste de obtenção/definição de software dos limites de intervalo do controle deslizante e do campo com botões (propriedades _V_MIN, _V_MAX, _V_STEP, _DIGITS).

    13. Teste da operação da consulta de status do item (_GET_STATE).

    14. Vinculação das cores do texto e da borda aos limites espaçados dos valores.

    15. Orientação no arquivo API.

    16.implementação da lógica de programa simples da aparência das janelas de mensagem e aviso.

    //------------------------------------------

    Os tópicos que foram considerados estão destacados em amarelo.

    No momento, ainda restam alguns a serem considerados:

    14. Vinculação das cores do texto e do quadro aos limites de valores espaçados.

    15. Orientação no arquivo API.

    16.implementação da lógica de programa simples da aparência das janelas de mensagem e aviso.

    //------------------------------------------

    Sugiro vincular o tópico 14 ao tópico 16. Ultrapassar os limites definidos dos valores dos parâmetros primeiro causará sinais na forma de alteração da cor de partes dos elementos (texto, base, moldura, faixa etc.), depois abrirá uma janela de diálogo e, em seguida, uma janela de aviso. Ao mesmo tempo, a janela de aviso bloqueará as alterações nos valores dos elementos até que seja fechada manualmente pelo usuário.


    Além disso, gostaria de adicionar um tema à lista:

    17. cancelamento das configurações inseridas quando o usuário clica no botão "Cancelar".

    Há muito tempo, a tecnologia de cancelamento das configurações do usuário ao clicar no botão "Cancelar" foi desenvolvida e, até certo ponto, testada. No momento, não se sabe o quanto a funcionalidade anterior funciona. Portanto, é necessário um teste.


    Como resultado da sobreposição de tópicos, a ordem de revisão será a seguinte:

    14. Implementação de proteção de limite de parâmetro escalonado:

    • Escrever a lógica para controlar as configurações dentro dos limites predefinidos e criar um sistema de aviso.
    • Aviso 1: o usuário recebe um sinal na forma de uma alteração na cor de partes dos elementos.(Vamos vincular a cor do texto, das bases, dos quadros e da barra deslizante aos limites de valor).
    • Aviso 2: abertura de uma caixa de diálogo com uma notificação de risco e uma sugestão para voltar às configurações originais. ( Vamos testar a capacidade real de reverter para as configurações anteriores ao clicar no botão "Cancelar". )
    • Aviso 3: abertura de uma janela de aviso que bloqueia outras alterações nas configurações e notifica o usuário sobre o aviso de isenção de responsabilidade, exigindo confirmação manual do usuário. ( Vamos testar o bloqueio de janelas quando a janela de aviso for exibida).


    15. Vamos considerar a nova impressão do arquivo API em detalhes.

    //----------------------------------------------------------------------------------------------------


    Em seguida, coletarei todos os bugs ou defeitos encontrados e farei uma lista de tarefas para a próxima versão.

    Após a próxima versão com correções e adições, vou me concentrar nas tabelas, nas quais vejo uma das principais direções de desenvolvimento adicional do mecanismo.

    Документация по MQL5: Основы языка / Операторы / Оператор возврата return
    Документация по MQL5: Основы языка / Операторы / Оператор возврата return
    • www.mql5.com
    Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается...
     
    hini #:

    Passei a última semana aprendendo a escrever uma interface usando o WinForm e a incorporá-la aos gráficos do MT5. Hoje, finalmente, descobri como fazer isso.


    E como você fará para que a interface se comunique com seu código de programação?