Kontextmenüs von A bis Z

Kontextmenüs sind die beste Möglichkeit, schnell die zum aktuell unter dem Mauszeiger befindlichen Element passenden Befehle anzuzeigen und auszuwählen. Viele Benutzer verwenden Kontextmenüs einfach nicht, weil sie nichts mit der rechten Maustaste anzufangen wissen, und auch Entwickler lassen sie links liegen, weil sie die Chancen nicht erkennen. Wir zeigen, wie Sie wo mit dem Kontextmenü für perfekte Ergonomie sorgen können.

Grundsätzlich muss man bei Kontextmenüs zwei Wege der Erstellung unterscheiden: Bis Access 2003 gibt es einen komfortablen Dialog für diese Aufgabe, den wir zu Beginn besprechen. Mit Access 2007 hat Microsoft jedoch das Ribbon eingeführt und zwar die Kontextmenüs verschont, aber die Menü- und Symbolleisten sowie den Anpassen-Dialog zum einfachen Erstellen dieser Elemente rausgeworfen (vielleicht kommt er mit der nächsten Office-Version zurück – wer weiß).

Ab Access 2007 ist man somit auf alternative Methoden angewiesen, die in erster Linie auf den Einsatz von VBA hinauslaufen. Der zweite Teil dieses Beitrags beschäftigt sich mit diesem Thema. Schließlich gibt es einige Gelegenheiten für den Einsatz von Kontextmenüs, die wir im dritten Teil dieses Beitrags vorstellen.

Kontextmenüs per Anpassen-Dialog

Der Anpassen-Dialog ist die bequemste Variante zum Erstellen von Menü- und Symbolleisten und auch für Kontextmenüs. Dieser Dialog ist nur bis einschließlich Access 2003 verfügbar und lässt sich, wie treffend, über den Eintrag Anpassen des Kontextmenüs der Menü- und Symbolleisten aufrufen.

Neues Kontextmenü anlegen

Ein neues Kontextmenü legen Sie ausgehend vom Anpassen-Dialog wie folgt an:

  • Klicken Sie auf der Registerseite Symbolleisten auf den Eintrag Neu und tragen Sie im nun erscheinenden Fenster den Namen ein, zum Beispiel MeinKontextmenue (siehe Bild 1).
  • Die neue Symbolleiste sieht zunächst nicht nach Kontextmenü aus. Bevor wir das ändern, fügen wir noch zwei oder drei Steuerelemente hinzu. Wechseln Sie im Anpassen-Dialog auf die Registerseite Befehle und ziehen Sie aus der rechten Liste den Eintrag Benutzerdefiniert entsprechend der gewünschten Anzahl Steuerelemente in die Symbolleiste.
  • Die Symbolleiste sieht nun wie in Bild 2 aus. Wechseln Sie nun zurück zur Registerseite Symbolleisten des Anpassen-Dialogs, stellen Sie sicher, dass der Eintrag MeinKontextmenue ausgewählt ist, und klicken Sie auf die Schaltfläche Eigenschaften.
  • Dies öffnet den Dialog aus Bild 3. ändern Sie hier die Eigenschaft Typ auf Popup. Nachdem Sie die folgende Meldung bestätigt haben, verschwindet die Symbolleiste vom Bildschirm und ist auch in der Liste der Symbolleisten im Anpassen-Dialog nicht mehr zu finden.

abb001.tif

Bild 1: Anlegen einer neuen Symbolleiste, die einmal ein Kontextmenü werden soll

abb004.tif

Bild 2: Symbolleiste mit Schaltflächen

abb002.tif

Bild 3: Umwandeln der Symbolleiste in ein Kontextmenü

Access hat das Kontextmenü in eine übergeordnete Symbolleiste namens Kontextmenü verschoben. Wenn Sie den gleichnamigen Eintrag in der Liste der Symbolleisten aktivieren, erscheint eine lange Leiste mit dem Eintrag Benutzerdefiniert, der auch unser Kontextmenü mit den drei Beispielschaltflächen enthält (siehe Bild 4).

abb003.tif

Bild 4: Ein Kontextmenü unter vielen

Sie brauchen nun nur noch die Eigenschaften der Schaltflächen, wie das Symbol oder die Beschriftung, einzustellen und festzulegen, welche Funktion Access beim Mausklick auf eine Schaltfläche auslösen soll.

Dazu zeigen Sie wiederum das Kontextmenü der gewünschten Schaltfläche an und wählen den Eintrag Eigenschaften aus (siehe Bild 5). Wichtig ist hier vor allem die Eigenschaft Bei Aktion, der Sie den Namen einer VBA-Funktion mit führendem Gleichheitszeichen und abschließendem Klammernpaar zuweisen. Diese Funktion muss in einem Standardmodul als öffentliche Funktion deklariert sein, für das Beispiel aus der Abbildung also etwa so:

abb005.tif

Bild 5: Eigenschaften einer Schaltfläche bearbeiten

Public Function Meldungsfenster()
    MsgBox "Ich wurde vom Kontextmenü µ
    aufgerufen."
End Function

Kontextmenü anzeigen

Nun müssen wir das Kontextmenü nur noch anzeigen. Am einfachsten erledigt man dies, indem man den Namen des Kontextmenüs der Eigenschaft Kontextmenüleiste eines Formulars, Berichts oder der darin enthaltenen Steuerelemente zuweist und dann die richtige Stelle mit der rechten Maustaste anklickt. Für den Moment wollen wir uns die Erstellung zusätzlicher Elemente sparen und dies einfach per VBA erledigen.

Dafür stellt Access einige Objekte und Methoden bereit. Die CommandBars-Auflistung enthält alle Symbolleisten (zu denen auch die Kontextmenüs gehören) und gibt einen Verweis auf den gewünschten Eintrag zurück, wenn man den Namen der Kontextmenüleiste als Index angibt (dies ginge auch über einen numerischen Index). Die Methode ShowPopup zeigt schließlich die Kontextmenüleiste an, und zwar an der Stelle des Mauszeigers (siehe Bild 6). Diese Anweisung setzen Sie im Direktfenster des VBA-Editors ab, den Sie von Access und auch vom VBA-Editor aus mit der Tastenkombination Strg + G einblenden können.

abb006.tif

Bild 6: Anzeigen eines Kontextmenüs per VBA

Commandbars("MeinKontextmenue").ShowPopup

Ein Klick auf den ersten Eintrag des Kontextmenüs liefert schließlich das erwartete Meldungsfenster.

Eingebaute Befehle

Wir sind im ersten Ansatz davon ausgegangen, dass man normalerweise komplett benutzerdefinierte Kontextmenüs entwirft. Dies ist natürlich nicht immer der Fall; manchmal möchte man vielleicht auch einfach ein paar eingebaute Befehle, wie etwa zum Drucken oder Speichern des aktuellen Objekts, verfügbar machen. Solche Befehle fügen Sie genau wie die benutzerdefinierten über die Registerseite Befehle des Anpassen-Dialogs hinzu.

Eingebaute Symbole

Ein wenig Farbe bringen Sie mit den zur Verfügung stehenden Symbolen in das Kontextmenü. Mit den Kontextmenüeinträgen der Menübefehle können Sie im Anpassen-Modus die Symbole vorhandener Befehle kopieren und den benutzerdefinierten Elementen hinzufügen. Weiter unten erfahren Sie, wie Sie auch benutzerdefinierte Symbole zu den Schaltflächen von Kontextmenüs hinzufügen können.

Kontextmenüs unter Access 2007

Nachdem Microsoft den Dialog zum Anpassen von Menüs, Symbolleisten und Kontextmenüs mit Access 2007 gestrichen hat, sind Sie dort beim Erstellen von Kontextmenüs auf einen kleinen Trick angewiesen – oder Sie verwenden direkt VBA.

Die Geschichte mit dem Trick sieht so aus: Sie können mit bestimmten Einstellungen versehene .mdb-Datenbanken unter Access 2007 so öffnen, dass diese ihre Menü- und Symbolleisten genau so wie unter einer älteren Access-Version anzeigen. Wir haben solch ein Exemplar als Beispieldatenbank hinzugefügt (KontextmenuesMitA2007.mdb), das beim Start eine Menüleiste anzeigt und auch das Anzeigen des Anpassen-Dialogs per Kontextmenü zulässt (siehe Bild 7). Hiermit können Sie auch unter Access 2007 Kontextmenüs erstellen. Was aber haben Sie davon, wenn Sie diese in einer .accdb– und nicht in einer .mdb-Datei brauchen Nun, Sie können die Kontextmenüs einfach in die .accdb-Datenbank importieren.

abb007.tif

Bild 7: Der Anpassen-Dialog ist auch unter Access 2007 noch verfügbar.

Dazu müssen Sie nur den Ribbon-Befehl Externe Daten|Importieren|Access anklicken, die Quelldatenbank (also die .mdb-Datei) auswählen, im Dialog Objekte importieren mit der Schaltfläche Optionen die erweiterten Optionen anzeigen und dort die Option Menüs und Symbolleisten aktivieren (siehe Bild 8).

abb008.tif

Bild 8: Importieren von Kontextmenüs aus einer .mdb-Datei in eine Access 2007-Datenbank

Mit der oben vorgestellten ShowPopup-Methode können Sie nun schnell prüfen, ob die mit dem Anpassen-Dialog zusammengestellten Kontextmenüs erfolgreich importiert wurden.

Kontextmenüs von älteren Access-Versionen importieren

Wenn Sie noch eine ältere Version von Access verwenden und Kontextmenüs in Access 2007 benötigen, können Sie diese auf die gleiche Art und Weise importieren.

Kontextmenüs per VBA erstellen

Am effizientesten und am flexibelsten ist die Erstellung der Kontextmenüs per VBA. Das liegt auch daran, dass wir eine Menge nützlicher Funktionen zusammengetragen haben, die etwa das codegesteuerte Hinzufügen benutzerdefinierter Images erlauben. VBA bietet aber auch viel mehr Möglichkeiten: So können Sie damit beispielsweise zur Laufzeit Einträge zu Kontextmenüs hinzufügen, um diese etwa in Abhängigkeit von den in den Tabellen der Datenbank enthaltenen Daten zu füllen – aber sehen Sie doch einfach selbst.

Die CommandBars-Auflistung

Die CommandBars-Auflistung gibt es in zwei Ausführungen: erstens im Application-Objekt von Access und zweitens in der Office-Bibliothek, die Sie aber nur benötigen, wenn Sie mit den darunter liegenden Elementen arbeiten möchten – und das ist im Folgenden der Fall, weshalb Sie zunächst einen Verweis auf die Bibliothek Microsoft Office xx.0 Object Library anlegen.

Als Erstes geben wir die komplette Liste der Kontextmenüs der Anwendung aus, was prinzipiell dem Ausgeben aller CommandBars-Einträge entspricht, sich aber auf solche Elemente beschränkt, deren Eigenschaft Type den Wert 2 für msoBarTypePopup aufweist:

Public Sub KontextmenuesAusgeben()
Dim cbr As CommandBar
For Each cbr In CommandBars
 If cbr.Type = 2 Then
    Debug.Print cbr.Name
End If
Next cbr
End Sub

Steuerelemente in Kontextmenüs

Die in Kontextmenüs enthaltenen Steuerelemente erhalten Sie über die Controls-Auflistung eines Commandbar-Elements.

Die folgende angepasste Version der obigen Routine gibt nur Kontextmenüs inklusive der Beschriftungen und Typen der enthaltenen Steuerelemente aus – zur besseren Übersicht um zwei Leerzeichen eingerückt:

Public Sub KontextmenuesAusgeben()
Dim cbr As CommandBar
Dim cbc As CommandBarControl
For Each cbr In CommandBars
If cbr.Type = 2 Then
Debug.Print cbr.Name
For Each cbc In cbr.Controls
 Debug.Print , cbc.Caption
Next cbc
End If
Next cbr
End Sub

