Gambas: Menü
Zurück zum Gambasinhaltsverzeichnis.
Selbstverständlich ist es auch unter Gambas möglich, eine Menüführung zu programmieren, denn eine Befehlseingabe über Menüs macht ein Programm oft übersichtlicher und leichter bedienbar.
Erstes Menü
[Bearbeiten]Für unser erstes Menü beginnen wir mit einer leeren Form. Im Formfenster klicken wir mit der rechten Maustaste und wählen aus dem dort erscheinenden Kontextmenü den Punkt Menüeditor... oder drücken die Tastenkombination Strg + E.
- Ein Klick auf die Taste Einfügen erzeugt einen neuen Menüeintrag
- Der Menüeditor zeigt jetzt unter dem großen weißen Übersichtsfeld weiter unten mehrere Textboxen an (Name, Gruppe, Caption, Tag)
- Bei Name geben wir dem Menüpunkt einen Namen: mnuFile unter dem wir ihn innerhalb des Programms ansprechen können
- und bei Caption geben wir eine Beschriftung ein: Datei
Mit den Befehlsfeldern Nächste und Einfügen kann man jetzt jeweils neue Menüpunkte erzeugen. Wenn man dabei den Eintrag Caption leer lässt, wird statt eines Menüpunktes eine Trennlinie erzeugt.
Untermenüs
[Bearbeiten]Jetzt müssen wir noch festlegen, dass die weiteren Menüpunkte keine eigenen Menüs sind, sondern Untermenüs des ersten Eintrags. Dazu drücken wir die Taste mit dem Pfeil nach rechts. Oben im Menüeditor werden jetzt drei Punkte ... vor der Bezeichnung des Eintrags angezeigt.
Durch mehrmaliges drücken dieser Taste können dann entsprechend auch Unteruntermenüs, Unterunteruntermenüs, usw. erzeugt werden.
Wenn wir dann alle fünf Menüeinträge angelegt haben, können wird den Menüeditor mit OK beenden.
Codeeingabe
[Bearbeiten]Als letztes müssen wir noch den Programmcode eingeben, der beim Anklicken eines Menüpunktes ausgeführt werden soll. Dass ist aber nicht weiter schwer, da sich ein angeklickter Menüeintrag wie ein angeklickter Button verhält.
Wir geben im Codefenster einfach den folgenden Code ein:
PUBLIC SUB mnuClose_Click() ME.Close END
Jetzt können wir unser Programm mit F5 starten und das Menü testen. Beim Klick auf Schließen wird das Formular geschlossen.
Optionsmenü
[Bearbeiten]Ein Optionsmenü ist ein Menüpunkt, der wie eine CheckBox zwischen zwei Zuständen hin und her geschaltet werden kann. Um dies in unserem Programm zu realisieren benutzen wir die Checked-Eigenschaft des Menüpunktes.
Nehmen wir an, wir haben ein Programm, das eine Reihe von Daten ausgibt und wir wollen dem Benutzer die Möglichkeit geben, sich die Daten auch sortiert ausgeben zu lassen. Dazu erzeugen wir im Menüeditor zunächst einen neuen Hauptmenüpunkt mnuData mit der Beschriftung Daten und einen Untermenüpunkt mnuSorted mit der Beschriftung Sortiert.
Schließlich benötigen wir noch den folgenden Programmcode:
PUBLIC SUB mnuSorted_Click() 'Wert umschalten mnuSorted.Checked = NOT mnuSorted.Checked IF mnuSorted.Checked = TRUE THEN PRINT "Sortierung an" ELSE PRINT "Sortierung aus" ENDIF END
Wird nun dieser Menüeintrag aufgerufen, dann schaltet der Befehl in der dritten Zeile den Wert der Checked-Eigenschaft jeweils um. In der fünften Zeile ist zu sehen, wie wir den aktuellen Zustand des Menüpunktes im restlichen Programm auswerten können.
Dynamisches Menü
[Bearbeiten]Wenn man im Gambas-Projektfenster das Menü Datei und dann den Punkt Zuletzt geöffnet anwählt, erscheint ein Menü mit den Projekten, an denen man zuletzt gearbeitet hat. Aus offensichtlichen Gründen ist es nicht möglich, derartige Menüs schon zur Programmierzeit im Menüeditor zu erstellen, sondern sie müssen zur Laufzeit des Programms dynamisch erzeugt werden.
Dazu erzeugen wir im Menüeditor zunächst unterhalb des Öffnen...-Eintrags ein neues Untermenü mnuRecent mit der Beschriftung Zuletzt geöffnet. Dann ergänzen wir unser Programm noch um den folgenden Programmcode:
$aRecent AS NEW String[] PUBLIC SUB Form_Open() 'Beispieldaten $aRecent = ["Datei12","Datei34","Datei56","Datei78","Datei90"] 'Menü erzeugen UpdateMenu END SUB UpdateMenu() DIM sFile AS String DIM hMenuItem AS Object 'Die alten Einträge löschen mnuRecent.Children.Clear 'Deaktivieren, falls keine Einträge vorhanden sind IF $aRecent.Length = 0 THEN mnuRecent.Enabled = FALSE 'Die einzelnen Einträge erzeugen FOR EACH sFile IN $aRecent 'neuer Eintrag hMenuItem = NEW Menu(mnuRecent) AS "mnuRecentFile" 'Beschriftung hMenuItem.Text = sFile NEXT END PUBLIC SUB mnuRecentFile_Click() PRINT LAST.Text END
Die von uns erzeugten Einträge haben dann alle den gleichen Namen mnuRecentFile. Damit wir innerhalb der Funktion mnuRecentFile_Click() unterscheiden können welcher der Einträge angeklickt wurde, verwenden wir das LAST-Objekt. LAST ist eine Referenz auf das letzte Objekt, welches ein Ereignis (hier das Click()-Ereignis) ausgelöst hat. Mit LAST.Text greifen wir also auf die Text-Eigenschaft des zuletzt angeklickten Eintrags zu.
Kontextmenü
[Bearbeiten]In vielen Programmen erscheint nach einem Klick mit der rechten Maustaste ein Kontextmenü. Im folgenden wollen wir in unserem Gambasprogramm ein Steuerelement mit einem einfachen Kontextmenü versehen.
Dazu platzieren wir auf der Form einen Button und ergänzen den folgenden Programmcode:
PUBLIC SUB Button1_MouseDown() DIM hContext AS Object DIM hMenuItem AS Object IF Mouse.Right = TRUE THEN 'Das Kontextmenü selbst erzeugen hContext = NEW Menu(ME) AS "mnuContext" 'Die einzelnen Menüeinträge erzeugen hMenuItem = NEW Menu(hContext) AS "mnuRot" hMenuItem.Text = "Rot" hMenuItem = NEW Menu(hContext) AS "mnuBlau" hMenuItem.Text = "Blau" hMenuItem = NEW Menu(hContext) AS "mnuGruen" hMenuItem.Text = "Grün" 'Das Menü anzeigen hContext.Popup ENDIF END PUBLIC SUB mnuRot_Click() Button1.Background = Color.Red END PUBLIC SUB mnuBlau_Click() Button1.Background = Color.Blue END PUBLIC SUB mnuGruen_Click() Button1.Background = Color.Green END
Wenn man auf einem Steuerelement eine Maustaste drückt, wird die zugehörige MouseDown()-Funktion aufgerufen. Innerhalb derer müssen wir dann noch prüfen, ob die rechte Maustaste gedrückt wurde. Falls dem so ist, erzeugen wir das Menü und zeigen es an.