Galerie der in MQL geschriebenen UIs - Seite 15

 
NUN GUT.

Ich werde versuchen, eine andere Frage zu stellen, und zwar am Beispiel der Webentwicklung. Denn Ihre grafische Benutzeroberfläche wird mit der von Ihnen erstellten Auszeichnungssprache geschrieben.
Die Webentwicklung hat auch ihre eigene Auszeichnungssprache (HTML) und Stilsprache (CSS). Wenn Sie eine Website nur in HTML erstellt haben, können Sie Steuerelemente in reinem HTML erstellen.




Hier ist ein Beispiel mit einem Kontrollkästchen. Aber in diesem Fall ist die Website tot, weil nichts passiert, wenn die Steuerelemente funktionieren. Damit etwas passiert, müssen Sie einen Handler für jedes Ereignis mithilfe von JavaScript und der Funktion addEventListener erstellen. Hier ist ein Beispiel für einen solchen Handler:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Meine Hauptfrage kann umformuliert werden: Wie implementieren Siefür den Programmierer den Event-Handler, der von der GUI generiert wird, wenn der Benutzer arbeitet.
D.h. was ist Ihr Analogon zu addEventListener ? Wie ich schon sagte, habe ich es dadurch implementiert, dass, wenn die GUI programmatisch generiert wird, jedem Steuerelement seine eigene Event-Handler-Funktion zugewiesen wird, indem einZeiger auf eine Funktion verwendet wird.
 
In dem Bild, in dem es darum geht, einen Wert von einem Element zu erhalten, habe ich vergessen, die Variable anzugeben, in die der Wert geschrieben wird. Tut mir leid, ich habe schon lange nicht mehr programmiert. ))))))
 
Nikolai Semko #:
NUN GUT.

Ich werde versuchen, eine andere Frage zu stellen, und zwar am Beispiel der Webentwicklung. Denn Ihre grafische Benutzeroberfläche wird mit der von Ihnen erstellten Auszeichnungssprache geschrieben.
Die Webentwicklung hat auch ihre eigene Auszeichnungssprache (HTML) und Stilsprache (CSS). Wenn Sie eine Website nur in HTML erstellt haben, können Sie Steuerelemente in reinem HTML erstellen.




Hier ist ein Beispiel mit einem Kontrollkästchen. Aber in diesem Fall ist die Website tot, weil nichts passiert, wenn die Steuerelemente funktionieren. Damit etwas passiert, müssen Sie einen Handler für jedes Ereignis mithilfe von JavaScript und der Funktion addEventListener erstellen. Hier ist ein Beispiel für einen solchen Handler:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Meine Hauptfrage kann umformuliert werden: Wie implementieren Siefür den Programmierer den Event-Handler, der von der GUI generiert wird, wenn der Benutzer arbeitet.
D.h. was ist Ihr Analogon zu addEventListener ? Wie ich schon sagte, habe ich es dadurch implementiert, dass bei der programmatischen Generierung der GUI jedem Steuerelement seine eigene Event-Handler-Funktion zugewiesen wird, indem einZeiger auf die Funktion verwendet wird.

Nicholas, alles funktioniert. Sie werden es später selbst ausprobieren. Alles ist viel einfacher, als Sie denken. Ich habe viele funktionierende Schnittstellen mit dieser Technologie erstellt. Also... Du wirst es bald sehen.

 
Реter Konow #:

Nikolai, es funktioniert. Du wirst es später selbst ausprobieren. Es ist viel einfacher, als du denkst. Ich habe viele funktionierende Schnittstellen mit dieser Technologie gebaut. Also... Du wirst es bald sehen.

Ich warte. Ich werde warten.
Ich möchte Ihre Schöpfung wirklich verstehen, aber um das Verständnis durch ein Beispiel zu erleichtern, erstellen Sie bitte einen einfachen leeren Indikator (oder Expert Advisor), in dem Ihre GUI in Form einer separaten Schaltfläche verbunden ist, wenn Sie diese drücken, ändert sich die Hintergrundfarbe des Fensters von schwarz zu weiß und von weiß zu schwarz. Es ist nur wünschenswert, dass der Farbwechsel im Indikatorkörper stattfindet und nicht in einer der verbundenen Dateien.
Der Einfachheit halber ist hier der Code der Funktion, die im Programmkörper ausgeführt werden soll, wenn die Schaltfläche gedrückt wird:

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

