vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB4, VB5, VB601.08.03
Advanced TextBox - mit Klasse

Haben Sie sich auch schon mal über die Textbox geärgert? Fehlen Ihnen nicht auch einige Funktionen wie z.B. den Text automatisch markieren beim Fokuserhalt der Textbox, oder das autom. Wechseln des Objekts beim Drücken von RETURN, oder sogar ein Hover-Effekt? Ab sofort alles kein Problem mehr :-)

Autor:  Roland WutzkeBewertung:     [ Jetzt bewerten ]Views:  1.580 
http://www.vb-power.netSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 


Erweiterte Textbox mit Klasse

Haben Sie sich auch schon mal über die Textbox geärgert? Fehlen Ihnen nicht auch einige Funktionen wie z.B. den Text automatisch markieren beim Fokuserhalt der Textbox? Klar sagen Sie, ist doch kein Problem:

Private Sub Text1_GotFocus()
  With Text1
    .SelStart = 0
    .SelLength = Len(.Text)
  End With
End Sub

Oder aber die Textbox reagiert nicht auf die RETURN Taste, so dass der Fokus zum nächsten Objekt wechselt. Ah ja, auch kein Problem:

Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = 13 Then
    KeyAscii = 0
    SendKeys "{TAB}", True
  End If
End Sub

Alles Richtig, alles kein Problem... Jetzt hat man aber nicht selten 10-20 Textboxen auf der Form. Also den Code in GotFocus und KeyPress 10-20 mal schreiben. Das ist schon ein Problem, denn das bläht den Code doch sehr auf und es wird unübersichtlich.

Wäre es nicht besser, man bräuchte den Code nur einmal zu schreiben, egal wie viele Textboxen sich auf der Form befinden? Doch wie lässt sich das realisieren? Die Lösung hierfür heißt "TextBox mit Klasse!". Was ist das und wie geht das? Klasse bedeutet in diesem Fall nichts anderes, als ein Objekt in einem Klassenmodul zu kapseln, so dass alle Eigenschaften, Methoden und Events des betreffenden Objekts zunächst an die Klasse und erst dann an die aufrufende Form geleitet werden. Jetzt ist es ein Leichtes, seinen eigenen Code an das Objekt zu binden.

Das nachfolgende Klassenmodul cTextBox zeigt Ihnen wie das geht. Es verfügt über folgende Eigenschaften:

  • Automatische Textmarkierung bei GotFocus (Optional = True)
  • Wechsel zum nächsten Objekt mit der RETURN Taste
  • Wiederherstellen des Originaltext mit STRG-O
  • Demarkieren des Textes mit F2 (MS-Office like)
  • Längenbegrenzung des Textes (Optional = 256 Zeichen)

Und so wird es gemacht: Legen Sie in einem neuen Projekt ein leeres Klassenmodul an. Benennen Sie das Klassenmodul cTextBox und fügen Sie den folgenden Code in das Klassenmodul ein.

Option Explicit
 
' TextBox mit Ereignisse
Public WithEvents TxtBox As TextBox
 
' Öffentliche Variablen
Public MaxLen As Long
Public AutoSelStart As Boolean
 
' Private Variable
Private oText As String
' Klasse Initialisieren
Private Sub Class_Initialize()
  MaxLen = 256
  AutoSelStart = True
End Sub
Private Sub TxtBox_GotFocus()
  ' Die Textbox mit dem neuen Style belegen.
  With TxtBox
    oText = .Text
    If AutoSelStart Then
      .SelStart = 0
      .SelLength = Len(.Text)
    End If
  End With
End Sub
Private Sub TxtBox_KeyDown(KeyCode As Integer, _
  Shift As Integer)
 
  With TxtBox
    Select Case KeyCode
      ' Prüfen ob F2 gedrückt wurde, dann den Text demarkieren
      ' und an das Textende springen. MS-Office like...
      Case vbKeyF2 And Shift = 0
        If .SelLength > 0 Then
          .SelLength = 0
          .SelStart = Len(.Text)
        End If
 
      ' Prüfen ob CTRL-O gedrückt, dann den 
      ' Original-Text wiederherstellen
      Case vbKeyO And Shift = 2
        .Text = oText
 
      ' Alle anderen Zeichen an die Textbox durchlassen.
      Case Else
    End Select
  End With
End Sub
Private Sub TxtBox_KeyPress(KeyAscii As Integer)     
  ' Prüfen ob RETURN gedrückt wurde, dann mit
  ' SendKeys {TAB} die Textbox verlassen.
  If KeyAscii = 13 Then
    KeyAscii = 0
    SendKeys "{TAB}", True
 
  ' Prüfen ob die maximale Textlänge erreicht ist.
  ElseIf KeyAscii <> vbKeyBack Then
    If Len(TxtBox.Text) >= MaxLen Then KeyAscii = 0
  End If
End Sub

Wie wird jetzt das Klassenmodul in Ihren eigenen Projekten verwendet? Hier ein Beispiel dazu: Fügen Sie in dem neu erstellten Projekt auf der Form1 vier Textboxen hinzu (Text1 - Text4). Kopieren Sie den folgenden Code in das Codefenster der Form1:

Option Explicit
 
' Anzahl aller Textboxen auf der Form
Private Const AnzTextBoxen = 4
Private sTextBox(1 To AnzTextBoxen) As New cTextBox
Private Sub Form_Load()
  ' Klassen instanzieren
  Set sTextBox(1).TxtBox = Text1
  Set sTextBox(2).TxtBox = Text2
  Set sTextBox(3).TxtBox = Text3
  Set sTextBox(4).TxtBox = Text4
 
  ' Text1 auf max 20 Zeichen setzen
  sTextBox(1).MaxLen = 20
 
  ' Text4 die automatische Markierung unterdrücken
  sTextBox(4).AutoSelStart = False
 
  ' Textboxen vorbelegen
  Text1.Text = "Advanced"
  Text2.Text = "Textbox"
  Text3.Text = "mit"
  Text4.Text = "Klasse"
End Sub

Passen Sie das Klassenmodul cTextBox an Ihre persönlichen Bedürfnisse an. Fügen Sie z.B. Code für LCASE und UCASE hinzu, oder lassen Sie nur numerische Werte in der Textbox zu. Und und und ...

Einen kleinen Wehrmutstropfen hat das Klassenmodul. Es werden keine Textbox Arrays (Index) unterstützt.

Ein erweitertes Klassenmodul mit solchen Eigenschaften und mehr wie z.B. einen Hover-Effekt finden Sie im beigefügten Demoprojekt. Das Demoprojekt.

Viel Spaß...
Roland Wutzke (Snoopy)