連載:Windowsフォーム開発入門【Visual Studio 2010対応】

独自Windowsフォーム・クラスの活用

初音 玲
2011/04/05
Page1 Page2

 Windowsフォーム開発では、基本クラスであるFormクラス(System.Windows.Forms名前空間)から派生したクラス(図1参照)上にコントロールを配置し、プログラム・コードを記述することで、Windowsフォームの基本的な機能を活用できるようになっている。

図1 Windowsフォーム(Form1)の定義

 Formクラスからの継承(Inherits)の記述は、Visual Basicの場合はForm1.Desiger.vbファイルに記述され、C#の場合はForm1.csファイルに記述される。

 なお、.Designer.cs/.Designer.vbファイルはFormクラスの部分クラスを定義しているファイルで、フォーム・デザイナを使ってフォームに配置した各コントロールのコードが機械的に自動的に生成されるなど、手動で直接コードを書き換えない内容が記述されている。従って、継承の記述も.Designer.cs/.Designer.vbファイルにある方が理にかなっているように思う(C#はそのようにはなっていない)。

 次のコードは、Formクラスからの継承が記述されている個所である。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
  Inherits System.Windows.Forms.Form

  <System.Diagnostics.DebuggerNonUserCode()> _
  Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
      If disposing AndAlso components IsNot Nothing Then
        components.Dispose()
      End If
    Finally
      MyBase.Dispose(disposing)
    End Try
  End Sub

  ' Windows フォーム デザイナーで必要です。
  Private components As System.ComponentModel.IContainer

  ' メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。
  ' Windows フォーム デザイナーを使用して変更できます。
  ' コード エディターを使って変更しないでください
  <System.Diagnostics.DebuggerStepThrough()> _
  Private Sub InitializeComponent()
    components = New System.ComponentModel.Container()
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Text = "Form1"
  End Sub

End Class
namespace WinClassSampleCs
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
  }
}
リスト1 Windowsフォームの部分クラス(上:Form1.Designer.vb、下:Form1.cs)

Windowsフォーム・クラスの継承

 Windowsフォームを継承して作成したクラス(以下、基本フォーム)をさらに継承して、別のWindowsフォーム・クラス(以下、派生フォーム)を定義できる。こうすることで、複数のWindowsフォームの共通機能は継承元の基本フォームにまとめて、それ以外の個別機能だけを継承先の派生フォームに実装すればよくなり、開発効率やメンテナンス性が向上する。

 図2はその継承例である。この例では、基本フォームであるForm1クラスを継承して、派生フォームであるForm2クラスを定義している。

図2 Windowsフォーム(Form1)の継承による別のWindowsフォームの定義(Form2)

Windowsフォーム・クラスの継承手順

 それでは、図2のようなWindowsフォームの継承を行う手順を説明しよう。

 [ソリューション エクスプローラー]でプロジェクト項目を右クリックして、(表示されるコンテキスト・メニューから)[追加]−[新しい項目]メニューを選択する。これにより[新しい項目の追加]ダイアログが表示されるので、図3のように「継承されたフォーム」という項目を選択して[追加]ボタンをクリックする。すると、[継承ピッカー]ダイアログが表示されるので、継承元のWindowsフォーム・クラス(この例では「Form1」)を選択する。

[追加]ボタンをクリック
図3 派生フォーム用のWindowsフォーム・クラス・ファイルの追加

 この手順により、派生フォームとなるWindowsフォーム・クラスのファイルが、プロジェクトに追加される。

フォーム・デザインの継承

 Form1クラス(基本フォーム)を継承したForm2クラス(派生フォーム)がプロジェクトに追加されたら、Windowsフォーム・デザイナを用いてForm1クラスとForm2クラスにButtonコントロールを配置してビルドを実行すると、Form1クラスに配置したButtonコントロールはForm2クラスにも継承される。

 図4はその例である。左がForm1クラスで、右がForm2クラスのフォーム・デザインだ。Form2クラスには、Form1に配置したButtonコントロールが表示されている。

図4 Windowsフォーム・デザインの継承(左:Form1クラス、右:Form2クラス)

 このようにWindowsフォーム・クラスを継承することで、フォーム・デザインも継承できる。この機能をうまく活用すれば、フォーム間でのデザインの共通化が実現しやすい。

ロジックの継承

 Windowsフォーム・クラスを継承した場合、フォーム・デザインだけではなく、クラスの中に記述したロジックも継承される。

 実証するために、継承元のForm1クラスのButtonコントロールのClickイベントに対するイベント・プロシージャを定義してみよう(リスト2参照)。

Public Class Form1

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    MessageBox.Show("Form1のButton")
  End Sub
End Class
namespace WinClassSampleCs
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MessageBox.Show("Form1のButton");
    }
  }
}
リスト2 継承元クラスにイベント・プロシージャを定義した例(上:Form1.vb、下:Form1.cs)

 そして、スタートアップ・フォームをForm2クラスに切り替えて、Windowsアプリケーションを実行してみよう。すると、Form2イベント・プロシージャを記述していないにもかかわらず、図5のように、ボタンをクリックすればメッセージボックスが表示される。これは、Form2クラスにForm1クラスのロジックが継承されたためだ。

[Button1]ボタンをクリック
図5 ロジックが継承された例

 次のページでは、このWindowsフォームの継承をさらに突き進め、クラス・ライブラリ化して共有資産にする方法を説明する。


 INDEX
  [連載]Windowsフォーム開発入門【Visual Studio 2010対応】
  独自Windowsフォーム・クラスの活用
  1.Windowsフォーム・クラスの継承
    2.Windowsフォーム・クラス・ライブラリの継承

インデックス・ページヘ  「Windowsフォーム開発入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH