Diskussion zum Artikel "Grafische Interfaces IV: Der Multi-Window-Modus und das System für Prioritäten (Kapitel 2)"
Anatoly, ich habe einen Fehler bemerkt - ich beschloss, mir die Beispiele anzusehen und sah sofort, dass, wenn das Fenster an den rechten Rand gedrückt wird und Tooltips aktiviert sind, diese Tooltips über den rechten Rand des Bildschirms hinausgehen. Könnten Sie die x-Koordinate korrigieren, wenn der Tooltip über den Bildschirmrand hinausgeht?
Und noch ein Vorschlag: In Menüs, in Menüpunkten mit Dropdown-Untermenüs (ich weiß nicht, wie man sie richtig nennt), in denen ein Pfeil nach rechts anzeigt, dass ein weiterer Punkt geöffnet wird, ist es meiner Meinung nach besser, das Öffnen zu veranlassen, wenn der Mauszeiger über einen solchen Menüpunkt bewegt wird (a la Windows). Oder man macht es zu einem Parameter: entweder wird ein neues Element geöffnet, wenn man mit dem Mauszeiger darüber fährt, oder wenn man klickt (wie jetzt).
Anatoly, ich habe einen Fehler bemerkt - ich beschloss, mir die Beispiele anzusehen und sah sofort, dass, wenn das Fenster an den rechten Rand gedrückt wird und Tooltips aktiviert sind, diese Tooltips über den rechten Rand des Bildschirms hinausgehen. Könnten Sie die x-Koordinate korrigieren, wenn der Tooltip über den Bildschirmrand hinausgeht?
Und noch ein Vorschlag: In Menüs, in Menüpunkten mit Dropdown-Untermenüs (ich weiß nicht, wie man sie richtig nennt), in denen ein Pfeil nach rechts anzeigt, dass ein weiterer Punkt geöffnet wird, ist es meiner Meinung nach besser, das Öffnen zu veranlassen, wenn der Mauszeiger über einen solchen Menüpunkt bewegt wird (a la Windows). Oder man macht es zu einem Parameter: Entweder wird ein neues Element geöffnet, wenn man mit dem Mauszeiger darüber fährt, oder wenn man klickt (wie jetzt).
Wir werden es tun. Wir werden Korrekturen und Verbesserungen vornehmen, nachdem die erste Version der Bibliothek vollständig veröffentlicht ist. Wir müssen das aktuelle Ergebnis korrigieren.
Dann werden wir eine Liste erstellen, was getan werden muss, Prioritäten festlegen und versuchen, einen separaten Artikel zu veröffentlichen.
Der neue Artikel Graphical Interfaces IV: the Multi-Window Mode and System of Priorities (Chapter 2) wurde veröffentlicht:
Autor: Anatoli Kazharski
Vielen Dank für die ausgezeichnete Artikelserie. Es hat mir Spaß gemacht, die MQL4-Codes zu lesen. Program.mqh ist der folgende zwei Fehler:
//error#1: Array außerhalb des Bereichs in 'Program.mqh' (753,32) //Fixiert durch Änderung der Zeilen 742-746 string text[2]= { "\"Icon button\" (1) control", "Opens the dialog box (2)." }; //error#2: Array außerhalb des Bereichs in 'Program.mqh' (1012,32) //Fixiert durch Änderung der Zeilen 1000-1005 string text[3]= { "\"Icon button\" (5) control", "This is the second line of the tooltip.", "This is the third line of the tooltip." };
Vielen Dank für die ausgezeichnete Serie von Artikeln. Ich genoss das Lesen der MQL4-Codes. Program.mqh ist die folgenden zwei Fehler:
Danke.
In meiner Version werden diese Fehler nicht angezeigt.
742-746:
//+------------------------------------------------------------------+ //| Tooltip 1| //+------------------------------------------------------------------+ bool CProgram::CreateTooltip1(void) { #define TOOLTIP1_LINES_TOTAL 2 //--- m_tooltip1.WindowPointer(m_window1); m_tooltip1.ElementPointer(m_icon_button1); //--- string text[]= { "Line 1", "Line 2" }; //--- m_tooltip1.Header("Icon Button 1"); m_tooltip1.XSize(250); m_tooltip1.YSize(70); //--- for(int i=0; i<TOOLTIP1_LINES_TOTAL; i++) m_tooltip1.AddString(text[i]); //--- if(!m_tooltip1.CreateTooltip(m_chart_id,m_subwin)) return(false); //--- CWndContainer::AddToElementsArray(0,m_tooltip1); return(true); }
//---
1000-1005:
//+------------------------------------------------------------------+ //| Tooltip 5| //+------------------------------------------------------------------+ bool CProgram::CreateTooltip5(void) { #define TOOLTIP5_LINES_TOTAL 3 //--- m_tooltip5.WindowPointer(m_window1); m_tooltip5.ElementPointer(m_icon_button5); //--- string text[]= { "Line 1", "Line 2", "Line 3" }; //--- m_tooltip5.Header("Icon Button 5"); m_tooltip5.XSize(250); m_tooltip5.YSize(80); //--- for(int i=0; i<TOOLTIP5_LINES_TOTAL; i++) m_tooltip5.AddString(text[i]); //--- if(!m_tooltip5.CreateTooltip(m_chart_id,m_subwin)) return(false); //--- CWndContainer::AddToElementsArray(0,m_tooltip5); return(true); }
Danke!
In meiner Version sind diese Fehler nicht enthalten.
742-746:
//---
1000-1005:
Es sieht so aus, als ob Kaleem eine leicht veraltete Plattformversion verwendet.
Aber der Klarheit halber und um die Fehleranfälligkeit zu verringern, sollte der Quellcode so geändert werden, dass die Arrays mit expliziten Größen als text[TOOLTIP1_LINES_TOTAL] und text[TOOLTIP5_LINES_TOTAL] definiert werden. Andernfalls kann es in Zukunft zu Out-of-Bounds-Fehlern kommen, wenn sich Arrays ändern, Defines aber nicht durch eine Auslassung.
Die Fehler befinden sich im Download-Bereich des Artikels, vielleicht wurde er nicht aktualisiert.
Ja, die englische Version hat diese Fehler. Es scheint, dass die Redakteure, die an der Übersetzung ins Englische arbeiten, versehentlich Begrenzungszeichen (,) Elemente von Arrays gelöscht haben.
Es sieht so aus, als ob Kaleem eine leicht veraltete Plattformversion verwendet.
Aber der Klarheit halber und um die Fehleranfälligkeit zu verringern, sollte der Quellcode so geändert werden, dass die Arrays mit expliziten Größen als text[TOOLTIP1_LINES_TOTAL] und text[TOOLTIP5_LINES_TOTAL] definiert werden. Andernfalls kann es in Zukunft zu Out-of-Bounds-Fehlern kommen, wenn sich Arrays ändern, Defines aber nicht durch eine Auslassung.
Ich verwende MetaTrader 4 Version: 4.00 Build 950. Ist das nicht die neueste Version?
Anatoly, ist es möglich, zwei Fenster vom Hauptpanel aus zu öffnen, so dass alle drei Fenster aktiv bleiben?
D.h.: wir haben ein Hauptpanel, es hat Schaltflächen, um zwei zusätzliche Panels zu öffnen, jedes dieser zusätzlichen Panels hat seinen eigenen Satz von Schaltflächen und andere Dinge.
Drücken Sie die Schaltfläche1 auf dem Hauptfenster - Fenster1 wird geöffnet. Die Schaltflächen auf dem Hauptbedienfeld bleiben aktiv und auf Bedienfeld1 sind sie ebenfalls aktiv.
Drücken Sie Taste2 auf dem Hauptbedienfeld, wenn Bedienfeld1 bereits geöffnet ist - Bedienfeld2 wird geöffnet. Alle Tasten auf dem Hauptbedienfeld, auf Bedienfeld1 und auf Bedienfeld2 bleiben aktiv.
Auf diese Weise können Sie eine Oberfläche mit beweglichen aktiven Bedienfeldern haben, von denen jedes seine eigenen Funktionen ausführt.
Jetzt ist es möglich, jeweils nur ein aktives Panel zu haben.

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Grafische Interfaces IV: Der Multi-Window-Modus und das System für Prioritäten (Kapitel 2) :
In diesem Kapitel werden wir die Bibliothek um die Möglichkeit der Erzeugung von Multi-Window-Modus-Interfaces für MQL Anwendungen erweitern. Wir werden zudem ein System für die Priorität eines Klicks mit der linken Maustaste auf grafische Objekte entwickeln. Dieses ist notwendig um Probleme zu vermeiden, falls der Anwender auf ein grafisches Element klickt und dieses nicht reagiert.
Der Multi-Window-Modus
Lassen Sie uns den Multi-Window-Modus des grafischen Interfaces unserer zu entwickelnden Bibliothek betrachten. Bis jetzt bietet die ENUM_WINDOW_TYPE Enumeration zwei Bezeichner: für das Haupt-(W_MAIN) und das Dialog (W_DIALOG) -Fenster (Window). Der Ein-Fenster-Modus war der einzige Modus, den wir gebraucht haben. Nachdem wir ein paar Ergänzungen hinzugefügt haben, muss für das Aktivieren des Multi-Window-Modus lediglich noch die Erzeugung und das Hinzufügen der benötigten Anzahl von Formularen zur Basis erfolgen.
Erzeugen sie in der Hauptklasse für die Event-Bearbeitung CWndEvents eine Variable für das Abspeichern des Index des aktuellen aktiven Fensters.
Lassen Sie uns nun ansehen, wie der Index des aktiven Fensters identifiziert werden kann. Wenn nun zum Beispiel der Anwender einem Button ein Dialogfenster (W_DIALOG) zuweist: Sind nun der Button gedrückt wird, dann wird das ON_CLICK_BUTTON Event erzeugt. Dieses Event kann in dem CProgram::OnEvent() Eventhandler der Benutzerklasse nachverfolgt werden. Wir verwenden zudem die CWindow::Show() Methode des Formulars welche noch gezeigt werden muss. Die aktuelle Implementation der Bibliothek ist noch nicht ausreichend und wir werden die notwendigen Erweiterungen vorstellen.
Autor: Anatoli Kazharski