Galeria de UIs escritas em MQL - página 15

 
Nikolai Semko #:

Pyotr, não estou entendendo você.

Você não respondeu às perguntas. É importante que os programadores saibam como interagir com sua GUI durante o trabalho. Aqui está um exemplo da minha GUI. Cliquei no atalho do tema claro/escuro e esse evento acionou imediatamente a função para alterar as cores e as linhas do plano de fundo. Como você faz essa interação?



O que significa "O usuário NÃO interagirá (de forma alguma) com meu código "? O programador precisa interagir não com o código, mas com os eventos que o código deve gerar.

Bom. Tentarei usar apenas imagens para maior clareza.

1.





2.


3.


4.

Nossa planilha de opções e a caixa de seleção na janela e o arquivo Internal_API:




5. Realização de ações na janela e itens no código do usuário:




6.


OINTELLISENSE NOS DIZ TUDO!!!


 
OK.

Vou tentar fazer uma pergunta diferente, usando o desenvolvimento da Web como exemplo, pois a GUI é escrita usando a linguagem de marcação que você criou.
O desenvolvimento da Web também tem sua própria linguagem de marcação (HTML) e linguagem de estilo (CSS). Se você tiver criado um site somente em HTML, poderá criar controles em html puro.




Aqui está um exemplo com caixa de seleção. Mas, nesse caso, o site estará morto, porque nada acontecerá quando os controles estiverem funcionando. Para que algo aconteça, você precisa colocar um manipulador para cada evento usando JavaScript e a função addEventListener. Aqui está um exemplo desse manipulador:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Minha pergunta principal pode ser reformulada: Como você implementapara o programador o manipulador de eventos gerado pela GUI quando o usuário trabalha.
Como eu disse, eu o implementei pelo fato de que, quando a GUI é gerada programaticamente, cada controle recebe sua própria função de manipulador de eventos usando um ponteiro para uma função.
 
Na imagem de obtenção de um valor de um elemento, esqueci de escrever a variável na qual ele é escrito. Desculpe-me, não estou programando há muito tempo. ))))))
 
Nikolai Semko #:
OK.

Vou tentar fazer uma pergunta diferente, usando o desenvolvimento da Web como exemplo, pois a GUI é escrita usando a linguagem de marcação que você criou.
O desenvolvimento da Web também tem sua própria linguagem de marcação (HTML) e linguagem de estilo (CSS). Se você tiver criado um site somente em HTML, poderá criar controles em html puro.




Aqui está um exemplo com caixa de seleção. Mas, nesse caso, o site estará morto, porque nada acontecerá quando os controles estiverem funcionando. Para que algo aconteça, você precisa colocar um manipulador para cada evento usando JavaScript e a função addEventListener. Aqui está um exemplo desse manipulador:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Minha pergunta principal pode ser reformulada: Como você implementapara o programador o manipulador de eventos gerado pela GUI quando o usuário trabalha.
Como eu disse, eu o implementei pelo fato de que, quando a GUI é gerada programaticamente, cada controle recebe sua própria função de manipulador de eventos usando um ponteiro para a função.

Nicholas, tudo funciona. Você mesmo tentará fazer isso mais tarde. Tudo é muito mais simples do que você pensa. Criei muitas interfaces funcionais usando essa tecnologia. Então... Você verá em breve.

 
Реter Konow #:

Nikolai, está funcionando. Você mesmo tentará mais tarde. É muito mais simples do que você pensa. Eu criei muitas interfaces funcionais usando essa tecnologia. Então... Você verá em breve.

Está bem. Estarei esperando.
No entanto, para facilitar a compreensão por meio de um exemplo, crie um indicador simples e vazio (ou Consultor Especialista), no qual a GUI esteja conectada na forma de um botão separado; ao pressioná-lo, a cor de fundo da janela muda de preto para branco e de branco para preto. É desejável apenas que a mudança de cor ocorra no corpo do indicador, e não em um dos arquivos conectados.
Para simplificar a escrita, aqui está o código da função que deve ser executada no corpo do programa quando o botão for pressionado:

