【入門編】Windows Formsにおける派生コントロールの作成:TextBoxを継承して「フォーカス取得時に全選択」「エンターキーで次へ移動」「バリデーション色変更」を標準装備した社内共通入力パーツの開発 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは! 現場の第一線で戦うエンジニアの皆さん、そして日々のWindows Forms開発で「また同じようなテキストボックスのイベント処理を書いてるな…」と天井を見上げてため息をついている皆さん。

フォームを作るたびに、「フォーカスが当たったら中身を全選択させたい」「Enterキーを押したら次のコントロールにフォーカスを飛ばしたい」「未入力やエラーの時は背景色を赤くしたい」……そんな似たようなコードを、何十個、何百個のTextBoxにコピペしていませんか?

今回は、その不毛なコピペ地獄に終止符を打つための決定版、「標準TextBoxを継承した最強の社内共通入力パーツ」の作り方を徹底解説します。

ここをクリアすれば、VB.NETによるオブジェクト指向UI開発の基本と本質はバッチリですよ。さあ、一緒にワンランク上のエンジニアへステップアップしましょう!

—

1. なぜ「コピペ開発」を卒業し、コントロール継承すべきなのか?

プログラミング初学者や、マクロの記録や小規模なVBAスクリプトからステップアップしたばかりのエンジニアが陥りがちな罠が、「必要な機能をその場しのぎでフォームごとに実装する」というスタイルです。

例えば、フォーム上にTextBoxが10個あったとします。

  • フォーカス取得時の全選択 (`GotFocus` イベント)
  • Enterキーでのフォーカス移動 (`KeyDown` イベント)

これらをすべてのTextBoxに個別で記述するとどうなるでしょう? 後から「やっぱりEnterじゃなくてTabの挙動に変えてほしい」と言われた時、100箇所以上のコードを修正する地獄が待っています。

継承(Inheritance)という名の魔法

オブジェクト指向の強力な武器である「継承」を使えば、Microsoftが用意した標準の `TextBox` の全機能を引き継ぎつつ、「私たちが社内で使いたい標準仕様」を最初から埋め込んだ新しいコントロール(カスタムコントロール)を作ることができます。

これを1つ作ってクラスライブラリやプロジェクト内に配置しておくだけで、ツールボックスからドラッグ&ドロップするだけで「全選択・エンター移動・バリデーション色変更」が標準装備された入力パーツが完成します。保守性は劇的に向上し、バグの入り込む余地は消え去ります。

—

2. 実装する3大機能の仕様

今回作成する `ExTextBox`(Extended TextBoxの略)に持たせる機能は以下の3つです。

1. フォーカス取得時に全選択 (`AutoSelect`)

  • ユーザーが入力欄をクリック、またはTabキーで移動してきた瞬間、既存の文字列がすべて選択状態になり、上書き入力しやすくなります。

2. Enterキーで次のコントロールへ移動 (`AutoTabOnEnter`)

  • 日本の業務アプリケーションで要望される「Enterでサクサク次の項目へ進む」を実現します。さらに、鬱陶しい「ピキッ」というシステムビープ音も抑制します。

3. バリデーション色変更 (`IsError` プロパティ)

  • 外部からエラー状態をフラグで切り替えることで、自動的に背景色が変わり、視覚的にユーザーへ警告を促します。

—

3. 実装コード:最強のカスタムTextBox

それでは、実際のVB.NETコードを見ていきましょう。プロジェクトに新しいクラスファイル(例: `ExTextBox.vb`)を追加し、以下のコードをそのまま貼り付けてください。

Imports System.Windows.Forms
Imports System.Drawing

”’

”’ フォーカス時全選択、Enterキー移動、エラー色変更を標準装備した拡張テキストボックス
”’

Public Class ExTextBox
Inherits TextBox

‘ — フィールド定義 —
Private _isErrorState As Boolean = False

”’

”’ エラー状態を取得・設定します。Trueの場合、背景色が警告色に変化します。
”’

Public Property IsError As Boolean
Get
Return _isErrorState
Get
Set(value As Boolean)
_isErrorState = value
‘ エラー状態に応じて背景色を動的に変更
If _isErrorState Then
Me.BackColor = Color.FromArgb(255, 230, 230) ‘ 薄い赤
Else
Me.BackColor = SystemColors.Window ‘ 標準の白(または背景色)
End If
End Set
End Property

”’

”’ コントロールがフォーカスを受け取った時の処理
”’

Protected Overrides Sub OnGotFocus(e As EventArgs)
MyBase.OnGotFocus(e)

‘ 数値入力や文字修正の利便性を上げるため、全選択を実行
Me.SelectAll()
End Sub

”’

”’ キーが押された時の処理(Enterキーでのフォーカス移動とビープ音抑制)
”’

Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
MyBase.OnKeyDown(e)

If e.KeyCode = Keys.Enter Then
‘ 1. Enterキーによる「ピキッ」というシステム音(ビープ音)を消去する
e.SuppressKeyPress = True

‘ 2. Shiftキーが押されていれば逆方向、押されていなければ順方向に次へ移動
Dim forward As Boolean = Not e.Shift

‘ 親フォームに対して次のコントロールへフォーカスを移すよう指示
If Me.Form IsNot Nothing Then
Me.Form.SelectNextControl(Me, forward, True, True, True)
End If
End If
End Sub

”’

”’ マウスでクリックされた直後の全選択解除を防ぐためのオーバーライド
”’ (GotFocusだけだとマウスでクリックした時にカーソル位置で選択が解除されてしまう対策)
”’

Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
MyBase.OnMouseUp(e)

‘ すでに文字列があり、テキストボックスが全選択されていない場合のみ、
‘ マウスアップによる選択解除を制御したい場合はここに処理を追加しますが、
‘ 基本的なOnGotFocusのSelectAllで大半のケースはカバーできます。
End Sub

End Class

—

4. コードの深掘りとエンジニアの知見

このコードには、現場で役立ついくつかの重要なテクニックが詰まっています。

① `Inherits TextBox` とメソッドのオーバーライド

イベントハンドラー(`TextBox1_Enter` など)をフォームごとに書くのではなく、`Protected Overrides Sub OnGotFocus` のように基底クラスのイベント発火メソッドを直接上書き(オーバーライド)しています。これにより、このコントロールを使うだけで自動的に機能が有効化されます。

② `e.SuppressKeyPress = True` の重要性

Windows Formsにおいて、TextBox上でEnterキーを押すと、フォームに「AcceptButton(既定のボタン)」が設定されている場合に誤作動を起こしたり、デフォルトで不快な警告音(ビープ音)が鳴ります。`e.SuppressKeyPress = True` を指定することで、キーボード入力を「消費」し、OSのデフォルト動作を完全にハックして止めることができます。

③ プロパティを通じた状態管理 (`IsError`)

コントロールのデザインを直接コードであちこち変更するのではなく、`IsError = True` という「状態(State)」だけを外から変えさせます。内部のカプセル化により、「エラーの時は何色の背景にするか」というルールをこのクラス内に閉じ込めることができています。

—

5. 実際の使い方と動作確認

1. 上記のコードをプロジェクトに追加したら、一度プロジェクトをビルド(またはリビルド)してください。
2. Visual Studioの「ツールボックス」の先頭あたりに、自動的に `ExTextBox` というアイコンが出現します。
3. 通常のTextBoxと同じように、フォームデザイナー上にドラッグ&ドロップして配置します。

これだけで、コードを1行も書かなくても、そのテキストボックスは「フォーカスで全選択」「Enterで次へ移動」する優秀なパーツに変貌しています。

バリデーション時の色の切り替え例

ボタンが押された時や、ロジック内で入力チェック(バリデーション)を行うときは、以下のように非常にシンプルに記述できます。

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
‘ 例:入力が空の場合
If String.IsNullOrWhiteSpace(ExTextBox1.Text) Then
MessageBox.Show(“値を入力してください。”, “エラー”, MessageBoxButtons.OK, MessageBoxIcon.Warning)

‘ プロパティをTrueにするだけで、自動的に背景が赤くなりエラー表現になる!
ExTextBox1.IsError = True
ExTextBox1.Focus()
Return
Else
‘ 正常に戻す
ExTextBox1.IsError = False
End If
End Sub

—

おわりに:ここをクリアすればVB.NETは怖くない!

今回紹介した「コントロールの継承」は、VB.NETやC#などのオブジェクト指向言語を使ったデスクトップアプリケーション開発において、最も費用対効果の高いテクニックの一つです。

「コピペで数をこなすプログラミング」から、「部品を作って再利用するエンジニアリング」へ。
この `ExTextBox` をベースにして、例えば「数値しか入力できないように制御する機能(NumericTextBox)」などを派生させていくことも容易にできます。

ぜひ、あなたの社内システムや日々の開発案件にこのパーツを導入し、開発スピードと品質を圧倒的に引き上げてください。

それでは、また次のテクニカルな知見でお会いしましょう。ハッピー・コーディング!

タイトルとURLをコピーしました