ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 07.01.2003

Diese Seite wurde zuletzt aktualisiert am 07.01.2003
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Überschreiben in der TextBox

Zurück...


Anzeige

(-hg) mailto:hg_tboverwritemode@aboutvb.de

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

Test-Projekt und Modul modTBOverWriteMode (tboverwritemode.zip - ca. 3,6 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer