【入門編】Windows Formsにおけるユーザー定義コントロールの継承:TextBoxを拡張して「フォーカス取得時の全選択」と「エラー時背景色変更」を標準装備した共通パーツの作り方 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク
スポンサーリンク

コピペ地獄からの脱却。継承(Inheritance)を武器に「自分専用の最強パーツ」を作る技術

こんにちは。現場のエンジニアとして、日々コードと向き合っている皆さんの力になりたいと考えている、シニアアーキテクトです。

「マクロの記録はできるようになったけれど、画面が増えるたびに同じようなコードを何度も書き直している……」
「エラーチェックのコードを、全てのテキストボックスにコピペして回るのが苦痛だ……」

もしあなたが今、そんな風に感じているなら、おめでとうございます。あなたは今、「ただプログラムが書ける人」から「システムを設計できるエンジニア」へと進化するための、極めて重要な壁の前に立っています。

今日は、Visual Basic (VB.NET) の真骨頂の一つである「継承(Inheritance)」を使い、Windows Forms の標準コントロールを自分好みに改造して、魔法のような「共通パーツ(カスタムコントロール)」を作る方法を伝授します。

ここをクリアすれば、あなたの開発スピードは劇的に、そしてエレガントに向上しますよ。

1. なぜ「コピペ」はエンジニアにとっての毒なのか?

まず、私たちが避けるべき「悪習」について整理しておきましょう。

例えば、アプリ内に10個の入力項目(TextBox)があるとします。

  • フォーカスが当たったら、中の文字を全選択してほしい。
  • 入力エラーがあったら、背景色を薄い赤色にしてほしい。

これを、各画面のイベントハンドラ(`TextBox1_Enter` や `TextBox1_Validating`)に書き込んでいくとどうなるでしょうか?

1. 修正が地獄になる:「やっぱり赤色はピンクにして」と言われたら、10箇所(あるいはもっと多くの画面)をすべて探し出して書き直さなければなりません。
2. ミスが生まれる:1箇所だけ書き換え忘れる、といった「ケアレスミス」が必ず発生します。
3. コードが汚れる:本来、画面の動き(ロジック)を書くべき場所に、見た目の制御コードが溢れかえってしまいます。

これを解決するのが、「部品そのものを進化させる」という考え方です。

2. 「継承」という名の魔法:LEGOブロックの進化

「継承」とは、既存のクラス(親)が持っている機能を引き継ぎつつ、新しい機能を追加したり、既存の動きを書き換えたり(オーバーライド)することです。

イメージとしては、「標準のレゴブロック(TextBox)」をベースにして、「光る機能」や「音が出る機能」を追加した「特製レゴブロック(SmartTextBox)」を作るようなものです。

一度「特製ブロック」を作ってしまえば、次からはツールボックスからそれをドラッグ&ドロップするだけで、すべての機能が最初から備わった状態で使えるようになります。

3. 実践:SmartTextBox を作ってみよう

それでは、実際にコードを書いていきましょう。Visual Studio で「クラス」を新しく追加し、以下のコードを記述してください。

''' <summary>
''' フォーカス時に全選択し、エラー時に背景色が変わる高機能テキストボックス
''' </summary>
Public Class SmartTextBox
    Inherits TextBox ' ←ここが最重要!標準のTextBoxの能力をすべて引き継ぎます

    ' エラー状態を管理するための内部変数
    Private _isError As Boolean = False

    ''' <summary>
    ''' エラー状態を制御するプロパティ
    ''' 開発者は、このプロパティを True/False にするだけで背景色を制御できます
    ''' </summary>
    Public Property IsError As Boolean
        Get
            Return _isError
        End Get
        Set(value As Boolean)
            _isError = value
            ' 値が変わった瞬間に、見た目(BackColor)を更新する
            UpdateAppearance()
        End Set
    End Property

    ''' <summary>
    ''' コントロールの見た目を更新するプライベートメソッド
    ''' </summary>
    Private Sub UpdateAppearance()
        If _isError Then
            ' エラー時は薄い赤色にする
            Me.BackColor = Color.MistyRose
        Else
            ' 通常時は白にする
            Me.BackColor = Color.White
        End If
    End Sub

    ''' <summary>
    ''' フォーカスを得た時の動作を「上書き(Override)」します
    ''' </summary>
    Protected Overrides Sub OnEnter()
        ' まずは、親(標準のTextBox)が本来行うはずの処理を呼び出します
        ' これを忘れると、標準の挙動が壊れてしまうので注意!
        MyBase.OnEnter()

        ' フォーカスが当たった瞬間に、テキストを全選択する
        Me.SelectAll()
    End Sub

    ''' <summary>
    ''' フォーカスが外れた時の動作をカスタマイズしたい場合は、同様にOnLeaveをOverrideします
    ''' </summary>
    Protected Overrides Sub OnLeave()
        MyBase.OnLeave()
        ' 必要に応じて、フォーカスが外れた時の処理をここに書けます
    End Sub

End Class

コードの重要ポイント解説

1. `Inherits TextBox`
これが「継承」の宣言です。「このクラスは、TextBoxの子供ですよ」と宣言することで、TextBoxが持っている `Text` プロパティや `ForeColor` プロパティを、そのまま自分のものとして使えます。
2. `Protected Overrides Sub OnEnter()`
ここがプロの技です。イベント(`Enter`イベント)を使うのではなく、メソッド(`OnEnter`)をオーバーライドしています。

  • なぜ?: イベントは「通知」を受け取るものですが、オーバーライドは「動作そのものを書き換える」ものです。コントロール開発においては、オーバーライドの方が動作が確実で、パフォーマンスも高いのです。

3. `MyBase.OnEnter()`
「親の仕事もちゃんとやっておいてね」という命令です。これを抜かすと、標準のTextBoxが持つべき内部処理がスキップされ、予期せぬバグの原因になります。
4. `Property IsError`
利用者が「今、エラーですよ!」と伝えるための窓口です。プロパティの中で `UpdateAppearance()` を呼ぶことで、「値をセットするだけで見た目が変わる」という直感的な使い心地を実現しています。

4. 使い方:作成したパーツを画面に配置する

コードを書き終えたら、一度「ビルド」→「ソリューションのビルド」を実行してください。

すると、Visual Studio の「ツールボックス」の中に、あなたが作った `SmartTextBox` が現れます!

あとは、普通の TextBox と同じように画面へドラッグ&ドロップするだけ。
使い方はこうなります:

' 例:入力チェックのロジック
Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
    If SmartTextBox1.Text = "" Then
        ' エラー状態にする(これだけで背景が赤くなる!)
        SmartTextBox1.IsError = True
        MessageBox.Show("入力してください!")
    Else
        ' エラーを解除する
        SmartTextBox1.IsError = False
    End If
End Sub

5. 陥りやすいエラーと、エンジニアとしての心得

最後に、初心者がハマりやすいポイントを伝授しておきます。

  • 「ツールボックスに出てこない!」

継承したクラスを作った直後は、まだ Visual Studio がそれを認識していません。必ず「ビルド」を行ってください。

  • 「プロパティが反映されない!」

プロパティの `Set` の中で、見た目を更新するメソッド(今回なら `UpdateAppearance`)を呼び忘れていませんか? 値を変えることと、見た目を変えることは別物です。

  • 「設計の迷い」

「何でもかんでも一つのカスタムコントロールに入れすぎないこと」が大切です。そのコントロールが「何をするためのものか」を常に意識してください。

まとめ:あなたはもう「作る人」になれる

いかがでしたでしょうか?

単なる「コピペ」による実装は、その場しのぎの技術です。しかし、「継承」を用いたコンポーネント設計は、「次に作る人が楽になるための、未来への投資」です。

一度この「共通パーツを作る感覚」を身につければ、あなたの作るアプリケーションの品質は劇的に向上し、修正作業のストレスからも解放されるはずです。

ここをクリアすれば、Visual Basic (VB.NET) の基本はバッチリですよ。
さあ、次はどんな「魔法のパーツ」を作ってみますか? 応援しています!

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