English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
Benutzerdefinierte grafische Bedienelemente. Teil 2. Bibliothek von Bedienelementen

Benutzerdefinierte grafische Bedienelemente. Teil 2. Bibliothek von Bedienelementen

MetaTrader 5Beispiele | 26 Januar 2016, 11:13
669 0
Dmitry Fedoseev
Dmitry Fedoseev

Einleitung

Der Beitrag "Benutzerdefinierte grafische Bedienelemente. Teil 1. Erstellen eines einfachen Bedienelements" legte die Prinzipien der Erstellung grafischer Bedienelemente dar. Es wurde ein Satz von Bedienelementen für den Umgang mit den wichtigsten Problemen erstellt, die bei der Interaktion zwischen einem Programm (Expert Advisor, Script, Indikator) und einem Benutzer auftreten.

Einige Bedienelemente sind mit weit verbreiteten Standard-Bedienelementen nahezu identisch, andere wurden unter Berücksichtigung der Funktionen und Fähigkeiten des Terminals entwickelt. Alle Bedienelemente werden als separate Klassen designt und der Datei IncGUI.mqh im vorherigen Beitrag hinzugefügt (der neue Dateiname lautet IncGUI_v2.mqh).

Abgesehen von den neu hinzugefügten Bedienelementen wurden noch weitere Änderungen an der Datei vorgenommen: Die CGraphicObjectShell-Klasse wurde um Methoden zur gleichzeitigen Festlegung der Koordinaten und Größen SetXYDistance(), SetXYSize() erweitert. Außerdem wurde ein Tippfehler im Word Distance in einigen Methodennamen korrigiert (vorher: Distanse).

In der CInputBox-Klasse wurde ein Tippfehler in der Methode SetValueString() korrigiert (vorher SetValueStrind) und die Methoden SetReadOnly() und ReadOnly() wurden hinzugefügt. Die SetReadOnly()-Methode aktiviert/deaktiviert die Möglichkeit, Tastatureingaben im Textfeld vorzunehmen. Die ReadOnly()-Methode macht es möglich, herauszufinden, ob Tastatureingaben erlaubt sind oder nicht.

Die Reihenfolge der Farbmuster, die mithilfe der Methode Show() angezeigt werden, wurde in der CColorSchemes-Klasse angepasst. Die Farbschemata haben nun etwas mehr Farben als erwartet, deshalb werden die Schemata vertikal und die Farben horizontal angeordnet. Außerdem wurden einige neue Farbschemata der CColorSchemes-Klasse hinzugefügt.

Dieser Beitrag liefert eine Bibliothek mit den folgenden Bedienelementen:

  1. CInputBox (Textfeld),
  2. CSpinInputBox (Textfeld mit Spin-Button),
  3. CCheckBox (Kontrollkästchen),
  4. CRadioGroup (Gruppe von Optionsschaltflächen),
  5. CVScrollBar (vertikale Scroll-Leiste),
  6. CHScrollBar (horizontale Scroll-Leiste),
  7. CList (Liste),
  8. CListMS (Liste mit Mehrfachauswahl),
  9. CComBox (Drop-Down-Liste),
  10. CHMenu (horizontales Menü),
  11. CVMenu (vertikales Menü),
  12. CHProgress (horizontaler Fortschrittsbalken),
  13. CDialer (Ziffernblock),
  14. CDialerInputBox (Ziffernblock mit Textfeld),
  15. CTable (Tabelle).  

Sehen wir uns die Bedienelemente im Einzelnen mit Beispielen für ihre Verwendung an (ausgenommen CInputBox, da darauf bereits im Beitrag "Benutzerdefinierte grafische Bedienelemente. Teil 1. Erstellen eines einfachen Bedienelements" sehr detailliert eingegangen wurde).


1. CSpinInputBox-Klasse

Textfeld mit Spin-Button (Abb. 1).

 Abb. 1 CSpinInputBox-Klasse (Textfeld mit Spin-Button)
Abb. 1. CSpinInputBox-Klasse (Textfeld mit Spin-Button)

Durch Klicken auf den "+"-Button wird der Wert im Textfeld um einen festgelegten Wert erhöht, durch Klicken auf den "-"-Button um diesen Wert gesenkt.

Zusätzlich zur Änderung der Werte durch die Spin-Buttons können Sie Tastatureingaben im Textfeld aktivieren (SetReadOnly()-Methode). Dieses Bedienelement basiert auf CInputBox im numerischen Modus und hat ähnliche Methoden zum Festlegen der Grenzwerte: SetMaxValue(), SetMinValue().

