Das Keypress-Ereignis zur Optimierung von Formularen

15.10.2006 von Helma  Spona
Abhängig davon, wie Datenbankinhalte später verwendet werden sollen, kann es sinnvoll sein, die Eingaben zu kontrollieren und gegebenenfalls zu optimieren. Nicht immer lassen sich dafür vordefinierte Zahlenformate nutzen, beispielsweise wenn nur bestimmte Zeichen in der Eingabe vorkommen dürfen oder keine Umlaute erlaubt sind. Hier kommt das Keypress-Ereignis zum Einsatz.

Basis einer solchen Überwachung sind Ereignisprozeduren die ausgeführt werden, wenn der Benutzer Eingaben über die Tastatur vornimmt. Dazu stehen für Steuerelemente in Formularen folgende Ereignisse zur Verfügung, die in der aufgeführten Reihenfolge eintreten, wenn der Benutzer eine Taste oder eine Tastenkombination drückt.

Ereignisse bei der Eingabe

KeyDown tritt in dem Moment ein, wo der Benutzer die Taste herunterdrückt, KeyPress unmittelbar danach. Der Unterschied besteht darin, dass Sie in der Ereignisprozedur für das KeyDown-Ereignis auf die gedrückte Taste sowie die gleichzeitig gedrückten Sondertasten [Alt], [Strg] und [Umsch] Zugriff haben. Diese werden als zweiter Parameter Shift übermittelt und können die Werte der Konstanten in Tabelle 1 annehmen.

Tabelle 1: Bedeutung der Konstanten für die Parameter Shift.

Konstante

Bedeutung

acShiftMask

[Umsch]

acCtrlMask

[Strg]

acAltMask

[Alt]

An die Ereignisprozedur für das KeyPress-Ereignis wird hingegen nur ein Parameter übergeben, den der ASCII-Code des eingegebenen Zeichens enthält. Und genau das können Sie sich zunutze machen, wenn Sie die Eingaben überwachen und beispielsweise auf bestimmte Zeichen beschränken möchten.

Eingaben auf bestimmte Zeichen beschränken

Sie benötigen dazu ein Eingabefeld, in dessen Tag-Eigenschaft Sie die Zeichen definieren, die zulässig sein sollen. Sie geben sie als Liste, getrennt durch Kommata, in das Feld Marke ein (Bild 1). Die Liste in Bild 1 gibt an, dass nur Kleinbuchstaben von 1 bis z gültig sind, also ohne Umlaute und „ß“.

Bild 1: Definieren der erlaubten Zeichen in der Eigenschaft Marke.

Wenn der Benutzer aus der Beschriftung des Feldes nicht erkennen kann, dass bestimmte Zeichen nicht zulässig sind, sollten Sie ein zusätzliches Labelfeld einfügen, das bei einer Fehleingabe die zulässigen Zeichen anzeigt. Damit das Feld nicht angezeigt wird, solange korrekte Eingaben erfolgen, setzen Sie deren Eigenschaft Sichtbar auf Nein. Nun fehlt natürlich noch etwas Code. Zunächst sollten Sie eine Funktion schreiben, der Sie den Inhalt der Tag-Eigenschaft (Marker- Eigenschaft im Eigenschaftenfenster) sowie das eingegebene Zeichen übergeben. Die Funktion durchläuft dann das aus der Tag-Eigenschaft erzeugte Array und prüft, ob das eingegebene Zeichen darin vorkommt. Falls nicht, ist es nicht zulässig und die InArray-Funktion (siehe Listing 1) gibt False zurück.

Dim boolLoeschen As Boolean
Dim strEingabe As String
Dim lngPos As Long
Private Sub txtTexteingabe_Change()
If boolLoeschen = True Then
Me.txtTexteingabe.Text = strEingabe
'Cursor am Ende positionieren
Me.txtTexteingabe.SelStart = lngPos
End If
End Sub
Private Sub txtTexteingabe_KeyPress(KeyAscii As Integer)
If inArray(Me.txtTexteingabe.Tag, KeyAscii) = False Then
Me.lblFehler.Caption = "Es sind nur folgende Zeichen erlaubt: " & Me.txtTexteingabe.Tag
Me.lblFehler.Visible = True
lngPos = Me.txtTexteingabe.SelStart
strEingabe = Me.txtTexteingabe.Text
boolLoeschen = True
Else
Me.lblFehler.Visible = False
boolLoeschen = False
End If
End Sub
Function inArray(strDaten As String, intZeichen As Integer)
Dim arrZeichen As Variant
Dim varZchn As Variant
inArray = False
arrZeichen = Split(strDaten, ",")
For Each varZchn In arrZeichen
If Asc(varZchn) = intZeichen Then
inArray = True
Exit Function
End If
Next varZchn
End Function

Variablen und Ereignisprozeduren

Für die Prüfung der Eingaben benötigen Sie zunächst drei Variablen. Die boolesche Variable boolLoeschen gibt an, ob das letzte Zeichen ungültig ist und gelöscht werden muss. Dies ist notwendig, weil das Löschen des Zeichens nicht in der KeyPress-Ereignisprozedur, sondern erst in der Change-Ereignisprozedur erfolgen kann. Hier müssen Sie dann also wissen, was die Prüfung der Eingabe ergeben hat.

Die Variable lngPos speichert die Cursorposition, bei Tastendruck, um sie nach einer eventuellen Korrektur der Eingabe wieder herstellen zu können. In der Variablen strEingabe wird die bisherige Eingabe ohne das letzte Zeichen gespeichert.

Außer den Variablen benötigen Sie nun noch zwei Ereignisprozeduren, eine für das KeyPress- Ereignis, die andere für das Change-Ereignis. In der Ereignisprozedur für das KeyPress-Ereignis prüfen Sie zunächst mit Hilfe der InArray-Funktion, ob das eingegebene Zeichen innerhalb der Liste der erlaubten Zeichen liegt. Da der ASCIIWert des Zeichens, nicht das Zeichen selbst übergeben wird, müssen Sie für einen Vergleich die Array-Werte mit der ASC-Funktion in deren ASCII-Werte konvertieren.

Gibt die Funktion False zurück, müssen Sie das zuletzt eingegebene Zeichen löschen. Dazu speichern Sie den aktuellen Inhalt des Steuerelements in der Variablen strEingabe. Hierin ist noch nicht die letzte Eingabe enthalten, sie wird erst mit Ausführen des Change-Ereignisses angehängt. Jetzt ist es auch Zeit, das Labelfeld mit der Fehlermeldung einzublenden und auch die aktuelle Cursorposition über die SelStart-Eigenschaft abzurufen und in der Variablen zu speichern.

In der Ereignisprozedur für das Change-Ereignis müssen Sie nun nur noch prüfen, ob die Variable boolLoeschen den Wert True hat. In diesem Fall setzen Sie die Text-Eigenschaft des Steuerelements auf den Wert der Variablen str- Eingabe.

Über die Eigenschaft SelStart positionieren Sie dann den Cursor wieder an der Stelle, die er vor dem Einfügen des letzten Zeichens eingenommen hat.

Fehler automatisch korrigieren

Sie können aber auch einen Schritt weiter gehen und Fehleingaben korrigieren, indem Sie ein falsches Zeichen durch ein richtiges ersetzen. Welche Zeichen durch was zu ersetzen sind, definieren Sie dabei wieder als Liste in der Marker- Eigenschaft. Geben Sie in der Liste erst das falsche Zeichen und dann das oder die zu ersetzenden Zeichen an. Mit der Angabe ä,ae,ü,ue würden die Umlaute „ä“ und „ü“ durch „ae“und, „ue“ ersetzt.

Bild 2: Bei einer Fehleingabe wird das Zeichen nicht angefügt, stattdessen wird die Fehlermeldung eingeblendet.

Sie benötigen auch noch eine Funktion, die die Ersetzung vornimmt und das neue Zeichen zurückgibt. Das übernimmt die Funktion ersetzen (Listing 2). Sie durchläuft ebenfalls das Array nach dem gesuchten Zeichen und gibt dann den Wert im Array zurück, der danach folgt. Damit dabei nicht versehentlich die Eingabe von „ae“ durch „ü“, den nächsten Umlaut in der Liste, ersetzt wird, werden nur die Werte des Arrays mit der Eingabe verglichen, die aus einem Zeichen bestehen. Das ist auch deshalb notwendig, weil Sie natürlich nur von einem einzelnen Zeichen den ASCII-Code ermitteln können. Der Rückgabewert ist eine leere Zeichenfolge, wenn ein gültiges, nicht zu ersetzendes Zeichen eingegeben wurde.

Dim boolErsetzen As Boolean
Dim strEingabe As String
Dim lngPos As Long
Private Sub txtErsetzen_Change()
If boolErsetzen = True Then
Me.txtErsetzen.Text = strEingabe
'Cursor am Ende positionieren
Me.txtErsetzen.SelStart = lngPos
End If
End Sub
Private Sub txtErsetzen_KeyPress(KeyAscii As Integer)
lngPos = Me.txtErsetzen.SelStart + 2
strEingabe = Me.txtErsetzen.Text & ersetzen(Me.txtErsetzen.Tag, KeyAscii)
End Sub
Function ersetzen(strDaten As String, intZeichen As Integer) As String
Dim arrZeichen As Variant
Dim varZchn As Variant
Dim intI As Integer
boolErsetzen = False
arrZeichen = Split(strDaten, ",")
intI = 0
For Each varZchn In arrZeichen
If Len(varZchn) = 1 Then
If Asc(varZchn) = intZeichen Then
boolErsetzen = True
ersetzen = arrZeichen(intI + 1)
Exit Function
End If
End If
intI = intI + 1
Next varZchn
End Function

In der Ereignisprozedur für das KeyPress- Ereignis weisen Sie zunächst wieder der Variablen lngPos die aktuelle Cursorposition zu. Anschließend weisen Sie der Variablen strEingabe den aktuellen Wert des Eingabefeldes mit dem Rückgabewert der Funktion ersetzen zu. In der Change-Ereignisprozedur wird dann wieder geprüft, ob die Variable boolErsetzen den Wert True hat. Falls ja, wird dem Steuerelement der Text in der Variablen strEingabe zugewiesen.

Zusammenfassung

Die Nutzung des KeyPress-Ereignisses lässt eine Menge nützlicher Anwendungsmöglichkeit zu. Übertreiben Sie es aber nicht. Je komplexer der Code, desto verzögerter erfolgt die Anzeige der Eingaben. Das kann für den Benutzer auch lästig werden, wenn er sehr schnell tippt.