Automatische Vorauswahl
Textfelder bei Fokuserhalt komplett markieren
Bei nahezu jedem Textfeld in der Windowsumgebung wird der gesamte Text markiert, wenn es den Fokus erhält. Aber auch nur, wenn dieser Fokus durch die Tastatur kam...
Uwe Sieber/-tdMan findet dieses Feature bei fast jedem Textfeld – sobald es den Fokus erhält, wird der komplette Text markiert. Das ComboBox Steuerelement beherrscht dies von Haus aus, das TextBox Steuerelement hingegen nicht. Man muss dieses eigentlich banale Feature also selber nachrüsten:
Private Sub Text1_GotFocus() With Text1 .SelStart = 0 .SelLength = Len(.Text) End With End Sub
Hat man jetzt mehrere TextBoxen mit diesem Feature auszustatten, ist es sinnvoller eine kleine Prozedur für das Markieren anzulegen. Eine Übergabe des Steuerelements muss nicht erfolgen, dies kann über Screen.ActiveControl angesprochen werden:
Public Sub SelectText() With Screen.ActiveControl .SelStart = 0 .SelLength = Len(.Text) End With End With
Der Rest ist einfachstes Copy & Paste:
Private Sub Text1_GotFocus() SelectText End Sub
Durch ein Control-Array kann man sich die Arbeit nochmals vereinfachen.
Aber halt! Haben wir bei dieser banalen Lösung nicht etwas übersehen? Richtig. Schaut man sich mal das Verhalten der Fokus-Markierung anderer Textfelder an, werden diese nur markiert, wenn man mit der TAB-Taste oder per Shortcut zum Textfeld wechselt. Bekommt das Textfeld den Fokus dagegen durch die Maus, wird der Inhalt nicht markiert.
Die API Funktion GetAsyncKeystate verrät dabei, welche Tasten zuletzt gedrückt waren und so lässt sich die Prozedur "SelectText" recht einfach um eine Statuserkennung der drei Maustasten erweitern:
Private Declare Function GetAsyncKeyState Lib "user32" _ (ByVal vKey As Long) As Integer Public Sub SelectText() If (TypeOf Screen.ActiveControl Is TextBox) Then If Not CBool(GetAsyncKeyState(vbKeyLButton) Or _ GetAsyncKeyState(vbKeyMButton) Or _ GetAsyncKeyState(vbKeyRButton)) Then With Screen.ActiveControl .SelStart = 0 .SelLength = Len(.Text) End With End If End If End Sub
Angewendet, wie gehabt, im GotFocus-Ereignis des betreffenden Controls.