Im Gegensatz zu CInputBox wird beim Aufruf der Init()-Methode in der CSpinInputBox-Klasse anstatt des Digits-Parameters der Change-Parameter übertragen, der die Wertveränderung durch die Spin-Buttons darstellt. Der Wert des Change-Parameters definiert die Anzahl von Nachkommastellen, die für den Wert im Textfeld vorgegeben ist. Sie können diese Einstellungen im Programm vornehmen und den Wert mithilfe der Methoden SetValue() und Value() abrufen. Die Anzahl von Nachkommastellen, die für den Wert vorgegeben ist, kann mithilfe der Methode Digits() abgerufen werden.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CSpinInputBox.mq5.


2. CCheckBox-Klasse

Kontrollkästchen oder Ein-/Aus-Schalter (Abb. 2).

Abb. 2 CCheckBox-Klasse (Kontrollkästchen oder Ein-/Aus-Schalter)
Abb. 2. CCheckBox-Klasse (Kontrollkästchen oder Ein-/Aus-Schalter)

Das ist ein ziemlich simples Bedienelement, das zwei Werte annehmen kann: ein oder aus. Im Status "aus" erscheint es als Quadrat. Im Status "ein" erscheint im Quadrat ein Häkchen. Sie können diese Einstellungen im Programm ändern und den Wert mithilfe der Methoden SetValue() und Value() abrufen.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CCheckBox.mq5.


3. CRadioGroup-Klasse

Gruppe von Optionsschaltflächen (Abb. 3).

Abb. 3 CRadioGroup-Klasse (Gruppe von Optionsschaltflächen)
Abb. 3. CRadioGroup-Klasse (Gruppe von Optionsschaltflächen)

Die Gruppe von Optionsschaltflächen dient der Auswahl einer von mehreren Optionen (beispielsweise Auswahl des Auftragstypen). Dieses Bedienelement wird auf die gleiche Weise genutzt wie andere Bedienelemente: Zuerst wird die Init()-Methode mit Angabe des Gruppennamen in den Parametern aufgerufen, dann werden die Schaltflächen erstellt. Die Buttons werden mithilfe der Methode AddButton() erstellt.

Der erste Parameter der Methode AddButton() definiert die Beschriftung auf der rechten Seite des Buttons, gefolgt von den X- und Y-Koordinaten in Bezug auf die Koordinaten des gesamten Bedienelements.

Somit können die Buttons in der Gruppe in jeder beliebigen Reihenfolge angeordnet werden (nicht nur horizontal oder vertikal) und die gesamte Button-Gruppe kann durch eine Änderung der Gruppenkoordinaten verschoben werden, ohne die Koordinaten neu zu berechnen. Die Methode AddButton() muss so oft aufgerufen werden, wie es Buttons in der Gruppe gibt, die Sie erstellen möchten.

Nach der Erstellung der Buttons muss ein ausgewählter Button durch die Methode SetValue() bestimmt werden. Diese Methode hat nur einen Parameter, der den Index des ausgewählten Buttons angibt. Die Buttons werden von Null aufwärts in der Reihenfolge, in der Sie durch die AddButton()-Methode erstellt wurden, nummeriert. Um den Index eines ausgewählten Buttons abzufragen, wird die Methode Value() verwendet.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CRadioGroup.mq5.


4. CVSсrollBar-Klasse  

Vertikale Scroll-Leiste (Abb. 4).

Abb. 4 CVScrollBar-Klasse (vertikale Scroll-Leiste) 
Abb. 4. CVScrollBar-Klasse (vertikale Scroll-Leiste)

Dies ist ein weit verbreitetes und häufig genutztes Bedienelement. Die vertikale Scroll-Leiste hat ihre eigenen Eigenschaften: Minimalwert, Maximalwert (die den gültigen Bereich der Werte des Bedienelements definieren), kleine Änderung (Wertänderung beim Klicken auf den Button zum Hoch- oder Herunterscrollen), große Änderung (Wertänderung beim Klicken in den Bereich zwischen dem Scroll-Button und dem Scroll-Balken).

Zusätzlich zu den Wertänderungen durch eine kleine Änderung beim Anklicken der Scroll-Buttons und eine große Änderung beim Anklicken des Bereichs zwischen dem Scroll-Balken und den Scroll-Buttons ist es auch möglich, den Scroll-Balken an eine bestimmte Position zu schieben. Um den Scroll-Balken an eine bestimmte Position zu schieben, muss man den Scroll-Balken anklicken, sodass er ausgewählt wird (seine Farbe ändert sich), und anschließend auf die erforderliche Position klicken. Der Scroll-Balken springt zur angegebenen Position und wird abgewählt.

Falls der Scroll-Balken versehentlich ausgewählt wurde, müssen Sie ihn nochmals anklicken, um ihn abzuwählen. Wenn Sie einen der Scroll-Buttons anklicken, während der Scroll-Balken ausgewählt ist, springt der Balken zum Anfang bzw. zum Ende und das Bedienelement erhält entweder den Maximal- oder den Minimalwert.

Die Anwendung des Bedienelements beginnt mit dem Aufruf der Init()-Methode nach Eingabe des Namen, der Höhe und der bedingten Höhe (von 1 bis 4) in den Parametern.

Der Wertbereich wird anschließend durch die Methoden SetMin() und SetMax() definiert und Werte für eine kleine und eine große Änderung jeweils durch die Methoden SetSmallChange() bzw. SetLargeChange() festgelegt. Der Wert des Bedienelements (Position des Scroll-Balkens) wird durch die Methode Value() abgerufen.

Die Position des Scroll-Balkens kann im Programm mithilfe der Methode SetValue() verändert werden. 

  Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CVSсrollBar.mq5.


5. CHSсrollBar-Klasse

Horizontale Scroll-Leiste (Abb. 5).

Abb. 5 CHScrollBar-Klasse (horizontale Scroll-Leiste) 
Abb. 5. CHScrollBar-Klasse (horizontale Scroll-Leiste)

Dieses Bedienelement ist weitestgehend mit der vertikalen Scroll-Leiste identisch. Der Unterschied ist, dass beim Aufrufen der Init()-Methode der zweite anzugebende Parameter die Breite der Leiste anstatt ihrer Höhe ist.

  Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CHSсrollBar.mq5.


6. CList-Klasse

Liste (Abb. 6).

Abb. 6 CList-Klasse (Liste)
Abb. 6. CList-Klasse (Liste)

Dieses Bedienelement besteht aus einer Reihe von Textfeldern, die die Listeneinträge anzeigen. Die Anzahl sichtbarer Felder wird bei der Initialisierung des Bedienfelds definiert. Falls die Anzahl der Listeneinträge die Anzahl sichtbarer Felder überschreitet, erscheint die vertikale Scroll-Leiste.

Einer der Listeneinträge kann ausgewählt werden (farbiger Eintrag in Abb. 6). Was die Auswahl von Einträgen betrifft, kann das Bedienelement auf zwei Arten genutzt werden: Die Abwahl von Einträgen kann erlaubt oder nicht erlaubt werden. Diese Modi werden durch die Methode SetAllowDeselect() festgelegt.

Der Name des Bedienelements, seine Breite in Pixeln und Höhe in Anzahl von Einträgen werden beim Aufruf der Init()-Methode übertragen.

Nach der Init()-Methode wird die AddItem()-Methode genutzt, um einen neuen Eintrag zur Liste hinzuzufügen. Falls erforderlich, wird anschließend ein ausgewählter Eintrag durch die Methode SetSelectedIndex() bestimmt. Ein Eintrag kann immer durch das Programm abgewählt werden, indem man einen Wert von -1 an die Methode SetSelectedIndex() überträgt.

Ein ausgewählter Eintrag kann durch die Methode SelectedIndex() identifiziert werden. Falls die Methode -1 ausgibt, gibt es keinen ausgewählten Eintrag in der Liste. Außerdem kann der Text eines ausgewählten Eintrags mithilfe der Methode SelectedText() abgerufen werden.

Um den Text eines beliebigen Listeneintrags abzurufen, wird die Methode Text() mit Angabe des Index des Eintrags verwendet. Der Text jedes beliebigen Eintrags kann mithilfe der Methode SetText() verändert werden. Die Methode DeleteItem() löscht den Eintrag, die Methode Clear() löscht die gesamte Liste. 

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CList.mq5.


7. CListMS-Klasse

Liste mit Mehrfachauswahl (Abb. 7).

Abb. 7 CListMS-Klasse (Liste mit Mehrfachauswahl)
Abb. 7. CListMS-Klasse (Liste mit Mehrfachauswahl)

Dieses Bedienelement ist identisch mit dem Bedienelement "Liste" mit einer Ausnahme: Ein gleichzeitiges Vorhandensein mehrerer ausgewählter Einträge ist erlaubt. Somit ist die Herangehensweise an den Zugriff auf ausgewählte Einträge etwas anders.

