業務システムでは似た様なフォームを作成することがありますが、 共通となる部分を基本的なフォームクラスとして作成しておき、 それを継承することでデザインの統一を図ったりします。
今回はフォームクラスの継承の方法について順を追って説明します。
まず最初に基本となるフォームに1個のパネルを設置し、その上に1個のボタンを置く様にしました。 (フォームの名前は「BaseForm」としました。) デザイン画面は以下の様な感じです。
その後、ボタンのクリックイベントで簡単なメッセージを表示する様にしました。
最初のBaseFormのソース
Public Class BaseForm
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox("BaseForm : Button1_Click")
End Sub
End Class
ここで一旦このプロジェクトのビルドを行います。 その後、プロジェクトにこの「BaseForm」を利用するフォームの追加を行ってみます。 プロジェクトへの項目の追加を行うために、 「新しい項目追加」ダイアログで 「Windows Forms」 の中の 「継承されたフォーム」 を選択します。 フォーム名は Form1 のままとします。
この後で「継承ピッカー」ダイアログが表示されますので 「BaseForm」 を選択して「OK」をクリックします。
結果的に以下の様にフォームデザイン画面が表示されます。 (フォーム上のパネルとボタンの所に小さいマークが付いていますが、このデザインからは修正できない状態であるロックが掛かった状態であることを示しています。)
この後、このプロジェクトのプロパティを開いて 「スタートアップ オブジェクト」 を 「Form1」 に設定します。
このプロジェクトを実行させると以下の様になります。画面はボタンをクリックした時の状態を示します。
Form1 では特に何もソースは記述していませんが、継承されたフォームの処理が出来ることが分かると思います。
このままでは面白くないので 「BaseForm」 にボタンのタイトルを変更するプロパティを追加してみます。
タイトルプロパティの追加のBaseFormのソース
Public Class BaseForm
' ボタン1タイトルに文字列設定
Public Property Button1Title As String
Get
Return Me.Button1.Text
End Get
Set(value As String)
Me.Button1.Text = value
End Set
End Property
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox("BaseForm : Button1_Click")
End Sub
End Class
Form1のソース
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'ボタンタイトル設定
Me.Button1Title = "ボタン"
'フォームタイトルも設定
Me.Text = "Form1 から設定されたタイトル"
End Sub
End Class
これを実行すると以下の様に、ボタンのタイトルが「ボタン」に変わったことが分かります。
さらに、ボタン処理を継承先から上書き変更できる様にしたいと思います。 BaseForm 側では Button1_Click メソッドに Overridable 修飾子を付加して上書き可能であることを宣言します。
Form1 側では Button1_Click メソッドを上書きすることを宣言するため Overrides 修飾子を付加します。
ボタン処理をオーバーライド指定としたBaseFormのソース
Public Class BaseForm
' ボタン1タイトルに文字列設定
Public Property Button1Title As String
Get
Return Me.Button1.Text
End Get
Set(value As String)
Me.Button1.Text = value
End Set
End Property
'オーバーライド指定
Protected Overridable Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox("BaseForm : Button1_Click")
End Sub
End Class
Form1のソース:ボタン処理をオーバーライド
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'ボタンタイトル設定
Me.Button1Title = "ボタン"
'フォームタイトルも設定
Me.Text = "Form1 から設定されたタイトル"
End Sub
Protected Overrides Sub Button1_Click(sender As Object, e As EventArgs)
'別の処理にする
MsgBox("Form1 からのボタン処理")
End Sub
End Class
これを実行すると以下の様に、ボタンクリック処理が Form1 の処理しか行われないことが分かります。
もし、継承元のボタン処理も行いたい場合には Form1 を以下の様に変更します。 これを実行し、ボタンをクリックすると2回メッセージボックスが表示されます。
Form1のソース:ボタン処理をオーバーライド2
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'ボタンタイトル設定
Me.Button1Title = "ボタン"
'フォームタイトルも設定
Me.Text = "Form1 から設定されたタイトル"
End Sub
Protected Overrides Sub Button1_Click(sender As Object, e As EventArgs)
'継承元のボタン処理
MyBase.Button1_Click(sender, e)
'別の処理にする
MsgBox("Form1 からのボタン処理")
End Sub
End Class
関連する記事
⇒フォームクラス生成時に設定値を同時に渡す方法⇒フォーム上の複数のコントロール(TextBox)の入力変化を確認する方法について
⇒フォームのマウスカーソルを待機状態する方法について
⇒フォームクラスの継承の方法について
コメント