VB6フォーカスを取得した時にテキストを全選択状態にする

スポンサーリンク

Windows 内でも「フォーカスを取得したらテキストを全選択状態にする」という仕様は良く見かけます。以下の例のように、TextBox の Enter イベントで実装してみると良いでしょう。

すべての TextBox コントロールでこのコードをベタ書きすると、骨が折れる上ソースが汚くなります。これらの機能を実現したカスタム コントロールを作成すると良いでしょう。

VB6 では、GotFocus イベントになります。しかし困ったことに、マウスで選択した際にも全選択状態になってしまいます。(マウスで選択した時に、全選択状態になってしまう TextBox は Windows 内では見かけません)

以下の例では、マウスで選択したかどうかの判断を用いて、マウスでは全選択状態にならないように実装しています。

サンプルコード

以下にサンプルコードを示します。

VB6.0 以前
Option Explicit

' マウスで選択したことを示すフラグ
Private mIsMouseDown As Boolean

' Text1 がフォーカスを取得したら、テキストを全選択状態にする (マウスでの選択は除く)
Private Sub Text1_GotFocus()
    If Not mIsMouseDown Then
        Me.Text1.SelStart = 0
        Me.Text1.SelLength = Len(Me.Text1.Text)
    End If
End Sub

' Text1 がフォーカスアウトしたら、マウス選択フラグを戻す
Private Sub Text1_LostFocus()
    mIsMouseDown = False
End Sub

' マウスで選択したことを検知する
Private Sub Text1_MouseDown(ByRef Button As Integer, ByRef Shift As Integer, ByRef X As Single, ByRef Y As Single)
    mIsMouseDown = True
End Sub

とはいえ、TextBox すべてにこんな実装をしていたら日が暮れてしまいますので、以下のようなクラス モジュールでイベントの機能を拡張してみましょう。クラス モジュール名は「ExtendsTextBox」としておいてください。

VB6.0 以前
'/* ExtendsTextBox クラス モジュール */
Option Explicit

' 紐付けるイベントの定義
Private WithEvents This As TextBox

' マウスで選択したかどうかを示すフラグ
Private mIsMouseDown As Boolean

' コンストラクタの代わり
Public Sub ExtendsTextBox(ByVal cTextBox As TextBox)
    Set This = cTextBox
End Sub

' This.GotFocus イベント
Private Sub This_GotFocus()
    If mIsMouseDown Then
        mIsMouseDown = False
        Exit Sub
    End If

    This.SelStart  = 0
    This.SelLength = Len(This.Text)
End Sub

' This.LostFocus イベント
Private Sub This_LostFocus()
    mIsMouseDown = False
End Sub

' This.MouseDown イベント
Private Sub This_MouseDown(ByRef Button As Integer, ByRef Shift As Integer, ByRef X As Single, ByRef Y As Single)
    mIsMouseDown = True
End Sub

以下のように、このクラス モジュールを利用するためのメソッドを、標準モジュールかどこかに書いてみてください。

VB6.0 以前
'/* ExtendsHelper モジュール */
Option Explicit

' ExtendsTextBox へ紐付けする
Public Sub CreateExtendsTextBox(ByVal cTargetForm As Form, ByRef cExtendsTextBoxes() As ExtendsTextBox)
    Dim cControl As Control
    Dim lIndex   As Long

    For Each cControl In cTargetForm.Controls
        If TypeOf cControl Is TextBox Then
            ReDim Preserve cExtendsTextBoxes(lIndex)
            Set cExtendsTextBoxes(lIndex) = New ExtendsTextBox
            Call cExtendsTextBoxes(lIndex).ExtendsTextBox(cControl)
            lIndex = lIndex + 1
        End If
    Next cControl
End Sub

以下のように、Form のインスタンスを先ほどのメソッドに渡せば、すべての TextBox で全選択されるようになります。

VB6.0 以前
'/* 対象となるフォーム */
Option Explicit

' ExtendsTextBox のインスタンスを格納しておく配列
Private MyExtendsTextBoxes() As ExtendsTextBox

' Load イベント
Private Sub Form_Load()
    Call CreateExtendsTextBox(Me, MyExtendsTextBoxes())
End Sub

関連するリファレンス

準備中です。

スポンサーリンク