Bei der Arbeit mit der einfachen Liste erhält die SetSelected()-Methode einen Parameter, der den Index des ausgewählten Eintrags angibt (nach der Auswahl eines neuen Eintrags wird der vorherige Eintrag abgewählt). In der Liste mit Mehrfachauswahl werden zwei Parameter an die SetSelected()-Methode übertragen: Index und Status des Eintrags (true/false – ausgewählt/nicht ausgewählt). Um zu prüfen, ob ein Eintrag ausgewählt ist, wird die Selected()-Methode verwendet, die den übertragenen Index des zu prüfenden Eintrags empfängt.

Die Methoden FirstSelected() und NextSelected() werden für die Verarbeitung aller ausgewählten Einträge genutzt. Die FirstSelected()-Methode gibt den Index des ersten ausgewählten Listeneintrags aus, die NextSelected()-Methode den Index des nächsten ausgewählten Eintrags nach dem Index des beim letzten Aufruf der FirstSelected()- oder NextSelected()-Methoden erhaltenen Eintrags.

Die folgende Struktur kann genutzt werden, um alle ausgewählten Einträge zu durchlaufen: 

// All selected items iteration
 
int Selected=lstm.FirstSelected();
    while(Selected!=-1){
        //=======================================
        // An action with the selected item        
        // ======================================
       Selected=lstm.NextSelected();
   } 

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CListMS.mq5.


8. CComBox-Klasse

Drop-Down-Liste (Abb. 8.1).

Abb. 8,1 CComBox-Klasse (Drop-Down-Liste)
Abb. 8,1. CComBox-Klasse (Drop-Down-Liste)

Dieses Bedienelement stellt ein Textfeld mit einem kleinen Button dar, der angeklickt werden muss, damit die Drop-Down-Liste sich öffnet (Abb. 8.2). Für die Anzeige der Liste wird das Bedienelement "Liste" verwendet. Der Text des ausgewählten Eintrags wird im sichtbaren Textfeld angezeigt.

Dieses Bedienelement kann auf zwei Arten verwendet werden: Die erste ermöglicht ausschließlich die Auswahl aus der Liste, die zweite ermöglicht Tastatureingaben (der Modus wird durch die SetReadOnly()-Methode festgelegt). Deshalb gibt es einige Unterschiede zwischen diesem Bedienelement und der Liste.

Falls sich der per Tastatur eingegebene Wert in der Liste befindet, wird der entsprechende Listeneintrag ausgewählt und die SelectedIndex()-Methode gibt den Index dieses Eintrags aus.

Falls der eingegebene Wert nicht in der Liste gefunden wird, gibt die SelectedIndex()-Methode deshalb -1 aus. Deshalb wird zum Abrufen des Wertes dieses Bedienelements die Methode Value() verwendet, die die Inhalte des sichtbaren Textfelds ausgibt. Um also den Wert programmatisch festzulegen, kann entweder die SetSelectedIndex()-Methode (entspricht dem Anklicken des Eintrags) oder die SetValue()-Methode (entspricht der Eingabe eines Werts per Tastatur) verwendet werden.

Abb. 8,2 Ausgeklappte Drop-Down-Liste
Abb. 8,2. Ausgeklappte Drop-Down-Liste

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CTable.mq5.


9. CHMenu-Klasse

Horizontales Menü (Abb. 9.1).

Abb. 9,1 CHMenu (horizontales Menü)
Abb. 9,1. CHMenu (horizontales Menü)

Dieses Bedienfeld besteht aus mehreren Textfeldern, die die in einer horizontalen Reihe angeordneten Menüeinträge darstellen, und Buttons an den Seiten. Die Buttons auf der Seite mit einer vertikalen Linie werden verwendet, um durch das Menü zu seinem Anfang oder Ende zu scrollen. Die Pfeilbuttons werden verwendet, um um einen "Bildschirm" (um die Zahl sichtbarer Einträge) weiterzuscrollen. Das Hauptziel dieses Menüs ist die Ausführung von Aktionen im Programm.

Beim Anklicken eines Menüeintrags wird ein Ereignis generiert, gemäß dem ein Befehl ausgeführt werden soll. Zusätzlich zur direkten Ausführung von Befehlen kann das Menü genutzt werden, um Instrumente zu aktivieren/deaktivieren.