Die Ausgabe für unser kleines von Hand erstelltes Kontextmenü sieht damit etwa so aus:

MeinKontextmenue
Meldungsfenster zeigen
Benutzerdefiniert
Benutzerdefiniert

Auskunft über den jeweiligen Steuerelementtyp gibt die Type-Eigenschaft, die ihre Werte aus der Enumeration MsoControlType bezieht. Im Wesentlichen dürften Sie hier auf die folgenden beiden Elemente treffen:

  • 1 (msoControlButton): einfache Schaltfläche
  • 10 (msoControlPopup): Untermenü mit weiteren Untermenüs oder Schaltflächen

Kontextmenü hinzufügen

Ein Kontextmenü fügen Sie mit wenigen Codezeilen zur Liste der vorhandenen Commandbars hinzu. Die Hauptarbeit übernimmt die Add-Methode der CommandBars-Auflistung, die unter anderem den Namen der neuen Kontextmenüleiste erwartet.

Dass Sie eine Kontextmenüleiste und keine Menü- oder Symbolleiste anlegen möchten, teilen Sie nicht etwa über die Type-Eigenschaft des CommandBar-Objekts, sondern über den zweiten Parameter der Add-Methode mit. Dieser heißt Position und erhält den Wert msoBarPopup. Die folgende Routine weist das neue Kontextmenü der Objektvariablen cbr zu, damit man gegebenenfalls weitere Eigenschaften anpassen kann:

