Eigene Tastenkombinationen in einer Anwendungsshell behandeln
Geben Sie einer Anwendungsshell – einem Hauptformular, dessen Bereiche ein WklDockLayout anordnet, mit einer
WklNavBar und einem Unterformular, das die Seiten zeigt – eigene Tastenkombinationen (Strg+1 und Strg+2 zum Wechseln
der Seite, Strg+N für einen neuen Datensatz, F5 zum erneuten Lesen), die überall funktionieren, wo der Fokus gerade
ist: in einem Textfeld einer Seite, in einem WklGrid auf einer Seite oder in der Shell selbst.
Voraussetzungen: WKL Forms Object Library 1.45 oder höher für ShortcutKeys; der Weg über Weiterleitung am Ende
funktioniert ab 1.24.
Lösungsüberblick
KeyPreviewder Shell genügt nicht. Tasten, die in einem Unterformular gedrückt werden, erreichen nur das Formular dieses Unterformulars und seine Steuerelemente;Form_KeyDownder Shell sieht sie nicht.- Das Layout überwacht das ganze Formular.
WklDockLayout.ShortcutKeyslistet die Kombinationen in der Schreibweise des AutoKeys-Makros auf (^1;^2;^N;{F5}). Das Layout sieht jede Taste, die der Benutzer in seinem Formular drückt, einschließlich der Unterformulare, bevor Access und das Steuerelement mit dem Fokus sie sehen, und löst für eine aufgeführte TasteShortcutaus. - Eine einzige Stelle entscheidet. Die Prozedur
Shortcutder Shell führt den Befehl aus und setztHandled = True; die Taste erreicht dann niemanden sonst. Eine Taste, bei derHandled = Falsebleibt, geht weiter, als hätte das Layout sie nicht angesehen.
Umsetzung
Im Modul des Shell-Formulars frmShell (Layout layShell, Seiten-Unterformular sfPage):
Option Compare Database
Option Explicit
Private Sub Form_Load()
Me!layShell.Object.ShortcutKeys = "^1;^2;^N;{F5}"
End Sub
Private Sub layShell_Shortcut(ByVal Key As String, Handled As Boolean)
Select Case Key
Case "^1"
Me!sfPage.SourceObject = "frmSitzungen"
Handled = True
Case "^2"
Me!sfPage.SourceObject = "frmZertifikate"
Handled = True
Case "^N"
Me!sfPage.Form!grdListe.Object.NewRecord
Handled = True
Case "{F5}"
Me!sfPage.Form!grdListe.Object.Requery
Handled = True
End Select
End Sub
ShortcutKeys lässt sich auch in der Entwurfsansicht setzen (Eigenschaftenblatt, Registerkarte Andere); die
Einstellung wird mit dem Formular gespeichert.
Hinweise
Keywird immer in derselben festen Form geschrieben, unabhängig von der Schreibweise inShortcutKeys: Zusatztasten in der Reihenfolge^+%, ein Buchstabe als Großbuchstabe (^N,+{F2},{ESC}).- Ein Buchstabe oder eine Ziffer ohne Strg (
^) oder Alt (%) wird beim Setzen der Liste abgelehnt: Die Kombination würde beim Tippen ausgelöst. - Wählen Sie Kombinationen, die die Steuerelemente nicht selbst brauchen (das Raster verwendet unter anderem die Pfeiltasten, Eingabetaste, Entf, F2, Strg+C, Strg++ und Strg+-; die Tasten jedes Steuerelements stehen in seiner Referenz). Eine aufgeführte Taste wird zuerst
Shortcutangeboten, auch wenn ein Steuerelement sie verwenden würde. WklNavBarschaltet sich selbst mit Strg+B um (ToggleShortcut), und F6 wechselt zwischen den Bereichen des Layouts; beides funktioniert nebenShortcutKeysweiter.- Ein modales Dialogfeld oder ein Popup-Formular im Vordergrund erhält seine Tasten wie gewohnt; das Layout meldet nur Tasten seines eigenen Formulars.
Ohne WklDockLayout: Weiterleitung aus jeder Seite
Eine Shell ohne Layout lässt jede Seite ihre Tasten weiterleiten. Das Seitenformular setzt KeyPreview auf Ja und gibt
Form_KeyDown – und das KeyDown eines WKL-Steuerelements mit dem Fokus – an eine öffentliche Funktion der Shell
weiter, die zurückgibt, ob sie die Taste übernommen hat:
' Module of a page form with the grid grdKunden.
Private Sub Form_Load()
Me.KeyPreview = True
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Forward(KeyCode, Shift) Then KeyCode = 0
End Sub
Private Sub grdKunden_KeyDown(KeyCode As Integer, ByVal Shift As Integer)
If Forward(KeyCode, Shift) Then KeyCode = 0
End Sub
Private Function Forward(ByVal KeyCode As Integer, ByVal Shift As Integer) As Boolean
On Error Resume Next
If CurrentProject.AllForms("frmShell").IsLoaded Then
Forward = Forms!frmShell.HandleShortcut(KeyCode, Shift)
End If
End Function
HandleShortcut in der Shell vergleicht KeyCode und Shift (zum Beispiel KeyCode = vbKeyN And Shift = acCtrlMask) und gibt für eine behandelte Taste True zurück.