Beispielsweise hat der Expert Advisors ein paar Optionen zum Schließen einer Position: durch die Verwendung der Indikatoren 1, 2 und 3. Ein Benutzer kann eine oder alle Optionen oder jede beliebige Kombination aus zwei Instrumenten aktivieren, um die Position mithilfe des Indikators, der als erster ein Signal zum Schließen sendet, zu schließen.

Es wird das folgende Schema empfohlen: Beim Anklicken des Menüs erscheint ein Fenster zum Festlegen der Instrumentparameter und zum Aktivieren des Instruments. Der Benutzer legt die Parameter fest, aktiviert das Instrument und klickt auf "OK", sodass das Instrument ab diesem Zeitpunkt funktionsfähig ist.

Um deutlich zu sehen, welche Instrumente aktuell in Benutzung sind, gibt es eine Methode zum Markieren des Eintrags (des Hakens) – die SetChecked()-Methode. Wenn das Menü die ausgewählten Einträge enthält, verändert es die Farbe, um zu verdeutlichen, dass es aktivierte Instrumente im Menü gibt, auch wenn der aktivierte Eintrag nicht zu sehen ist. Es ist möglich, alle ausgewählten Einträge im Programm durch die CheckedExist()-Methode zu identifizieren. Mithilfe der Checked()-Methode kann man außerdem sehen, ob ein bestimmter Menüeintrag ausgewählt ist.

Abb. 9,2 Horizontales Menü mit ausgewähltem Eintrag
Abb. 9,2. Horizontales Menü mit ausgewähltem Eintrag

Die Anwendung dieses Bedienelements sowie aller anderen Bedienelemente beginnt mit der Init()-Methode, an die der Name des Bedienelements, seine Breite in Pixeln und die Anzahl sichtbarer Einträge übertragen werden. Die auf die Init()-Methode folgende AddItem()-Methode wird genutzt, um Einträge hinzuzufügen.

Da das Bedienelement voraussetzt, dass andere Bedienelemente als Reaktion auf seine Befehle angezeigt werden, verfügt es über Methoden zum Abrufen der Koordinaten des angeklickten Menüeintrags, eine Methode zum Abrufen des Bildschirmviertels, in dem der Eintrag sich befindet, und eine Methode zum Abrufen der Breite des Eintrags, um das angezeigte Bedienelement in einem geeigneten Viertel des Bildschirms zu platzieren.

Die Methoden LastClickedX() und LastClickedY() werden zum Abrufen der Koordinaten genutzt, die Methode LastClickedQuarter() zum Abrufen des Bildschirmviertels (Wert 1: obere linke Ecke, 2: obere rechte Ecke, 3: untere linke Ecke, 4: untere rechte Ecke), die Methode LastClickedW() zum Abrufen der Eintragsbreite. 

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CHMenu.mq5.


10. CVMenu-Klasse

Vertikales Menü (Abb. 10).

Abb. 10 CVMenu-Klasse (vertikales Menü)
Abb. 10. CVMenu-Klasse (vertikales Menü)

Dieses Bedienelement entspricht vollständig dem horizontalen Menü, was seinen Zweck, seine Funktionen und seine Verwendung betrifft. Der Unterschied ist, dass seine Einträge vertikal angeordnet sind und zum Scrollen eine vertikale Scroll-Leiste verwendet wird. Es gibt noch einen weiteren Unterschied: Anstatt der LastClickedW()-Methode, die im horizontalen Menü verwendet wird, um die Breite des Eintrags abzurufen, wird hier die ItemHeight()-Methode verwendet, um die Höhe des Eintrags zu definieren.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CVMenu.mq5.


11. CHProgress-Klasse

Horizontaler Fortschrittsbalken (Abb. 11).

Abb. 11 CHProgress-Klasse (horizontaler Fortschrittsbalken) 
Abb. 11. CHProgress (horizontaler Fortschrittsbalken)

Mit diesem Bedienelement wird der Fortschritt einer Aufgabe in Prozent angezeigt. Nehmen wir an, es muss eine komplexe, zeitintensive Berechnung für jedes Bar des Diagramms zu Recherchezwecken durchgeführt werden. Es wäre interessant zu wissen, wie weit die Aufgabe durchgeführt wurde und wie viel Zeit bis zum Ende der Durchführung verbleibt, damit Sie Ihre Zeit im Voraus einplanen können, oder zumindest, um zu wissen, dass das Programm noch ausgeführt wird und nicht eingefroren ist. Der linke Teil des Fortschrittbalkens zeigt den prozentualen Anteil der Ausführung an, der rechte Teil die geschätzte verbleibende Zeit bis zum Abschluss.

