こんにちは!現場のコードを美しく、そして強靭に組み上げるのが大好きな先輩エンジニアです。
Excelのマクロ記録から一歩踏み出し、「そろそろ本格的な業務アプリケーションを自分の手で作りたい」「社内のあちこちにあるバラバラな入力フォームの見た目や動きを完全に統一したい」――そんな野望を持ったあなたを待っていました。
今回は、VB.NETを使った「カスタムUIコントロールの自作」について徹底解説します。
ここをクリアすれば、あなたも単なる「コードの書き手」から「アーキテクト(設計者)」への階段を確実に登ることができますよ。一緒にマスターしていきましょう!
—
1. なぜ「カスタムコントロール」が必要なのか?
業務システムを開発していると、こんな課題にぶつかりませんか?
- 「すべてのテキストボックスで、半角英数字だけを入力可能にしたい」
- 「必須入力の項目は、背景色を薄い黄色にして視覚的にわかりやすくしたい」
- 「エラーが起きたときのエラーメッセージの出し方を全画面で統一したい」
これを、フォームを新しく作るたびに毎回イベントや判定コードを書いているようでは、プログラマとしての寿命が縮まってしまいます。仕様変更があったときに地獄を見るのは自分です。
だからこそ、「検証機能付きテキストボックス」のような部品を自作し、使い回せるようにするのです。VB.NETには、これを実現するための強力な武器が2つ用意されています。
—
2. 武器の選び方:「UserControl」と「Inherited Control」
カスタムUIを作るアプローチには、大きく分けて2つの方法があります。適材適所で使い分けるのがプロの技です。
① 複合コントロール(UserControl)
複数の既存コントロールを「ひとまとめ」にして、新しい1つの部品にする方法です。
- 向いている用途: 「検索窓(テキストボックス + 検索ボタン)」や「郵便番号入力欄(3桁テキスト + ハイフン + 4桁テキスト)」など。
② 継承コントロール(Inherited Control)
既存のコントロール(TextBoxやButtonなど)を「ベース」にして、そこに独自の機能やプロパティを追加・改造する方法です。
- 向いている用途: 「フォーカスが当たると自動で全選択されるテキストボックス」や「入力エラー時に赤く光るテキストボックス」。
今回は、業務アプリで最も需要が高い「継承コントロール(Inherited Control)」を使って、エンターキーで自動フォーカス移動し、フォーカス取得時に背景色が変わる「スマート・テキストボックス」を一緒に作ってみましょう!
—
3. 実践!「スマート・テキストボックス」の自作
さっそく、Visual Studioを開いてください(Community版で十分です)。
ステップ1:クラスライブラリ、またはWindowsフォームプロジェクトの準備
プロジェクトの中に、新しい「ユーザーコントロール」または「コンポーネント」を追加しても良いですが、今回は分かりやすく、Windowsフォームアプリケーションの中に直接クラスファイルを追加して作ってみましょう。
プロジェクトを右クリック > [追加] > [新しい項目] から 「クラス (Class)」 を選択し、ファイル名を `SmartTextBox.vb` とします。
ステップ2:最強のTextBoxコードを書く
以下のコードを貼り付けてください。コードの意味は後で優しく解説します。
Option Strict On
Option Explicit On
Imports System.Windows.Forms
Imports System.Drawing
”’
”’
Public Class SmartTextBox
Inherits TextBox
‘ フィールド:フォーカス前の元の背景色を記憶しておく
Private m_OriginalBackColor As Color
‘ コンストラクタ
Public Sub New()
MyBase.New()
‘ 初期設定として、少しモダンなフォントや余白を設定することも可能
Me.Font = New Font(“Meiryo UI”, 9.0F)
End If
Region “イベントのオーバーライド(コントロールの挙動を乗っ取る)”
‘ 1. フォーカスを取得した瞬間 (Enter)
Protected Overrides Sub OnEnter(e As EventArgs)
MyBase.OnEnter(e)
‘ 現在の背景色を退避させてから、専用の色(薄い黄色)に変更
m_OriginalBackColor = Me.BackColor
Me.BackColor = Color.LightYellow
‘ ついでに、テキストボックス内の文字を全選択状態にする(入力の手間を減らす親切設計)
Me.SelectAll()
End Sub
‘ 2. フォーカスを失った瞬間 (Leave)
Protected Overrides Sub OnLeave(e As EventArgs)
MyBase.OnLeave(e)
‘ 背景色を元の色に戻す
Me.BackColor = m_OriginalBackColor
End Sub
‘ 3. キーが押された瞬間 (KeyDown)
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
MyBase.OnKeyDown(e)
‘ もし押されたキーが「Enter」だったら…
If e.KeyCode = Keys.Enter Then
‘ 「Ding!」という鬱陶しいシステムエラー音を消す
e.SuppressKeyPress = True
‘ 次のコントロールへフォーカスをバトンタッチする
SendKeys.Send(“{TAB}”)
End If
End Sub
End Region
End Class
—
4. コードの深掘り解説:ここがプロの技術
初心者の方へ、「おっ」と驚くようなVB.NETならではのポイントを解説します。
1. `Inherits TextBox` の魔力
これが継承の呪文です。これだけで、この `SmartTextBox` は「本物のTextBoxが持つすべての機能(文字入力、コピペ、MaxLength、ScrollBarsなどなど)」を丸ごと引き継ぎます。 ゼロからテキストボックスの機能を実装する必要は一切ありません。
2. `Protected Overrides Sub` による「イベントの乗っ取り」
コントロール内部で起きるイベント(フォーカスが入った、キーが押されたなど)を、クラスの内部から直接フック(横取り)して挙動を書き換えています。外側から `AddHandler` するよりも、コントロール単体にカプセル化できるため、保守性が圧倒的に高まります。
3. `e.SuppressKeyPress = True` の配慮
業務アプリでEnterを押したとき、デフォルトのままだと「ビクッ!」とエラー音が鳴ってイライラさせられます。この1行を入れるだけで、その不快な音をスマートに消し去ることができます。こうした細部へのこだわりが、優れた業務アプリの条件です。
—
5. 実際に使ってみよう!
コードを書いたら、一度プロジェクトをビルド(Ctrl + Shift + B)してください。
ビルドが成功すると、Visual Studioの「ツールボックス」の一番上に、なんと `SmartTextBox` というアイコンが自動で出現します。
あとは、通常のテキストボックスと同じように、Windowsフォームの画面上にドラッグ&ドロップで配置するだけです。
- 画面を実行してみましょう。
- フォーム上のいくつかの `SmartTextBox` に文字を入力してみてください。
- フォーカスが当たると「パッと黄色く」なり、Enterキーを押すだけで次のテキストボックスへスルスルとカーソルが移動します。
――どうですか? たったこれだけのコードで、すべての入力フォームの操作性が劇的に向上しましたよね。
—
6. 陥りがちな罠とエラー対策
現場でこのカスタムコントロールを運用する際によくある落とし穴をシェアしておきます。
- エラー: 「ビルドしないとツールボックスに現れない」
→ VB.NETのカスタムコントロールは、コードを書き換えただけではデザイナに反映されません。必ずビルド(またはソリューションのビルド)を行ってください。
- デザイン画面でエラーが出る場合
→ コントロールのコンストラクタ内で、外部のデータベースに接続したり、存在しないファイルを読み込もうとしたりすると、Visual Studioのデザイン画面自体がクラッシュすることがあります。コンストラクタ(`Sub New()`)の中身は、純粋なUI初期化だけに留めるのが鉄則です。
—
まとめ
今回は、VB.NETによるカスタムUIコントロールの自作(継承コントロール)について解説しました。
- `Inherits` を使えば、既存の強力な機能をそのまま拡張できる。
- `Overrides` を使って、フォーカスやキー入力を一元管理する。
- 共通部品化することで、社内アプリ全体の品質と開発スピードが爆発的に上がる。
ここをクリアできれば、あなたはもう初心者ではありません。自信を持って、自分の手で使いやすい業務アプリを設計・構築してくださいね。
Visual Basic (VB / VB.NET) の世界は、突き詰めれば詰めるほどエンジニアの意図を素直に聞いてくれる最高の相棒になります。一緒に最高のシステムを作り上げていきましょう!
