Galerie der in MQL geschriebenen UIs - Seite 16

 
Реter Konow #:
Warum ist es unangenehm? Probieren Sie es aus und ziehen Sie dann Ihre Schlüsse.))

1. Alle Element-Handler werden vom Konstruktor selbst gedruckt, man muss sie nur einfügen.

2. Intellisense bietet die notwendigen Funktionen, wählen Sie einfach eine aus.))

3. Alle Regeln sind einfach und leicht auswendig zu lernen.


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 gelöst. Den Rest der Zeit habe ich versucht, herauszufinden, warum deine Funktion nicht funktioniert, und dann das Gif gedreht. )))

Ich sehe, dass die Datei Internal_API.mqh, die ein Entwickler schreiben muss, ziemlich groß und kompliziert ist.



Wie viele Codezeilen werden in einer solchen Aufgabe mit einer Schaltfläche enthalten sein? Es ist wichtig, dass ein Entwickler seine GUI auf die übliche Weise entwickelt, indem er ein Objekt erstellt. Ich habe zum Beispiel eine solche Aufgabe wie folgt:

#resource "//Images//eclipse-alt.png" as uchar eclipse_alt[] // загружаем в ресурс изображение иконки с файла png
#include  <My\IconsMenu.mqh>

//+------------------------------------------------------------------+
IconsMenu menu(5,15,1,ANCHOR_RIGHT_UPPER,true,27, CheckBox, 0x00EEEEEE); // создаем меню
//+------------------------------------------------------------------+
void TimerMenu() { // таймер необходим для всплывающей подсказки
   menu.Timer();
}
//+------------------------------------------------------------------+
int OnInit() {
   InitMenu();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   menu.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
void InitMenu() {
   menu.SetTimerFunction(TimerMenu); // установка функции таймера
   bool dark_mode = W.Color!=0;      // определяем текущую цветовую схему чарта
   menu.AddPng(eclipse_alt,"dark/light theme",ChangeColorScheme,dark_mode); // создаем элемент кнопки-иконки
   menu.Draw();
}
//+------------------------------------------------------------------+
void ChangeColorScheme (bool checked) {
   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}
   };
   int clr_scheme = checked?1:0;

   if (checked) {
      menu.clr_off = 0x00606060;
      menu.clr_hover = 0x30808080;
   } else {
      menu.clr_off = 0x00EEEEEE;
      menu.clr_hover = 0x30FFFFFF;
   }
   menu.ChangeColorAll();
   menu.Draw();

   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();
}

Alles, was die Erstellung und Anpassung der GUI betrifft, ist gelb hervorgehoben.
Jedes neue GUI-Element besteht aus einer Zeile Code und einer Event-Handler-Funktion für dieses Element.



Dateien:
 
Nikolai, ich habe bereits alles erklärt.

1. Die Datei wird automatisch beim Speichern der erstellten GUI gedruckt.

2. Niemand schreibt sie extra.

3. In der Datei befinden sich fertige Handler von Steuerelementen, die der Benutzer in der Auszeichnungssprache deklariert hat.

4.. Die Handler empfangen Schnittstellenereignisse von der Engine.

5. Der Benutzer fügt nur seinen Code in die Handler ein.

Das war's schon. Ich werde mich nicht wiederholen, sorry.

 
Реter Konow Steuerelementen, die der Benutzer in der Auszeichnungssprache deklariert hat.

4.. Die Handler erhalten Schnittstellenereignisse von der Engine.

5. Der Benutzer fügt nur seinen Code in die Handler ein.

Das war's. Ich werde mich nicht wiederholen, tut mir leid.



OK, Sie haben diese Datei nicht zur Verfügung gestellt, deshalb habe ich Vermutungen angestellt. Wir werden auf die Version mit allen Dateien warten, damit wir sie live testen können.

 
Zu der Frage, wie viele Codezeilen.