Beim Aufrufen der Init()-Methode werden zwei Parameter an sie übertragen: der Name und die Breite in Pixeln. Gleich vor dem Beginn der kontrollierten Schleife muss die Begin()-Methode aufgerufen werden, die die Parameter der Schleife empfängt: Minimalwert und Maximalwert. Innerhalb der Schleife legt die SetValue()-Methode den Wert fest, der durch den Fortschrittsbalken angezeigt wird. Beim Verlassen der Schleife setzt die Reset()-Methode den Fortschrittsbalken in seinen ursprünglichen Zustand zurück.

Bei jedem Aufruf der SetValue()-Methode werden die grafischen Objekte neu gezeichnet. Deshalb kann die Nutzung des Fortschrittbalkens zum größten Verbraucher von Computerressourcen werden und die Durchlaufzeit der Schleife deutlich verlängern, und zwar bis zu einem Punkt, an dem die Verwendung des Fortschrittsbalkens ineffizient wird. Für diesen Fall verfügt das Bedienelement über die Methode SetRefreshInterval(), an die der Wert des Aktualisierungsintervalls in Sekunden übertragen wird.

Wenn das Aktualisierungsintervall festgelegt wurde, überprüft die SetValue()-Methode bei jedem Aufruf zuerst die Zeit der letzten Aktualisierung des Bedienelements. Die Berechnung wird nur dann durchgeführt und der Fortschrittsbalken nur dann neu gezeichnet, wenn diese Zeit das festgelegte Intervall übersteigt. 

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CHProgress.mq5.


12. CDialer-Klasse

Ziffernblock (Abb. 12).

Abb. 12 CDialer-Klasse (Ziffernblock)
Abb. 12. CDialer-Klasse (Ziffernblock)

Dieses Bedienelement ist für die Nutzung innerhalb der CDialerInputBox-Klasse gedacht, kann aber auch unabhängig genutzt werden.

Beispielsweise wird das Bedienelement beim Drücken eines beliebigen Knopfs sichtbar. Der Benutzer wählt einen Wert, drückt "OK" und das Programm nutzt den von der Value()-Methode empfangenen Wert, was grundsätzlich dem entspricht, was im Bedienelement Ziffernblock mit Textfeld geschieht, in dem der zuletzt eingegebene Wert immer im Textfeld angezeigt wird, neben dem sich der Button, der den Ziffernblock erweitert, befindet.

Ein Parameter, der Name, wird an die Init()-Methode übertragen.

Buttons: "X" schließt den Ziffernblock, ohne den Wert zu ändern, "C" setzt den eingegebenen Wert zurück, "OK" bestätigt den eingegebenen Wert, der Zweck der Zifferntasten ist selbsterklärend, der Dezimalpunkt gibt den Nachkommateil einer Zahl ein, der "-"-Button ändert das Vorzeichen einer Zahl (positiv/negativ). Die eingegebenen Zahlen werden im Textfeld im unteren Bereich des Ziffernblocks angezeigt.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CDialer.mq5.


13. CDialerInputBox-Klasse

Ziffernblock mit Textfeld (Abb. 13).

Abb. 13 CDialerInputBox-Klasse (Ziffernblock mit Textfeld)
Abb. 13. CDialerInputBox-Klasse (Ziffernblock mit Textfeld)

Dieses Bedienelement basiert auf den Bedienelementen Textfeld und Ziffernblock und besteht aus einem Textfeld mit einem Button zum Erweitern des Ziffernblocks daneben. Dieses Bedienelement hat zwei Arbeitsmodi: Eingabe nur über den Ziffernblock und zusätzliche Tastatureingabe.

Die Tastatureingabe wird durch die SetReadOnly()-Methode aktiviert/deaktiviert. 

Vier Parameter werden an die Init()-Methode übertragen: Name, Breite in Pixeln, Anzahl von Nachkommastellen, gemäß der der Wert angezeigt wird, und die Beschriftung neben dem Bedienelement. 

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CDialerInputBox.mq5.


14. CTable-Klasse

Tabelle (Abb. 14).

Abb. 14 CTable-Klasse (Tabelle) 
Abb. 14. CTable-Klasse (Tabelle)

Der Name des Bedienelements ist selbsterklärend: Es dient der Darstellung von Datentabellen. 

