Zum Inhalt springen

Gambas: Menü

Aus Wikibooks


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.

Der Gambas Menüeditor
  • 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.

Unser erstes Menü

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.

Ein Optionsmenü

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.

Ein dynamisches Menü

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.

Ein Kontextmenü