【入門編】保守性を高めるフォームの継承(Inherited Forms):共通のヘッダー・フッターを持つ複数画面のテンプレート設計と注意点 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!日々、Windows Formsと格闘しながら、より良い社内システムの構築を目指しているあなたへ。

Excelのマクロ記録から一歩踏み出し、「本格的な業務アプリを作りたい!」とVB.NETの世界に飛び込んだのは素晴らしい選択です。でも、こんな悩みを持ったことはありませんか?

  • 「どの画面を開いても、上部に同じ会社のロゴやタイトル、下部に『閉じる』や『登録』ボタンを毎回配置している……これ、デザインが変わったら全画面修正するの?」
  • 「ボタンの配置やサイズが画面ごとにバラバラで、ユーザーから『使いにくい』って怒られた……」

もし心当たりがあるなら、ここをクリアすればあなたのVB.NETスキルは一段も二段も跳ね上がります。今回は、オブジェクト指向のパワーを最大限に引き出し、「保守性を極限まで高めるフォームの継承(Inherited Forms)」について、実務で即戦力となるノウハウを優しく、そして深く解説していきましょう。

—

なぜ「コピペ開発」は地獄への片道切符なのか?

初学者がやりがちなのが、「MainMenu.vb」をコピーして「SubMenu1.vb」「SubMenu2.vb」と量産していく手法です。動くには動きますが、これは保守性において「地獄への片道切符」です。

後になって「やっぱりヘッダーにログアウトボタンを追加したい」「フッターの背景色を青からグレーに変えたい」と言われたとき、全画面(例えば50画面!)を開いてポチポチ手作業で修正しますか? そんな無駄な残業は、私たちのエレガントなコードで撲滅しましょう。

救世主:フォームの継承(Visual Inheritance)

オブジェクト指向には「継承」という強力な概念がありますよね。実はWindows Formsにもこれが備わっています。

  • ベースフォーム(親): 全画面共通のヘッダー、フッター、共通の処理をまとめた「型枠」。
  • 派生フォーム(子): ベースフォームを「継承」し、中身の業務データ入力エリアだけを個別に作る。

これを使えば、親のデザインを変えるだけで、子であるすべての画面が一瞬でアップデートされます。まさに業務システムのテンプレート設計における「究極の解」です。

—

実践:ベースフォームを作ってみよう

それでは、実際にVisual Studioを使って、美しく堅牢なベースフォームを設計していきましょう。今回はVB.NETのWindows Formsプロジェクトを想定しています。

まずは、すべての基本となる親フォーム `BaseForm.vb` を作成します。

1. ベースフォームのレイアウト設計

デザイナを開き、次のようにパーツを配置します。

  • Panel(上部): `pnlHeader` (ここに共通のタイトルやロゴ)
  • Panel(下部): `pnlFooter` (ここに「閉じる」「登録」などの共通ボタン)
  • Panel(中央): `pnlBody` (ここが超重要! 子フォームがそれぞれの業務パーツを配置する領域)

ここで重要なポイントがあります。子フォームがこのベースフォーム上の部品を自由に触れるように、修飾子(Modifiers)を適切に設定しなければなりません。

> 💡 先輩エンジニアの極意:修飾子(Modifiers)の罠
> デザイナで配置したコントロールのプロパティを見ると、`Modifiers` という項目があります。デフォルトは `Friend` や `Private` になっています。これを `Protected`(または `Public`) に変更してください。
> これにより、「親で定義したボタンやパネルは、子フォームからも触っていいよ」というアクセス権を許可することになります。これを忘れると、子フォームから共通ボタンのイベント制御などができず、ビルドエラーで悶絶することになります。

2. ベースフォームのコード(BaseForm.vb)

Public Class BaseForm
‘ フォームが読み込まれたときの共通処理
Private Sub BaseForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
‘ 例: 画面表示時にログを出力する、権限チェックを行うなど
Debug.WriteLine(Me.Text & ” がロードされました。”)
End Sub

‘ 共通の「閉じる」ボタンが押されたときの処理
Protected Sub

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