|
Einen Überschreib-Modus in einer TextBox können Sie mit einem simplen, kleinen Trick realisieren. Sie brauchen nur im KeyPress-Ereignis die Markierungslänge (SelLength) auf 1 zu setzen, wenn diese gleich 0 ist:
Private Sub Text1_KeyPress(KeyAscii As Integer)
With Text1
If .SelLength = 0 Then
.SelLength = 1
End If
End With
End Sub
Dieser Trick beruht darauf, dass beim Eintreffen des KeyPress-Ereignisses der Tastendruck noch nicht weiter von der TextBox bearbeitet worden ist. Denn erst nach der Abarbeitung des KeyPress-Ereignisses wird das eingegebene Zeichen eingefügt. Bei einer Markierungslänge von 1 wird also der aktuellen Position nächstfolgende Zeichen markiert und somit "überschrieben".
Die Einschränkung, dass nur dann überschrieben wird, wenn die Länge der Markierung 0 ist, sorgt dafür, dass eine längere Markierung (per Tastatur oder Maus vorgenommen) nicht auf 1 zurückgesetzt und somit erwartungsgemäß komplett ersetzt wird.
Eine weitere Einschränkung ist allerdings noch notwendig: Nur wenn der übergebene Ascii-Code tatsächlich ein Zeichen darstellt, also größer als 31 ist, sollte überschrieben werden. Denn auch Sondertasten wie die Rücktaste (Ascii-Code 8) oder ein Return (Ascii-Code 13) würden sonst zu einem Überschreiben führen. Doch beim Betätigen der Rücktaste sollte schließlich tatsächlich das links von der Schreibmarke stehende Zeichen entfernt werden, und nicht das rechts stehende.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Is > 31
With Text1
If .SelLength = 0 Then
.SelLength = 1
End If
End With
End Select
End Sub
Üblicherweise wird die Einfg-Taste zum Umschalten zwischen Normal-Modus (Einfügen neuer Zeichen) und Überschreib-Modus verwendet. Das Betätigen der Einfg-Taste muss im KeyDown-Ereignis erfolgen, da hierbei nicht das KeyPress-Ereignis ausgelöst wird. Dabei muss auch der Shift-Status berücksichtigt werden, damit nicht die immer noch zum Kopieren in und zum Einfügen aus der Zwischenablage gebräuchlichen Tastenkombinationen Strg-Einfg und Umsch-Einfg falsch interpretiert werden.
Den Status des Überschreib-Modus können Sie in einer Form-weit gültigen Variablen ablegen. Praktischer, vor allem wenn der jeweilige Status mehrerer TextBoxen zu verwalten ist, wäre eine Möglichkeit, den Statuswert in irgend einer Eigenschaft der TextBox abzulegen. Da die an sich für einen solchen Zweck vorgesehene Tag-Eigenschaft oft für andere, anwendungsspezifische Zwecke benötigt wird, bieten sich andere Eigenschaften an, die ansonsten heutzutage fast kaum noch benötigt werden: die Link-Eigenschaften der DDE-Kommunikation. Da wir als Status einen nummerischen Wert (True oder False) verwalten wollen, bietet sich von diesen insbesondere die LinkTimeout-Eigenschaft an. Deren voreingestellten Wert (50) müssten Sie auf 0 setzen, wenn der Anfangs-Status der gewöhnliche Einfüge-Modus sein soll.
Sie können die Auswertung der Tastendrücke und die Verwaltung des Status von Hilfsfunktionen erledigen lassen, die Sie in den Ereignissen KeyDown und KeyPress der betreffenden TextBoxen aufrufen. Der folgenden Funktion OWKeyDown übergeben Sie die betreffende TextBox und die Werte von KeyCode und Shift. Zusätzlich können Sie optional einen anderen Tasten-Code als vbKeyInsert angeben, wenn die Umschaltung über eine andere Taste erfolgen soll. Die Funktion gibt den aktuellen Status zurück, der zugleich in die LinkTimeout-Eigenschaft der TextBox geschrieben wird. Den zurückgegebenen Status-Wert können Sie für eine unabhängige Verwaltung des Status verwenden, oder etwa zur Aktualisierung einer Anzeige in einer StatusBar.
Public Function OWKeyDown(TextBox As TextBox, KeyCode As Integer, _
ByVal Shift As Integer, Optional ByVal ToggleKey As Long = _
vbKeyInsert) As Boolean
With TextBox
Select Case KeyCode
Case ToggleKey
If Shift = 0 Then
Select Case .LinkTimeout
Case 0
.LinkTimeout = True
Case Else
.LinkTimeout = False
End Select
KeyCode = 0
End If
End Select
OWKeyDown = CBool(.LinkTimeOut)
End With
End Function
Der Prozedur OWKeyPress übergeben Sie ebenfalls die betreffende TextBox und dazu den KeyAscii-Wert. Zusätzlich können Sie im optionalen Parameter OverWriteMode einen explizit gewünschten (oder unabhängig von der LinkTimeout-Eigenschaft verwalteten Status-Wert) übergeben.
Public Sub OWKeyPress(TextBox As TextBox, ByVal KeyAscii As Integer, _
Optional ByVal OverWriteMode As Variant)
Dim nOverWrite As Boolean
With TextBox
Select Case KeyAscii
Case Is > 31
If IsMissing(OverWriteMode) Then
nOverWrite = CBool(.LinkTimeout)
Else
nOverWrite = CBool(OverWriteMode)
End If
If nOverWrite Then
If .SelLength = 0 Then
.SelLength = 1
End If
End If
End Select
End With
End Sub
Über die beiden folgenden Property-Prozeduren können Sie den aktuellen Status einer TextBox auslesen oder unabhängig setzen:
Public Property Get OWMode(TextBox As TextBox) As Boolean
OWMode = CBool(TextBox.LinkTimeout)
End Property
Public Property Let OWMode(TextBox As TextBox, New_OWMode As Boolean)
TextBox.LinkTimeout = New_OWMode
End Property
|