Als ich Ihr Problem löste, fügte ich 2 Zeilen aus intellisense in den Handler ein. Auf dem Bild zu sehen. Ich habe nur den Namen der Farben in Klammern geschrieben. Und zwei Zeilen der Funktion (anstelle der Ihren). Sonst nichts.
 
Ich "bereinige" den Code vor der Veröffentlichung, "baue" den Motor um, entferne unnötige Dinge (wenn ich sie finden kann) und erinnere mich gleichzeitig daran, wie alles funktioniert hat.

Im Allgemeinen werde ich es bald veröffentlichen.
 
Реter Konow # :
Ich "bereinige" den Code vor der Veröffentlichung, "baue" die Engine um, entferne Unnötiges (wenn ich es finden kann) und erinnere mich gleichzeitig daran, wie alles funktioniert.

Im Allgemeinen werde ich es bald veröffentlichen.

Ich freue mich auf deine Veröffentlichung und möchte deine Ideen für die Programmierung verstehen.

 
Nikolai Semko # :

Peter, ich verstehe dich nicht. Du hast die Fragen nicht beantwortet.
Für Programmierer ist es wichtig zu wissen, wie man mit der GUI während der Arbeit interagiert.
Hier ist ein Beispiel für meine GUI. Ich habe auf die Tastenkombination für das helle/dunkle Thema geklickt, und dieses Ereignis hat sofort die Funktion zum Ändern der Hintergrundfarben und der Linien ausgelöst. Wie machen Sie diese Interaktion?


Was bedeutet es, dass der Benutzer NICHT (überhaupt) mit meinem Code interagieren wird ? "?
Der Programmierer muss nicht mit dem Code interagieren, sondern mit den Ereignissen, die diesen Code erzeugen sollen.

Schließlich ist die GUI kein separates, unabhängiges Programm. Die GUI muss letztendlich mit dem Hauptprogramm des Entwicklers interagieren. Egal ob es sich um einen Indikator oder EA handelt.

Die GUI, die Sie auf Ihren Bildern zeigen, ist großartig. Können Sie uns sagen, wie Sie das erreicht haben?

 
hini #:

Ich freue mich auf Ihre Veröffentlichung und möchte Ihre Kodierungsideen verstehen.

Okay. (gluckst)

Ich werde eine kleine Klarstellung bezüglich der Veröffentlichung machen. Nach einer vierjährigen Pause ist die letzte Version der Engine verloren gegangen. Das wurde nicht sofort entdeckt. Die alte Version funktioniert noch, erfordert aber ein Upgrade auf die Builder-Version. Dazu muss ich tief genug in den Code eindringen, den ich ein wenig vergessen hatte. Das ist aber keine große Sache und wird schon noch fertig werden.

Wegen der Verzögerung bei der Engine habe ich beschlossen, dass die Veröffentlichung in 2 Teile aufgeteilt wird. Zuerst werde ich den Konstrukteur zeigen. Wer möchte, kann sich dann mit der Auszeichnungssprache vertraut machen und die notwendige GUI schreiben. Nach einiger Zeit werde ich der Öffentlichkeit die aktualisierte Engine zur Verfügung stellen. Danach werde ich helfen, die erstellte GUI zu verbinden und sie wird mit benutzerdefinierten Expert Advisors oder Indikatoren zusammenarbeiten. Dann wird jeder einfache Prinzipien der Arbeit mit der Markup-Sprache und Methoden der Verbindung mit der Schnittstelle zu ihren Anwendungen lernen.

Es ist einfacher, eine zweiteilige Version zu erstellen, da der Konstruktor fast fertig ist und die Engine ein wenig modifiziert werden muss.

Natürlich werde ich zusammen mit der Veröffentlichung des Konstruktors Beispiele für den Auszeichnungscode und zusätzliche Anweisungen für dessen Erstellung bereitstellen.

Warten Sie darauf am Wochenende).
 
Ich möchte eine Klarstellung zu dem oben Gesagten hinzufügen: Nach der Veröffentlichung des Designers können diejenigen, die ihre GUI on the fly direkt von ME.

1. Dazu öffnen sie die Einschlussdatei "KIB-source.mqh" aus dem Release-Build.

2. Sie speichern sie im Indikatoren-Ordner und kompilieren sie danach.

3. Als Ergebnis sehen sie einen neuen Indikator namens "KIB-source.ex5" in den MT5-Navigator-Zweigen und werfen ihn auf einen freien Chart.

4. Der Benutzer erstellt im MQL5-Navigator den Ordner "Include"... einen Ordner für Dateien mit Markup-Code.

Zum Beispiel: MQL5\include\My_GUI\Project_1\.....

In diesem Ordner wird er Dateien mit der Oberfläche seiner Projekte speichern. In ihnen wird er auch schreiben, bearbeiten, experimentieren und UI auf Markup-Code entwerfen.

5. Es ist wichtig, dass während der Arbeit mit der Markup-Sprache beim Aufbau der UI, das Ergebnis auf dem MT5-Chart angezeigt wird, wo der Indikator "KIB-source.ex5" und der Expert Advisor (Konstruktor) "KIB.ex5", die ich in der ersten Version zur Verfügung stellen werde. Sie sollten beide auf dem gleichen Chart sein.

Außerdem (und das ist sehr wichtig) wird während der Kompilierung der parallel in ME geöffneten Datei "KIB-source.mq5" (zusammen mit den Dateien des benutzerdefinierten GUI-Projekts) der gesamte Markup-Code an den Konstruktor auf demselben Diagramm gesendet, der die GUI komplett neu aufbaut. Dies dauert je nach Anzahl der Fenster und Elemente in der Benutzeroberfläche zwischen 200 und 1000 ms. Und der Benutzer sieht sofort das Ergebnis der vorgenommenen Änderungen. Alles geschieht sehr schnell und fast in Echtzeit - Sie nehmen Änderungen am Markup-Code vor, kompilieren "KIB-source.mq5" und in Sekundenbruchteilen sehen Sie das Ergebnis auf dem MT5-Chart. Daher ist es wünschenswert, auf zwei Monitoren zu arbeiten. Auf einem ist MT5 geöffnet, auf dem anderen ME.

6. Der Vorteil der Markup-Sprache liegt in ihrer Einfachheit und in der Möglichkeit, Vorlagen für Elemente und Fenster zu erstellen, die leicht zwischen Fenstern oder Projekten kopiert werden können.

7. Ich möchte hinzufügen, dass der Designer als Open Source im Archiv enthalten ist. Daher hat der Benutzer die folgenden Aufgaben:

1. öffnen Sie das Archiv.
2. Legen Sie den Ordner KIB in den Ordner MQL5\include\.
3. Legen Sie die Datei CONNECTION.mqh aus dem Archiv in den Ordner MQL5\inlude\ (nicht in Unterordner).
4. Legen Sie die Datei KIB.mq5 in den Ordner MQL5\Experts\, öffnen Sie sie in ME, kompilieren und speichern Sie sie, damit der Expert Advisor KIB.ex5 im MT5-Navigator erscheint.
5. Laden Sie diesen Expert Advisor in denselben Chart hoch wie den Indikator KIB-source.mq5.
6. Danach kann die Datei KIB.mq5 constructor in ME geschlossen werden. Sie wird dann nicht mehr benötigt.


Alles ist bereit zum Arbeiten.


 
Es mag den Anschein haben, dass die oben beschriebenen Schritte zur Installation des Konstruktors und zur Aufnahme der Arbeit in der Auszeichnungssprache etwas kompliziert oder verwirrend sind. In Wirklichkeit ist alles banal einfach. Und um alles deutlich zu machen, werde ich die Anleitung in Bildern posten. Hier im Zweig.