RSS
StartseiteKnowledge LibraryTop 10Impressum

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/-td

Man 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.