Drei Parameter werden an die Init()-Methode übertragen: Name, Breite und Höhe in Pixeln. Die tatsächliche Größe der Tabelle wird durch die Anzahl an Zeilen, Spalten und deren Größen definiert, kann aber nicht die Größenwerte übersteigen, die beim Aufruf von Init() angegeben werden. Falls die tatsächliche Größe der Tabelle die Größenwerte übersteigt, die beim Aufruf von Init() angegeben werden, werden Scroll-Leisten angezeigt.

Nutzung. Nach der Initialisierung der Tabelle durch die Init()-Methode wird die Anzahl von Tabellenspalten durch die Methode SetCollsCount() und die Anzahl der Zeilen durch die Methode SetRowsCount() definiert. Anstatt der SetRowsCount()-Methode kann die AddRow()-Methode verwendet werden. Jedes Mal, wenn sie aufgerufen wird, wird eine Zeile zur Tabelle hinzugefügt. Nachdem die Tabellengröße (Anzahl der Spalten und Zeilen) definiert wurde, können die Zellen mit Werten befüllt werden.

Zur Eingabe der Zellenwerte wird die Methode SetCellText() benutzt. Zusätzlich zum Zellentext können auch alle anderen Zelleneigenschaften verändert werden: Hintergrundfarbe, Textfarbe, Schriftgröße, Schriftart (Methoden SetCellBGColor(), SetCellTxtColor(), SetCellFontSize(), SetCellFont()). Die Zeilenhöhe kann mithilfe der Methode SetRowHeight() verändert werden, die Spaltenbreite mithilfe der Methode SetCollWidth().

Die Methode SetCellsMerge() wird verwendet, um mehrere Zellen zu einer zu verschmelzen, und hat vier Parameter: Zeilenindex, Spaltenindex, RowSpan- und CollSpan-Parameter (ähnlich wie die Attribute RowSpan und CollSpan in HTML).

Der Parameter RowSpan definiert die Zahl der vertikal verschmolzenen Zellen, der Parameter CollSpan die Zahl der horizontal verschmolzenen Zellen. Die verschmolzenen Zellen können durch Festlegen der Werte von RowSpan und CollSpan als 1 wiederhergestellt werden.

Für eine komfortablere Betrachtung hat die Tabelle eine Fadenkreuz-Funktion. Beim Anklicken einer Zelle werden die Spalte und die Zeile dieser Zelle mit einer anderen Farbe markiert. Nach einem weiteren Klick in dieselbe Zeile kehrt die Standard-Tabellenfarbe (sowie die Standardfarbe der Scroll-Leiste) zurück. Die Fadenkreuz-Funktion wird durch die SetAllowSelection()-Methode aktiviert/deaktiviert. Die Methoden LastClickedRow() und LastClickedColl() helfen beim Identifizieren der zuletzt angeklickten Zelle.

Die Methode HTML() wird verwendet, um einen HTML-Code der Tabelle zu erhalten, der für die weitere Ansicht im Browser als HTML-Datei gespeichert werden kann. Dieses Methode kann allerdings auch verwendet werden, ohne das Bedienelement anzuzeigen, sondern nur, um einen HTML-Code der Tabelle zu erhalten.

Ein Beispiel für die Verwendung dieses Bedienelements finden Sie in der angehängten Datei eIncGUI_v2_Test_CTable.mq5.


Fazit

Die in diesem Beitrag besprochenen Bedienelemente liefern Ihnen vermutlich nicht die Lösungen für alle Probleme, die bei der Interaktion zwischen einem Programm und einen Benutzer auftreten, decken aber dennoch die meisten davon ab:

  • Aktivieren/Deaktivieren durch Gebrauch des Kontrollkästchens;
  • Auswahl verschiedener Optionen durch Gebrauch der Optionsschaltflächen und Listen;
  • Einige Optionen für die schnelle und einfache Eingabe von Werten (Tastatureingabe, Eingabe durch Spin-Buttons, Eingabe durch Ziffernblock);
  • Möglichkeiten zur optischen Darstellung von Daten – wiederum Listen und Tabelle.

In dem Fall, dass diese Bedienelemente nicht ausreichen, können einige von ihnen als Komponenten für die Entwicklung anderer Bedienelemente verwendet werden, die für das vorliegende Problem besser geeignet sind. Auf jeden Fall hoffe ich, dass die bereitgestellten Bedienelemente nützlich sein werden.


Anhang