void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}
 
Nikolai Semko #:

Está bem. Vou esperar.
No entanto, para facilitar a compreensão por meio de um exemplo, crie um indicador simples e vazio (ou Consultor Especialista), no qual a GUI esteja conectada na forma de um botão separado e, ao pressioná-lo, a cor de fundo da janela mude de preto para branco e de branco para preto. É desejável apenas que a mudança de cor ocorra no corpo do indicador, e não em um dos arquivos conectados.
Para simplificar a escrita, aqui está o código da função que deve ser executada no corpo do programa quando o botão for pressionado:

Ok. Farei a implementação mais simples possível para facilitar a compreensão. Sem frescuras).

  • Indicador
  • Dentro do indicador há uma janela de usuário
  • Há um botão na janela
  • O botão chama sua função.
  • Todas as ações são escritas no corpo do indicador.
 
Реter Konow #:

Está bem. Farei a implementação mais simples possível para facilitar a compreensão. Sem frescuras).

  • Indicador
  • Dentro do indicador há uma janela de usuário
  • Há um botão na janela
  • O botão chama sua função.
  • Todas as ações são escritas no corpo do indicador.

Ótimo! Muito obrigado.

 

Nikolay, não posso escrever uma chamada de função dentro do corpo do indicador, porque seu manipulador está dentro do arquivo Internal_API.mqh.

Ou seja, posso chamar sua função no evento de pressionar o botão a partir de seu manipulador nesse arquivo. No entanto, posso definir os estados do botão de forma programática a partir do corpo do indicador no evento do cronômetro, por exemplo. Mas, nesse caso, não preciso pressionar o botão. Em suma, há diferentes elementos. Alguns deles podem ser manipulados dentro do corpo do indicador (principalmente elementos não interativos, como a barra de progresso, por exemplo) e há aqueles que têm um manipulador no arquivo Internal_API.mqh e funcionam a partir dele. Embora seus estados possam ser definidos programaticamente a partir do corpo do EA/indicador.

Sua tarefa está concluída. (se houver um quadrado branco - clique)


Código:

//+------------------------------------------------------------------+
//|                                                 Indicators 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include<GUI_DRIVE_2.mqh>
#include<MyProject_1\CORES.mqh>
#include<MyProject_1\Internal_API.mqh> 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------
   D_OnInit();
   //-------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //УСТАНОВИТЬ ВЫЗОВ В САМОМ НИЗУ, ПОД ПОЛЬЗ.КОДОМ.------------------
   //---------------------------
   RMSG(1);
   //---------------------------
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //УСТАНОВИТЬ ВЫЗОВ НА САМОМ ВЕРХУ, НАД ПОЛЬЗ.КОДОМ.---------------
   //----------------------------------------------------------------
   D_OnChartEvent(id,lparam,dparam,sparam);
   //----------------------------------------------------------------
  }
//+------------------------------------------------------------------+

/*void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[13] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}*/


void ChangeColorScheme(uint _color)
{
 ChartSetInteger(0,CHART_COLOR_BACKGROUND,_color);
}

Comentei sua função porque o compilador estava xingando. Tornei-a mais simples.


Aqui está o código no arquivo Internal_API.mqh



 

A propósito, você deve acrescentar:

O arquivo Internal_API.mqh contém manipuladores de controle e foi projetado ESPECIFICAMENTE para conectá-los.

Esse arquivo é destinado ao usuário e não faz parte do mecanismo ou de qualquer outro código meu.

 
Реter Konow controles e foi projetado ESPECIFICAMENTE para conectá-los.

Esse arquivo é destinado ao usuário e não faz parte do mecanismo ou de qualquer outro código meu.

Estou entendendo, Peter.
Obrigado, mas não é conveniente, é claro, para um desenvolvedor.
Há muito código e movimentos desnecessários. Ainda assim, a variante com um ponteiro para uma função é muito melhor.