Home > Artikel > Ausgabe 3/2016 > Tastensteuerung abfangen

Tastensteuerung abfangen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Nicht immer sind die Steuerungen, die Access über zahlreiche Tasten und Tastenkombinationen ermöglicht, auch wirklich erwünscht. Anwender kennen diese oft gar nicht und sind dann manchmal über Reaktionen der Oberfläche irritiert, die durch versehentliche Anschläge zustande kamen. Unter Umständen kann es auch zu Datenverlust kommen. Wir stellen dar, wie Sie dem Problem mit unterschiedlichen Ansätzen beikommen können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1603_Tastenhandling.accdb

Spezialtasten

Wie viele andere Applikationen auch kennt Access eine große Zahl von Tastenkombinationen, über die sich die Oberfläche steuern lässt. Eigentlich ist das sinnvoll, da der ständige Wechsel zwischen Tastatur und Maus nicht unbedingt komfortabel ist. Voraussetzung aber ist, dass Sie diese Tastenkombinationen auch kennen.

Aus der Hilfe zu Access wurde über einige Umwege die Tabelle AccessTasten der Beispieldatenbank gewonnen, welche alle aktuell möglichen Tastenfunktionen auflistet (siehe Bild 1). Der Umfang ist mit etwa 450 Funktionen erschlagend. Je nach Kontext kommen bestimmte Kombinationen mehrfach vor. ALT+F4 etwa schließt in der Regel ein Fenster oder Formular, beendet aber auch Access selbst, wenn gerade kein Fenster offen ist. Ist das erwünscht? Wenn der Anwender sich auskennt, dann schon, andernfalls ist es eine Gefahr.

Tabelle AccessTasten mit allen unter Access möglichen Tastenkombinationen

Bild 1: Tabelle AccessTasten mit allen unter Access möglichen Tastenkombinationen

Blättern Sie ruhig einmal die Tabelle durch. Sie finden in ihr garantiert viele Kombinationen, die Sie noch nicht kannten, oder über deren Funktion Sie in einem anderen Kontext erstaunt sein werden. Dem Benutzer Ihrer Datenbank werden diese Funktionen sicherlich erst recht unbekannt sein. Sie sind deshalb auf der sicheren Seite, wenn Sie die Spezialtasten von Access in den Optionen der Datenbank abstellen. Sie finden die zugehörige Checkbox in den Optionen unter Aktuelle Datenbank und dem Eintrag Access Spezialtasten verwenden, wie in Bild 2.

Spezialtasten in den Optionen der Datenbank ein- und ausschalten

Bild 2: Spezialtasten in den Optionen der Datenbank ein- und ausschalten

Entfernen Sie hier besser das Häkchen, wenn die Datenbank auch von anderen Benutzern verwendet werden soll.

Leider ist keinesfalls klar definiert, was Microsoft unter Spezialtasten versteht. Sehr viele der Kombinationen in der Tabelle funktionieren auch dann noch, wenn die Option deaktiviert ist. Aus diesem Grund müssen wir uns Gedanken machen, welche zusätzlichen Lösungen zum Umgang mit Tastenereignissen infrage kommen.

Autokeys

Dass ein mit AutoExec benanntes Makro von Access unmittelbar nach dem Öffnen einer Datenbank ausgeführt wird, wissen Sie wahrscheinlich. Das zweite automatisch ausgeführte nennt sich AutoKeys. So vorhanden liest Access die dort definierten Tasten und Tastenkombinationen sofort ein und belegt diese mit den von ihnen bestimmten Aktionen. Die eingebauten Funktionen werden so außer Kraft gesetzt.

Das Thema wurde bereits in der Ausgabe 09/2012 von Access Basics ausführlicher dargestellt. Lesen Sie sich dort ein, wenn Sie über die Anlage des Makros mehr erfahren möchten. An dieser Stelle zeigen wir Ihnen am Beispiel von Bild 3, wie unerwünschte Tasturereignisse mit dem AutoKeys-Makro abgefangen werden können.

Beispiel eines kurzen Autokeys-Makros

Bild 3: Beispiel eines kurzen Autokeys-Makros

Grundsätzlich muss hier für eine Taste oder eine Tastenkombination eine Aktion angegeben werden. Ohne diese ergibt eine Makrozeile ja keinen Sinn. Was aber mit den unerwünschten Tasten anfangen, damit gar nichts passiert? Am geeignetsten dafür ist die Aktion Kommentar. In der untersten Zeile finden Sie die Angabe von ^{P}, was im AutoKeys-Dialekt der Kombination Strg + P entspricht. Diese Kombination führt zum Drucken des aktuell angezeigten Objekts. Wäre das ein Formular mit Tausenden von Datensätzen, so würde diese Aktion wohl eher zum Unmut des Anwenders führen, falls sie versehentlich ausgelöst worden wäre. Also ist als Reaktion auf dieses Tastenereignis ein Kommentar mit der Beschreibung Drucken unterbinden eingefügt, der dann in grüner Schrift erscheint. Ausgeführt wird demnach bei Strg + P lediglich der Kommentar – also gar nichts!