Liste angehängter Dateien:

  1. IncGUI_v2.mqh ist eine Include-Datei mit den Klassen CGraphicObjectShell, CWorkPiece, CColorSchemes und CInputBox und allen in diesem Beitrag vorgestellten Klassen von Bedienelementen. Die Datei sollte im Unterordner MQL5/Include des Datenordners des Terminals abgelegt werden.
  2. eIncGUI_v2_Test_CSpinInputBox.mq5 – Beispiel für die Verwendung der CSpinInputBox-Klasse. Diese und alle nachfolgenden Dateien (2 bis 16) sollten im Ordner MQL5/Experts abgelegt werden.
  3. eIncGUI_v2_Test_CCheckBox.mq5 – Beispiel für die Verwendung der CCheckBox-Klasse.
  4. eIncGUI_v2_Test_CRadioGroup.mq5 – Beispiel für die Verwendung der CRadioGroup-Klasse.
  5. eIncGUI_v2_Test_CVSсrollBar.mq5 – Beispiel für die Verwendung der CVScrollBar-Klasse.
  6. eIncGUI_v2_Test_CHSсrollBar.mq5 – Beispiel für die Verwendung der CHScrollBar-Klasse.
  7. eIncGUI_v2_Test_CList.mq5 – Beispiel für die Verwendung der CList-Klasse.
  8. eIncGUI_v2_Test_CListMS.mq5 – Beispiel für die Verwendung der CListMS-Klasse.
  9. eIncGUI_v2_Test_CComBox.mq5 – Beispiel für die Verwendung der CComBox-Klasse.
  10. eIncGUI_v2_Test_CHMenu.mq5 – Beispiel für die Verwendung der CHMenu-Klasse.
  11. eIncGUI_v2_Test_CVMenu.mq5 – Beispiel für die Verwendung der CVMenu-Klasse.
  12. eIncGUI_v2_Test_CHProgress.mq5 – Beispiel für die Verwendung der CHProgress-Klasse.
  13. eIncGUI_v2_Test_CDialer.mq5 – Beispiel für die Verwendung der CDialer-Klasse.
  14. eIncGUI_v2_Test_CDialerInputBox.mq5 – Beispiel für die Verwendung der CDialerInputBox-Klasse.
  15. eIncGUI_v2_Test_CTable.mq5 – Beispiel für die Verwendung des CTable-Klassenelements.
  16. eIncGUI_v2_Test_All zeigt die Erstellung aller Bedienelemente in einem Expert Advisor.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/313

Benutzerdefinierte grafische Bedienelemente. Teil 3. Formen Benutzerdefinierte grafische Bedienelemente. Teil 3. Formen
Dies ist der letzte der drei Beiträge, die sich grafischen Bedienelementen widmen. Er behandelt die Erstellung der Hauptkomponente der grafischen Oberfläche – der Form – und ihre Verwendung in Kombination mit anderen Bedienelementen. Zusätzlich zu den Formklassen wurden die Klassen CFrame, CButton und CLabel der Bibliothek von Bedienelementen hinzugefügt.
Haltepunkte im Tester: Es ist möglich! Haltepunkte im Tester: Es ist möglich!
Dieser Artikel befasst sich mit Haltepunkt-Emulation beim Durchlaufen des Testers, Debug-Informationen werden angezeigt.
Test Visualisierung: Handelshistorie Test Visualisierung: Handelshistorie
Beginnend mit Build 196 bietet das MetaTrader 4 Client Terminal eine Test-Visualisierungsfunktion. Sie ermöglicht das Kontrollieren von Expert Advisor Tests auf einem völlig neuen Niveau. Nun kann der Trading-Programmierer jede Aktion von seinem oder ihrem Expert Advisor beobachten, durch prüfen seiner Operationen in der Historie!
Erstellen eines Automatischen Handelssystems Erstellen eines Automatischen Handelssystems
Sie müssen zugeben, dass es verlockend klingt - Sie werden stolzer Besitzer eines Programms, das für Sie innerhalb von Minuten ein profitables Automatisches Handelssystem (AHS) entwickeln kann. Alles was Sie machen müssen, ist die wünschenswerten Eingaben und die Eingabetaste drücken. Und - hier ist es, Sie testen Ihr AHS und erwarten Sie positive Auszahlungen. Während andere Menschen tausende Stunden investieren, um dieses einzigartige AHS zu entwickeln, das sie "fürstlich bedient", klingt diese Aussage, gelinde gesagt, ziemlich gewagt. Auf der einen Seite sieht dies ein wenig überlebensgroß aus... Allerdings, nach meiner Meinung, kann dieses Problem gelöst werden.