Public Sub KontextmenueHinzufuegen()
Dim cbr As CommandBar
Set cbr = CommandBars.Add("Neues Kontextµ
menü", msoBarPopup)
With cbr
'... weitere Anpassungen
End With
End Sub

Wenn beim Anlegen schon ein Kontextmenü gleichen Namens vorhanden ist, löst die Add-Methode einen Fehler aus. Wenn Sie häufiger änderungen an der Definition des Kontextmenüs vornehmen, können Sie dieses mit der folgenden Anweisung zunächst löschen und im Anschluss neu erstellen:

CommandBars("Neues Kontextmenü").Delete

Da auch dies einen Fehler auslöst, wenn das zu löschende Kontextmenü gar nicht existiert, schalten Sie die Fehlerbehandlung vorübergehend aus:

On Error Resume Next
CommandBars("Neues Kontextmenü").Delete
On Error GoTo 0

Steuerelemente hinzufügen

Das CommandBar-Objekt enthält eine Controls-Auflistung, der Sie Steuerelemente hinzufügen können. Dies geschieht ganz einfach über die Add-Methode der Controls-Auflistung, wie folgendes Beispiel zeigt:

Public Sub KontextmenueHinzufuegen()
Dim cbr As CommandBar
Dim cbb As CommandBarButton
On Error Resume Next
CommandBars("Neues Kontextmenü").Delete
On Error GoTo 0
Set cbr = CommandBars.Add("Neues Kontextmenü", msoBarPopup)
With cbr
Set cbb = cbr.Controls.Add(msoControlButton)
With cbb
.Caption = "Beispielbefehl"
.OnAction = "Beispielfunktion"
End With
End With
End Sub

Genau das Kontextmenü selbst weist in der Routine die neue Schaltfläche einer Objektvariablen zu, die diesmal den Typ CommandBarButton hat.

Auf diese Weise können Sie anschließend leicht weitere Eigenschaften wie die Beschriftung angeben oder die VBA-Routine, die ein Klick auf die Schaltfläche auslösen soll.

Weitere Eigenschaften von

CommandBarButton-Elementen

Das oben verwendete CommandBarButton-Element können Sie mit den folgenden Eigenschaften Ihren Bedürfnissen anpassen:

  • BeginGroup: Falls True, zeigt das Kontextmenü einen Trennstrich vor diesem Steuerelement an
  • Enabled: Aktiviert und deaktiviert einen Kontextmenüeintrag
  • FaceID: Erlaubt die Angabe der ID eines der eingebauten Symbole
  • Picture: Erwartet ein StdPicture-Objekt, welches das Steuerelement als Symbol verwenden soll
  • Mask: Erwartet ein StdPicture-Objekt, welches transparente Bereiche des unter Picture angegebenen Symbols kennzeichnet. Die Maske enthält dabei lediglich schwarze (nicht transparent) und weiße (transparent) Bereiche.
  • Visible: Blendet ein Steuerelement ein oder aus

Eingebaute Steuerelemente

Sie können auch eingebaute Elemente der Menüs der Office-Anwendungen in benutzerdefinierte Kontextmenüs integrieren. Dazu geben Sie die ID des gewünschten Elements direkt beim Hinzufügen des Eintrags an. Im folgenden Beispiel wird das Element mit der ID 3 hinzugefügt, was dem Speichern-Befehl entspricht:

Set cbb = cbr.Controls.Add(msoControlButton, 3)

Beachten Sie, dass Sie die ID nur als Parameter der Add-Methode, nicht aber nach dem Erstellen über eine Eigenschaft zuweisen können.

Die Routine aus Listing 1 gibt ein langes Kontextmenü mit allen IDs aus.

Listing 1: Kontextmenü mit Bild

Public Sub ControlIDsAusgeben()
Dim cbr As CommandBar
Dim cbb As CommandBarButton
Dim i As Integer
On Error Resume Next
CommandBars("Neues Kontextmenü").Delete
On Error GoTo 0
Set cbr = CommandBars.Add("Neues Kontextmenü", msoBarPopup)
With cbr
For i = 1 To 1000
 On Error Resume Next
    Set cbb = cbr.Controls.Add(msoControlButton, i)
    If Err.Number = 0 Then
        cbb.Caption = cbb.Caption & " (" & i & ")"
    End If
    On Error GoTo 0
Next i
End With
cbr.ShowPopup
End Sub

Benutzerdefinierte Symbole in Kontextmenüs

Per VBA können Sie den Einträgen von Kontextmenüs auch benutzerdefinierte Symbole zuweisen. Dies bringt in der Regel ein kleines Problem mit sich: Kontextmenüs unterstützen keine transparenten Bildformate, sondern verlangen nach einer speziellen Vorgehensweise zum Einbringen von Transparenz.

Ein einfaches Bild ohne Transparenz fügen Sie einfach über die Picture-Eigenschaft des jeweiligen Steuerelements hinzu. Diese Eigenschaft erwartet einen Verweis auf ein Bild des Datentyps StdPicture, das Sie auf Basis einer im gleichen Verzeichnis wie die Datenbank gespeicherten Bilddatei mit der LoadPicture-Methode hinzufügen können. Der notwendige Code sieht ungefähr so wie in Listing 2 aus.

Listing 2: Kontextmenü mit Bild

Public Sub KontextmenueMitImage()
Dim cbr As CommandBar
Dim cbb As CommandBarButton
Dim strPic As String
Dim objPic As StdPicture
On Error Resume Next
CommandBars("Kontextmenü mit Icons").Delete
On Error GoTo 0
Set cbr = CommandBars.Add("Kontextmenü mit Icons", msoBarPopup)
With cbr
Set cbb = cbr.Controls.Add(msoControlButton)
With cbb
.Caption = "Icon mit Herz"
.Picture = stdole.LoadPicture(CurrentProject.Path & "\heart.bmp")
End With
End With
cbr.ShowPopup
End Sub

Dieses Beispiel funktioniert leider nur mit wenigen Bildformaten und bringt den erwarteten ausgefüllten statt transparenten Hintergrund (siehe Bild 9). Die Transparenz erreichen Sie durch das Hinzufügen einer sogenannten Maske. Diese sieht prinzipiell genau so wie das anzuzeigende Bild aus, nur dass sie alle transparenten Bereiche weiß und alle nicht transparenten Bereiche schwarz darstellt. Für unser im obigen Beispiel verwendetes Herz sieht das so wie in Bild 10 aus. Durch Hinzufügen der folgenden kleinen Zeile ändern Sie die Darstellung, die dann wie in Bild 11 erscheint:

abb009.tif

Bild 9: Ein Menüelement mit benutzerdefiniertem Icon

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar