Diskussion zum Artikel "Erstellung eines Dashboards zur Anzeige von Daten in Indikatoren und EAs" - Seite 2

 
Artyom Trishkin #:

Hallo.

So.

wird eine Zeigervariable auf ein zukünftiges neues, dynamisch erzeugtes Objekt der Klasse deklariert und sofort mit dem Wert NULL initialisiert.


Eine einfache Instanz einer Klasse wird wie folgt deklariert:

Aber in diesem Fall kann man eine Instanz nicht auf diese Weise deklarieren und erstellen - die Klasse hat keinen Konstruktor ohne formale Parameter.

Wenn Sie also eine Instanz auf diese Weise deklarieren, müssen Sie alle notwendigen Parameter des Klassenobjekts angeben, die an den Klassenkonstruktor übergeben werden müssen:

------------------------

Im Beispiel der Arbeit mit der Klasse wird zuerst ein leerer Zeiger auf das zukünftige Objekt im Indikator erstellt, und dann wird in OnInit() das Panel-Objekt erstellt, wobei der Zeiger auf das erstellte Objekt in die Zeigervariable geschrieben wird:


Dann wird in OnDeinit() das Objekt im Speicher durch diesen Zeiger gelöscht:

Würden Sie einfach ein neues Objekt mit dem new-Operator erstellen, ohne einen Zeiger auf das erstellte Objekt in eine Variable zu schreiben, könnten Sie es später nicht löschen, was zu einem Speicherleck führen würde.

Kurz gesagt, in dem Beispiel aus dem Artikel

  1. Deklarieren Sie einen Variablen-Zeiger auf das zukünftige Klassenobjekt und initialisieren Sie ihn mit dem Wert NULL,
  2. ein neues Klassenobjekt erstellen und den Zeiger auf dieses Objekt in die zuvor erstellte Dashboard-Variable schreiben,
  3. beim Zugriff auf das erstellte Objekt verwenden wir die Zeigervariable und einen Punkt ( dashboard.AnyMethod() )
  4. am Ende der Arbeit löschen wir das dynamisch erstellte Klassenobjekt mit dem Zeiger darauf.

Wäre die benötigte Instanz der Klasse (CDashboard Dashboard) sofort erstellt worden, wären keine Zeiger darauf nötig gewesen - man hätte auf die gleiche Weise mit dem Operator "point" darauf zugegriffen. Und es wäre auch nicht nötig, sie zu löschen, wenn die Arbeit beendet ist - das Terminal-Subsystem macht das von selbst. Aber es wäre die einzige Instanz der Klasse im Programm.

Mit der dynamischen Erstellung können Sie neue Objekte der gewünschten Klasse im Handumdrehen erstellen und per Zeiger auf sie verweisen. Deshalb wurde im Beispiel die dynamische Erstellung eines Klassenobjekts verwendet. Vereinfacht, ohne auf einige Punkte einzugehen.

Danke für die ausführliche Antwort! also für jedes Objekt ein eigener Konstruktor in einem anderen Fall Objekt mit angeforderten Argumenten aus der Klasse, in jeder Phase können Sie verschiedene Objekte erstellen!(Nus wird ein wenig klarer).

Eigentlich Interesse, ein Info-Panel zu erstellen, ist es eine Folge der DPI des Monitors, in meinem Fall 168. Comment(); ist sehr klein!

Es gibt TerminalInfoInteger(TERMINAL_SCREEN_DPI), die ich unter Berücksichtigung der Auflösung erstellen möchte ... und ich möchte der Einfachheit halber nach Farbgruppen erstellen.

Vielleicht haben Sie eine solche Lösung? Ihr Code ist gut, lesbar... Ich, auf der anderen Seite, lang, unverständlich, als Ergebnis habe ich alles mehrmals neu zu schreiben! Vielen Dank für Ihre Unterstützung!

 
Igor Bakhrushen #:

Vielen Dank für eine umfassende Antwort! so für jedes Objekt hat seinen eigenen Konstruktor im anderen Fall Objekt mit angeforderten Argumente aus der Klasse, in jeder Phase können Sie verschiedene Objekte erstellen!(Nous wird ein wenig klarer).

Eigentlich Interesse, ein Info-Panel zu erstellen, ist es eine Folge der DPI-Monitor, in meinem Fall 168. Comment(); ist sehr klein!

Es gibt TerminalInfoInteger(TERMINAL_SCREEN_DPI), die ich unter Berücksichtigung der Auflösung erstellen möchte ... und ich möchte der Einfachheit halber nach Farbgruppen erstellen.

Vielleicht haben Sie eine solche Lösung? Ihr Code ist gut, lesbar... Ich, auf der anderen Seite, lang, unverständlich, als Ergebnis habe ich alles mehrmals neu zu schreiben! Vielen Dank für Ihre Unterstützung!

Die Lösung steht in den Beispielen in der Hilfe:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Galerie der in MQL geschriebenen UIs

Artyom Trishkin, 2024.05.31 10:33 AM

Hier(TERMINAL_SCREEN_DPI):

Beispiel für die Berechnung des Skalierungsfaktors:

//--- eine Schaltfläche mit einer Breite von 1,5 Zoll auf dem Bildschirm erstellen
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // Ermittelt den DPI-Wert des Benutzermonitors
int base_width = 144;                                      // Basisbreite in Bildschirmpunkten für Standardmonitore mit DPI=96
int width      = (button_width * screen_dpi) / 96;         // Berechnung der Schaltflächenbreite für den Monitor des Benutzers (unter Berücksichtigung des DPI-Wertes)
...
 
//--- Berechnung des Skalierungsfaktors in Prozent
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- Verwendung des Zoomfaktors
width=(base_width * scale_factor) / 100;

Auf diese Weise wird eine grafische Ressource auf Monitoren mit unterschiedlichen Auflösungen die gleiche Größe haben. Gleichzeitig entsprechen die Größen der Bedienelemente (Schaltflächen, Dialogfenster usw.) den Personalisierungseinstellungen.


 
Da ich leider keinen 4K-Monitor habe, kann ich das nicht überprüfen, und aus demselben Grund gebe ich eine solche Neuberechnung noch nicht in die Bibliothek ein - es ist nicht seriös, das willkürlich und ohne Überprüfung zu tun.
 
Artyom Trishkin #:
Leider habe ich keinen 4K-Monitor, so dass ich nicht überprüfen kann, und aus dem gleichen Grund gebe ich eine solche Neuberechnung noch nicht in die Bibliothek ein - es ist nicht seriös, zufällig zu tun, ohne zu überprüfen.
Ich verstehe... danke! Wir werden es langsam herausfinden!
 
Artyom Trishkin #:
Leider habe ich keinen 4K-Monitor, so dass ich nicht überprüfen kann, und aus dem gleichen Grund gebe ich eine solche Neuberechnung noch nicht in die Bibliothek ein - es ist nicht seriös, dies willkürlich und ohne Überprüfung zu tun.

Artem Hallo! Hier ist die Konstruktion unter Berücksichtigung von dpi.... Aber in der Tat kann man einen anderen Weg gehen. Nehmen wir an, Sie legen die Größe der Kopfzeile fest und berechnen die Größe des Panels, die Zeilenhöhe und die Texthöhe auf der Grundlage der Größe der Kopfzeile. Sie geben zwei Parameter an... und die dpi-Werte. oder gibt es damit ein Problem? Ich bin mir nicht ganz sicher. Was ist Ihre Meinung zu dieser Lösung?

 
Igor Bakhrushen #:

Artem hallo! Hier ist ein auf dpi basierendes Build..... Aber im Grunde können Sie einen anderen Weg gehen. Nehmen wir an, Sie legen die Größe der Kopfzeile fest und berechnen die Größe der Panel-Zeilenhöhe und der Texthöhe auf der Grundlage der Größe der Kopfzeile. Sie geben zwei Parameter an... und die dpi-Werte. oder gibt es dabei ein Problem? Ich bin mir nicht ganz sicher. Was ist Ihre Meinung zu dieser Lösung?

Alles muss getestet werden. Ohne Monitor kann ich das nicht machen. Ich kann also leider nichts dazu sagen.
 
Schön, danke für diesen Code :)
 

Gute Idee mit dem Panel. Aber mir ist aufgefallen, dass das Panel spontan an den unteren Rand des Diagramms fällt, wenn man von einem anderen Diagramm zu ihm wechselt. Beispiel:


 
Denis Kirichenko #:

Gute Idee mit dem Panel. Aber mir ist aufgefallen, dass das Panel spontan an den unteren Rand des Diagramms fällt, wenn man von einem anderen Diagramm zu ihm wechselt. Beispiel:

Hmm. Interessantes Phänomen. Ich werde es mir in meiner Freizeit ansehen müssen. Höchstwahrscheinlich ist der Grund die Größenänderung des inaktiven Diagramms.

 
Bisher habe ich herausgefunden, dass das Ereignis CHARTEVENT_CHART_CHANGE(9) so gehandhabt wird.