フォーカスを取得した時にテキストを全選択状態にする
スポンサーリンク
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
関連するリファレンス
準備中です。