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.
Bild 1: Anlegen einer neuen Symbolleiste, die einmal ein Kontextmenü werden soll
Bild 2: Symbolleiste mit Schaltflächen
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).
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:
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.
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.
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).
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:
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