Normalerweise können Sie den Effekt eines Tastendruckes ändern, indem Sie im KeyDown-Ereignis den Wert des übergebenen Parameters KeyCode manipulieren. Sie können den Wert 0 zurückgeben, um den Tastendruck gewissermaßen zu "schlucken". Oder Sie geben einen anderen möglichen Wert zurück, etwa die KeyCode des Cursortasten und ähnliche - solange der KeyCode nicht ein darstellbares Zeichen betrifft. Die Codes dieser Zeichen können Sie dagegen im KeyPress-Ereignis manipulieren, indem Sie dort einen geänderten Zeichen-Code (KeyAscii) zurückgeben.
Für die meisten Tasten werden in beiden Ereignissen eindeutige Codes angeliefert (siehe auch die gegenüber den vorhandenen VB-Konstanten erweiterten Codes in "Gedrückte Tasten"). Eine Ausnahme bilden jedoch die Tasten des Nummernblocks. Für diese werden im KeyDown-Ereignis andere KeyCodes übergeben, als für die Tasten im Hauptteil der Tastatur, während im KeyPress-Ereignis die Herkunft des Zeichen-Codes anhand des übergebenen KeyAscii-Wertes nicht mehr unterscheidbar ist.
In der Regel reicht auch die Unterscheidungsmöglichkeit im KeyDown-Ereignis, weil letztlich das gewünschte Zeichen in jedem Fall erscheinen soll. Falls Sie jedoch eines dieser Zeichen abhängig von seiner Herkunft manipulieren wollen, etwa das Komma als Dezimaltrennzeichen im Nummernblock des deutschen Tastatur-Layouts gegen einen "echten" Dezimalpunkt vertauschen wollen, müssen Sie die Unterscheidung im KeyDown-Ereignis und die Ersetzung im KeyPress-Ereignis vornehmen (Denn das Komma als normales Satzzeichen soll ja wohl weiterhin eingeben werden können, und nicht ebenfalls als Punkt erscheinen). Sie brauchen lediglich das Ergebnis der Unterscheidung im KeyDown-Ereignis ins KeyPress-Ereignis hinüber zu retten.
Dazu dient eine im gleichen Modul deklarierte Hilfsvariable (Datentyp Boolean) mit modulweitem Gültigkeitsbereich. Wird im KeyDown-Ereignis der KeyCode der Dezimalzeichen-Taste des Nummernblocks (Konstante vbKeyDecimal = 110) übergeben, wird diese Hilfsvariable (mDecimal) auf True gesetzt. Wird der KeyCode des gewöhnlichen Kommas (deutsches Tastatur-Layout: 188) übergeben, bleibt der sicherheitshalber zu Beginn der Ereignisprozedur auf False gesetzte Wert von mDecimal weiterhin False. Ein Beispiel für die Eingabe in einer TextBox:
Private mDecimal As Boolean
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
mDecimal = False
Select Case KeyCode
Case vbKeyDecimal
If Shift = 0 Then
mDecimal = True
End If
' ...
End Select
End Sub
Im KeyPress-Ereignis wird in beiden Fällen als Zeichen-Code der Wert 44 eintreffen, der Standard-Ascii-Code des Kommas. Hier können Sie nun, falls im KeyDown-Ereignis mDecimal auf True gesetzt worden ist, den Wert 46 für den Punkt zurückgeben.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 44
If mDecimal Then
KeyAscii = 46
End If
End Select
End Sub
|