Ähnlich wird mit Strg + G verfahren, was üblicherweise den VBA-Editor öffnet. Auch das will man in produktiver Umgebung sicher nicht haben, wobei hier allerdings auch das Abschalten der Spezialtasten in den Optionen der Datenbank greifen würde.

Anstelle des kompletten Deaktivierens einer Tastenkombination über eine Kommentar-Aktion können Sie aber auch eigene Funktionen aufrufen lassen. Die Tasten F9 bis F12 im Beispiel etwa rufen alle die Funktion fuGlobalKey auf, wobei jeweils ein anderer Parameter übergeben wird. Diese Funktion muss öffentlich in einem Modul Ihrer Datenbank vorhanden sein. In der Beispieldatenbank finden Sie diese im Modul mdlGlobalKeys. Listing 1 verdeutlicht die Routine.

Public Function fuGlobalKey(ByVal sKey As String)

     On Error Resume Next

     Select Case sKey

     Case "F11"

         DoCmd.OpenForm "frmTastatur"

     Case "F12"

         DoCmd.OpenForm "frmAdressen"

     Case "F10"

         DoCmd.OpenForm "frmIntro"

     Case "F9"

         DoCmd.Close acForm, Screen.ActiveForm.Name

     Case "STRG-P"

         If MsgBox("Möchten Sie das Objekt drucken?", vbYesNo) = vbYes Then

             DoCmd.PrintOut acPrintAll

         End If

     End Select

End Function

Listing 1: Abfangen der Tastenereignisse über die Funktion fuGlobalKey

In der Parametervariablen sKey wird der im Makro angegebene String entgegengenommen und anschließend in einem Select Case-Block verarbeitet. Wurde F11 gedrückt, was normalerweise den Navigationsbereich ein- und ausschalten würde, ein Umstand, der ebenfalls wenig erwünscht ist, so spricht der entsprechende Case-Zweig an und öffnet stattdessen das Formular frmTastatur. F9 berechnet normal die Daten eines Formulars neu, hier aber führt es zum Schließen des gerade geöffneten Formulars per DoCmd.Close.

Da möglicherweise gerade kein Formular offen ist, käme es zu einer VBA-Fehlermeldung, da sich Screen.ActiveForm.Name nicht auswerten ließe. Deshalb steht in der Routine ganz oben ein On Error Resume Next, was jegliche Fehlermeldungen unterbindet.

Auf diese Weise können Sie also Tastenfunktionen umbiegen und eigene Aktionen auslösen. Sie können aber auch etwa die Kombination Strg + P zum Drucken in ihrer eigentlichen Funktion belassen, jedoch zusätzlich filtern. Stellen Sie für ^{P} statt des Kommentars die Aktion AusführenCode mit fuGlobalKey("Strg + P") ein. Die Routine reagiert dann mit einer Nachfrage, ob das aktuelle Objekt gedruckt werden soll. Nur bei Bejahen führt DoCmd.Print dann zum gleichen Ergebnis, das die Tastenkombination an sich aufweist.

Tasten über VBA abfangen

Über das AutoKeys-Makro lassen sich bei entsprechender Programmierung im Prinzip alle Tasten umsteuern. Für Tastenereignisse, die ausgelöst werden, wenn gerade kein Objekt der Datenbank geöffnet ist, ist es auch der einzige Weg. Wenn aber etwa Tasten in bestimmten Formularen eine eigene Bedeutung bekommen sollen, so ist wird die Gestaltung der globalen Funktion etwa komplizierter und unübersichtlich.

Hier eignen sich Formularereignisse besser, derer es für die Tastatur drei gibt: Bei Taste, Bei Taste Auf, Bei Taste Ab. Die zugehörigen VBA-Ereignisse lauten KeyPress, KeyUp und KeyDown. Sie unterscheiden sich in den Parametern, die sie übergeben. Während KeyPress (Bei Taste) nur einen Parameter für den Code der Taste mitbringt, sind dies bei den beiden anderen zwei. Neben dem Tastencode nämlich noch der Zustand der Tasten Umschalt, Strg und Alt:

Sub Form_KeyPress(KeyAscii As Integer)

...

Sub Form_KeyDown( _

  KeyCode As Integer, Shift As Integer)

...

Sub Form_KeyUp( _

KeyCode As Integer, Shift As Integer)

KeyPress wird nicht von Steuertasten ausgelöst, wie Bild Auf oder den Pfeiltasten, KeyDown und KeyUp aber von allen. In KeyCode steht dann die eigentlich Taste, in Shift eine Kombination der Tasten Umschalt, Strg und Alt. Umschalt entspricht dabei dem Wert 1, Strg der 2 und Alt der 4. Strg und Alt gleichzeitig führen so zum Wert 6, alle Steuertasten zusammen zu 7. Auf diese Weise kann jede mögliche Tastenkombination erfasst und in der Ereignisprozedur darauf reagiert werden.

Probieren Sie es aus und legen für das Ereignis Bei Taste Ab eines Formulars die folgende Prozedur an:

Private Sub Form_KeyDown( _

  KeyCode As Integer, Shift As Integer)

     Debug.Print KeyCode, Shift

End Sub

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!