Ja, gut. Ich werde warten.
Ich möchte Ihre Schöpfung wirklich verstehen, aber um das Verständnis durch ein Beispiel zu erleichtern, erstellen Sie bitte einen einfachen leeren Indikator (oder Expert Advisor), in dem Ihre GUI in Form einer separaten Schaltfläche verbunden ist, wenn Sie darauf drücken, ändert sich die Hintergrundfarbe des Fensters von schwarz zu weiß und von weiß zu schwarz. Es ist nur wünschenswert, dass der Farbwechsel im Indikatorkörper stattfindet und nicht in einer der verbundenen Dateien.
Der Einfachheit halber ist hier der Code der Funktion, die im Programmkörper ausgeführt werden soll, wenn die Schaltfläche gedrückt wird:

Ok. Ich werde die einfachst mögliche Implementierung zum Verständnis machen. Kein Schnickschnack).

  • Indikator
  • Innerhalb des Indikators befindet sich ein Benutzerfenster
  • In dem Fenster gibt es eine Schaltfläche
  • Die Schaltfläche ruft Ihre Funktion auf.
  • Alle Aktionen werden in den Körper des Indikators geschrieben.
 
Реter Konow #:

Na gut. Ich werde die einfachst mögliche Implementierung zum Verständnis machen. Kein Schnickschnack).

  • Indikator
  • Innerhalb des Indikators befindet sich ein Benutzerfenster
  • In dem Fenster gibt es eine Schaltfläche
  • Die Schaltfläche ruft Ihre Funktion auf.
  • Alle Aktionen werden in den Körper des Indikators geschrieben.

Sehr gut! Ich danke Ihnen.

 

Nikolay, ich kann keinen Funktionsaufruf innerhalb des Indikatorkörpers schreiben, da sich sein Handler in der Datei Internal_API.mqh befindet.

Das heißt, ich kann Ihre Funktion beim Drücken der Schaltfläche über den Handler in dieser Datei aufrufen. Allerdings kann ich die Schaltflächenzustände auch programmatisch vom Indikatorkörper aus setzen, z. B. beim Timer-Ereignis. Aber dann brauche ich die Schaltfläche nicht zu drücken. Kurz gesagt, es gibt verschiedene Elemente. Einige von ihnen können innerhalb des Indikatorkörpers behandelt werden (meist nicht-interaktive Elemente, wie z. B. Fortschrittsbalken), und es gibt solche, die einen Handler in der Datei Internal_API.mqh haben und von dort aus arbeiten. Deren Status kann jedoch programmatisch vom EA/Indikator selbst gesetzt werden.

Ihre Aufgabe ist abgeschlossen. (wenn weißes Quadrat - Klick)


Code:

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

Ich habe deine Funktion auskommentiert, weil der Compiler geflucht hat. Ich habe sie vereinfacht.


Hier ist der Code in der Datei Internal_API.mqh



 

Übrigens, Sie sollten hinzufügen:

Die Datei Internal_API.mqh enthält Kontrollhandler und ist SPEZIFISCH dafür gedacht, sie zu verbinden.

Diese Datei ist für den Benutzer bestimmt und ist nicht Teil des Motors oder einer meiner anderen Code.

 
Реter Konow Steuerelemente und ist speziell für deren Verbindung gedacht.

Diese Datei ist für den Benutzer bestimmt und ist nicht Teil der Maschine oder einer meiner anderen Code.

Ich verstehe, Peter.
Danke. Für einen Entwickler ist das natürlich nicht praktisch.
Es gibt eine Menge unnötigen Code und Bewegungen. Dennoch ist die Variante mit einem Zeiger auf eine Funktion viel besser.

 
Nikolai Semko #:

Ich verstehe, Peter.
Danke. Für einen Entwickler ist das natürlich nicht bequem.
Es gibt eine Menge unnötigen Code und Bewegungen. Dennoch ist die Variante mit einem Zeiger auf eine Funktion viel besser.

Warum ist sie unpraktisch? Probieren Sie es aus und ziehen Sie dann Ihre Schlüsse.))

1. Der Konstruktor gibt alle Elementhandler von sich aus aus, verbinden Sie sie einfach.

(2) Intellisense stellt die notwendigen Funktionen zur Verfügung, einfach auswählen.)))

3. Alle Regeln sind einfach, es ist nicht schwer, sie sich zu merken.

Nur der visuelle Editor könnte einfacher sein, aber das kommt später.

P.S. Nach einer 4-jährigen Pause habe ich Ihre Aufgabe in 10 Minuten erledigt. Den Rest der Zeit habe ich versucht zu verstehen, warum deine Funktion nicht funktioniert hat, und dann habe ich das Gif gedreht. )))