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.
