Access-Kontextmenüleiste in einem Raster verwenden
Geben Sie einem WklGrid, einer WklTreeList oder einem WklGantt die Befehle Ihrer Anwendung in seinem
Kontextmenü – „Als erledigt markieren“, „Lieferschein drucken“ –, ohne Formularmodul und so, wie ein Access-Formular
sie über seine Kontextmenüleiste erhält.
Voraussetzungen: WKL Forms Object Library 1.28 oder höher.
Lösungsüberblick
Access-Formulare beziehen ihr Kontextmenü aus der Eigenschaft ShortcutMenuBar: dem Namen einer
Popup-Befehlsleiste, deren Einträge eine Funktion (=Function()) oder ein Makro aufrufen. Access bietet diese
Eigenschaft nur für seine eigenen Steuerelemente an. Die WKL-Steuerelemente haben eine gleichnamige Eigenschaft: Die
Einträge der genannten Leiste erscheinen im Kontextmenü des Steuerelements, standardmäßig nach den eingebauten
Einträgen (MenuPlacement). Wählt der Benutzer einen Eintrag, führt das Steuerelement dessen Aktion so aus, wie Office
es tut. Die Funktion findet das Steuerelement über Screen.ActiveControl und den Datensatz, auf dem das Menü geöffnet
wurde, über ContextKey (ContextColumn für die Spalte, ContextView für eine Detailansicht).
Nichts davon braucht das Formularmodul: Die Leiste legt ein Standardmodul beim Start an, die Eigenschaft wird in der Entwurfsansicht gesetzt.
Umsetzung
Legen Sie die Leiste beim Start der Anwendung in einem Standardmodul an, und rufen Sie die Funktion aus dem Makro AutoExec auf (Aktion AusführenCode / RunCode,
CreateOrderMenu()):Public Function CreateOrderMenu() On Error Resume Next CommandBars("mnuBestellungen").Delete On Error GoTo 0 With CommandBars.Add("mnuBestellungen", 5, False, True) ' 5 = msoBarPopup, temporary With .Controls.Add(1) ' 1 = msoControlButton .Caption = "Als &erledigt markieren" .OnAction = "=MarkOrderDone()" End With With .Controls.Add(1) .Caption = "&Lieferschein drucken" .OnAction = "=PrintDeliveryNote()" .BeginGroup = True End With End With End FunctionSchreiben Sie im selben Standardmodul die Funktionen, die die Einträge aufrufen:
Public Function MarkOrderDone() Dim grid As Object Set grid = Screen.ActiveControl.Object If IsNull(grid.ContextKey) Then Exit Function ' opened on a group row CurrentDb.Execute "UPDATE tblBestellungen SET Erledigt = True WHERE BestellNr = " & grid.ContextKey, dbFailOnError grid.Requery End Function Public Function PrintDeliveryNote() DoCmd.OpenReport "rptLieferschein", acViewPreview, , "BestellNr = " & Screen.ActiveControl.Object.ContextKey End Function- Öffnen Sie das Formular in der Entwurfsansicht, markieren Sie das Raster, und geben Sie
mnuBestellungeninShortcutMenuBarein (Eigenschaftenblatt, Registerkarte Andere, oder Designerseite Verhalten, Abschnitt Kontextmenü). Wählen Sie mitMenuPlacement, ob die Einträge nach den eingebauten (Standardwert), davor, allein oder gar nicht erscheinen.
Hinweise
- Die Leiste wird bei jedem Öffnen des Menüs gelesen. Ändern Sie einen Eintrag per Code –
CommandBars("mnuBestellungen").Controls(2).Enabled = False–, zeigt das nächste Menü die Änderung. - Angezeigt werden die sichtbaren Schaltflächen und Untermenüs der Leiste mit Beschriftung,
ShortcutText, Aktivierung, Häkchen (State) und Trennlinie (BeginGroup). Kombinationsfelder, Eingabefelder und Bilder einer Leiste werden nicht angezeigt. - Detailansichten eines
WklGridzeigen dieselben Einträge.ContextKeyenthält dann den Schlüssel des Detaildatensatzes undContextViewden Namen der Detailansicht; lesen Sie beide am Hauptraster (Screen.ActiveControlist das Hauptraster). - Ein Eintrag, dessen Funktion nicht existiert, zeigt wie ein Eintrag einer Access-Leiste die Meldung von Access, dass der Ausdruck den Namen einer Funktion enthält, die Access nicht finden kann; prüfen Sie den Namen in
OnAction. Ein Fehler, den die Funktion nicht behandelt, zeigt das Laufzeitfehler-Dialogfeld von VBA; geben Sie der Funktion daher eine Fehlerbehandlung. - Die Beschriftungen der Einträge sind Ihre Texte; die eingebauten Einträge folgen der Sprache der Komponenten.
- Mit einem Formularmodul können Sie das Menü in
BeforeContextMenuje Datensatz anpassen oder statt einer Leiste Einträge mitAddMenuItemhinzufügen (Einträge zum Kontextmenü hinzufügen).