Galleria di interfacce utente scritte in MQL - pagina 15

 
Nikolai Semko #:

Pyotr, non ti capisco.

È importante che i programmatori sappiano come interagire con la GUI durante il lavoro. Ecco un esempio della mia GUI. Ho fatto clic sulla scorciatoia del tema chiaro/scuro e questo evento ha immediatamente attivato la funzione per cambiare i colori dello sfondo e le linee. Come si realizza questa interazione?



Cosa significa "L'utente NON interagirà (affatto) con il mio codice " ? Il programmatore deve interagire non con il codice, ma con gli eventi che il codice deve generare.

Bene. Cercherò di usare solo immagini per chiarezza.

1.





2.


3.


4.

Il nostro foglio delle opzioni e la casella di controllo nella finestra e il file Internal_API:




5. Esecuzione di azioni sulla finestra e sugli elementi nel codice utente:




6.


INTELLISENSE CI DICE TUTTO!!!


 
OK.

Proverò a fare una domanda diversa, usando come esempio lo sviluppo web. Perché la vostra GUI è scritta usando il linguaggio di markup che avete creato.
Anche lo sviluppo web ha il suo linguaggio di markup (HTML) e il suo linguaggio di stile (CSS). Se avete creato un sito web solo in HTML, potete creare controlli in puro html.




Ecco un esempio con la casella di controllo. Ma in questo caso il sito sarà morto, perché non accadrà nulla quando i controlli funzionano. Per far accadere qualcosa, è necessario inserire un gestore per ogni evento utilizzando JavaScript e la funzione addEventListener Ecco un esempio di tale gestore:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 La mia domanda principale può essere riformulata: come si implementaper il programmatore il gestore di eventi generato dalla GUI quando l'utente lavora.
Come ho detto, l'ho implementato attraverso il fatto che quando la GUI viene generata programmaticamente, a ogni controllo viene assegnata la propria funzione di gestore di eventi utilizzando un puntatore a una funzione.
 
Nell'immagine dell'ottenimento di un valore da un elemento, ho dimenticato di scrivere la variabile a cui viene scritto. Scusate, è da molto tempo che non programmo.))))))
 
Nikolai Semko #:
OK.

Proverò a fare una domanda diversa, usando come esempio lo sviluppo web. Perché la vostra GUI è scritta usando il linguaggio di markup che avete creato.
Anche lo sviluppo web ha il suo linguaggio di markup (HTML) e il suo linguaggio di stile (CSS). Se avete creato un sito web solo in HTML, potete creare controlli in puro html.




Ecco un esempio con la casella di controllo. Ma in questo caso il sito sarà morto, perché non accadrà nulla quando i controlli funzionano. Per far accadere qualcosa, è necessario inserire un gestore per ogni evento utilizzando JavaScript e la funzione addEventListener Ecco un esempio di tale gestore:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 La mia domanda principale può essere riformulata: come si implementaper il programmatore il gestore di eventi generato dalla GUI quando l'utente lavora.
Come ho detto, l'ho implementato attraverso il fatto che quando la GUI viene generata programmaticamente, a ogni controllo viene assegnata la propria funzione di gestore di eventi utilizzando un puntatore alla funzione.

Nicholas, tutto funziona. Lo proverete voi stessi più tardi. Tutto è molto più semplice di quanto si pensi. Ho realizzato molte interfacce funzionanti utilizzando questa tecnologia. Quindi... Lo vedrai presto.

 
Реter Konow #:

Nikolai, funziona. Lo proverai tu stesso più tardi. È molto più semplice di quanto pensi. Ho realizzato molte interfacce funzionanti utilizzando questa tecnologia. Quindi... Lo vedrai presto.

Ok... Aspetto.
Tuttavia, per rendere più facile la comprensione con un esempio, si prega di creare un semplice indicatore vuoto (o Expert Advisor), in cui la GUI è collegata sotto forma di un pulsante separato, quando si preme, il colore di sfondo della finestra cambia da nero a bianco e da bianco a nero. È auspicabile che il cambio di colore avvenga solo nel corpo dell'indicatore e non in uno dei file collegati.
Per semplicità di scrittura, ecco il codice della funzione che deve essere eseguita nel corpo del programma quando viene premuto il pulsante:

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 #:

Ok. Aspetterò.
Tuttavia, per rendere più facile la comprensione con un esempio, si prega di creare un semplice indicatore (o Expert Advisor) vuoto, in cui la GUI è collegata sotto forma di un pulsante separato, quando si preme, il colore di sfondo della finestra cambia da nero a bianco e da bianco a nero. È auspicabile che il cambio di colore avvenga solo nel corpo dell'indicatore e non in uno dei file collegati.
Per semplicità di scrittura, ecco il codice della funzione che deve essere eseguita nel corpo del programma quando viene premuto il pulsante:

Ok. Farò l'implementazione più semplice possibile per la comprensione. Senza fronzoli).

  • Indicatore
  • All'interno dell'indicatore si trova una finestra utente
  • Nella finestra è presente un pulsante
  • Il pulsante richiama la vostra funzione.
  • Tutte le azioni sono scritte nel corpo dell'indicatore.
 
Реter Konow #:

Ok. Farò l'implementazione più semplice possibile per la comprensione. Senza fronzoli).

  • Indicatore
  • All'interno dell'indicatore si trova una finestra utente
  • Nella finestra è presente un pulsante
  • Il pulsante richiama la propria funzione.
  • Tutte le azioni sono scritte nel corpo dell'indicatore.

Ottimo! Grazie.

 

Nikolay, non posso scrivere una chiamata di funzione all'interno del corpo dell'indicatore, perché il suo gestore si trova nel file Internal_API.mqh.

Cioè, posso chiamare la tua funzione sull'evento della pressione del pulsante dal suo gestore in questo file. Tuttavia, posso impostare gli stati dei pulsanti in modo programmatico dal corpo dell'indicatore, ad esempio sull'evento timer. Ma in questo caso non ho bisogno di premere il pulsante. In breve, ci sono diversi elementi. Alcuni di essi possono essere gestiti all'interno del corpo dell'indicatore (per lo più elementi non interattivi, come la barra di avanzamento, ad esempio) e ci sono quelli che hanno un gestore nel file Internal_API.mqh e funzionano da lì. Anche se i loro stati possono essere impostati programmaticamente dal corpo dell'EA/indicatore.

Il vostro compito è completato. (se il quadrato bianco - click)


Codice:

//+------------------------------------------------------------------+
//|                                                 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);
}

Ho commentato la vostra funzione perché il compilatore imprecava. L'ho resa più semplice.


Ecco il codice nel file Internal_API.mqh



 

A proposito, si dovrebbe aggiungere:

Il file Internal_API.mqh contiene i gestori dei controlli ed è progettato SPECIFICAMENTE per collegarli.

Questo file è destinato all'utente e non fa parte del motore o di altro codice.

 
Реter Konow controlli ed è specificamente progettato per collegarli.

Questo file è destinato all'utente e non fa parte del motore o di altro codice.

Capisco, Peter.
Grazie. Naturalmente non è conveniente per uno sviluppatore.
C'è un sacco di codice inutile e di movimenti. Tuttavia, la variante con un puntatore a una funzione è molto meglio.