連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 07 Windowsアプリケーションの構造

株式会社ピーデー 川俣 晶
2004/05/13
Page1 Page2 Page3

 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
 
フォームデザイナによって生成されたコード

 前節で紹介した、リスト7-5の中で「Windowsフォームデザイナで生成されたコード」というメッセージについて触れた。この部分のソース・コードに、フォームのデザインが何か関係していることは容易に推測できるだろう。では、Windowsアプリケーションのプロジェクトを作成した後、デザイン作業を何も行わない状態のとき、ソース・コードはどんな内容になっているのだろうか。「Windowsフォームデザイナで生成されたコード」と書かれた行の左側に見える四角に囲まれた「+」記号をクリックして、すべてのコードを見てみよう。

 1: Public Class Form1
 2:   Inherits System.Windows.Forms.Form
 3:
 4: #Region " Windows フォーム デザイナで生成されたコード "
 5:
 6:   Public Sub New()
 7:     MyBase.New()
 8:
 9:     ' この呼び出しは Windows フォーム デザイナで必要です。
10:     InitializeComponent()
11:
12:     ' InitializeComponent() 呼び出しの後に初期化を追加します。
13:
14:   End Sub
15:
16:   ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
17:   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
18:     If disposing Then
19:       If Not (components Is Nothing) Then
20:         components.Dispose()
21:       End If
22:     End If
23:     MyBase.Dispose(disposing)
24:   End Sub
25:
26:   ' Windows フォーム デザイナで必要です。
27:   Private components As System.ComponentModel.IContainer
28:
29:   ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
30:   'Windows フォーム デザイナを使って変更してください。
31:   ' コード エディタを使って変更しないでください。
32:   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
33:     '
34:     'Form1
35:     '
36:     Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
37:     Me.ClientSize = New System.Drawing.Size(292, 273)
38:     Me.Name = "Form1"
39:     Me.Text = "Form1"
40:
41:   End Sub
42:
43: #End Region
44:
45:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
46:
47:   End Sub
48: End Class
リスト7-8 VB.NETでのソースコード全文(Visual Studio .NET 2003でのもの。 2002の場合は少し異なるが基本的には同じである)

 何もしない時点で、すでに39行ものボリュームのあるコードが存在している。

 このコードの内容をざっと解説しよう。まず、1行目はクラスの宣言の開始を示している。つまり、このソース全体が1つのクラスの定義となっている。VB 6では、フォームはフォーム・モジュールであり、クラス・モジュールとは別のものであった。だが、VB.NETではフォームもクラスの一種である。というより、ほとんどすべての情報はクラスで記述されていると思って間違いないだろう。例外として、構造体やモジュールが存在するが、構造体はクラスに似た存在である。

 2行目は、このクラスがSystem.Windows.Forms.Formクラスを継承していることを示している。つまり、このクラス内では、System.Windows.Forms.Formクラスから継承した機能も利用できるということである(継承については、継承とポリモーフィズムを参照)

 4行目は、43行目とペアとなり、ソース・コードの範囲を指定している。これは領域ディレクティブと呼ばれるもので、実行時には何の効力も持たず、単にソース・コードの見やすさを高める働きしか持っていない。#Regionと#End Regionで囲まれた範囲は、VS.NETのコード・エディタ上で、容易に隠したり見せたりすることができる。リスト7-5で、ソースの一部が隠れて表示されているのは、#Regionと#End Regionの働きである(領域ディレクティブ(本連載Chapter 16で公開予定)を参照)。

 6〜14行目は、このクラスのインスタンスが生成されるときに呼び出されるコンストラクタである。7行目で、スーパークラスのコンストラクタを呼び出し、次に、32行目以降のInitializeComponentメソッドを呼び出している。12行目のコメントは、コンストラクタに追加すべきコードがあればここに書き込め、という意図を説明している。ただし、初期化はフォームのLoadイベントに書き込む手段もあるので、どちらがよいかはケースバイケースで判断する必要があるだろう。Loadイベントはすべての初期化が終了したあとで発生するため、よく分からなければ、Loadイベントを使う方が安全だろう。

 16〜24行目は、DisposeパターンのためのDisposeメソッドである(Disposeパターンを参照)。Disposeメソッドは、オブジェクトを使い終わったときに呼び出されるメソッドだが、フォームが閉じるときに呼び出されるClosedイベントやClosingイベントもあるので、Disposeメソッドを書き換える必要はないだろう。Disposeメソッド内には、特に書き換えるべき場所もソース中でコメント指定されていないので、その意味でも書き換えない方が安全だろう。

 26〜27行目は、コンポーネントモデルのコンテナのインターフェイスを保持する変数だが、そのことを意識する必要はめったにないだろう。コメントに述べられているとおり、Windowsフォームデザイナで必要とされているので、削除したり書き換えたりしないようにしよう。

 29〜41行目は、コンストラクタから呼び出されていたInitializeComponentメソッドの本体である。コメントとして注意書きされているように、これはWindowsフォームデザイナでフォームのデザインを変更すると、それに応じて自動的に書き換えられるものである。つまり、手動でソースを書き直すのではなく、Windowsフォームデザイナで変更すべきものである。32行目の先頭に書かれているのは属性と呼ばれるもので、このメソッド内ではデバッガが停止しないことを指定している(属性については、属性(本連載Chapter 14で公開予定)を参照)。

 さて、InitializeComponentメソッドの内容だが、中身はたったの4行しかない。この4行は、Meすなわちフォーム自身のインスタンスのプロパティに、値を設定している。36行目のAutoScaleBaseSizeプロパティは、フォームを自動スケールするときに使用する基本サイズを指定するものである。これは通常、プログラマーが意識する必要のないもので、フォームデザイナのプロパティ・ウィンドウから入力できない。37行目のClientSizeは、フォームのクライアント領域のサイズを示すプロパティである。これは、フォームデザイナのプロパティ・ウィンドウから入力できず、フォームのサイズが反映される。これらのプロパティの値として、System.Drawing.Sizeという型のデータが生成されて代入されているが、これは縦横のサイズの持つ構造体である(構造体については、構造体宣言を参照)。37行目のNameプロパティは、フォームデザイナのプロパティ・ウィンドウから入力できるが、これは特殊な扱いで、フォームのクラス名と連動して同じ値が設定される。39行目は、Textプロパティに"Form1"という値を設定している。ほかの多くのプロパティなどは、クラスが持っている初期値が指定されたことになっているので、ここには設定の代入文は見えない。しかし、Textプロパティは指定された初期値の代入が生成されている。その理由は、Textプロパティの初期値はフォームのクラス名と同じであり、フォームのクラス名は生成される段階で決まり、一定していないためである。もし、Form2という名前のフォームを作れば、この代入文は「Me.Text = "Form2"」でなければならない。

プロパティ値の設定により変化するコード

 では、Windowsフォームデザイナでの修正がソース・コードに反映されるのを確認するために、いくつかのプロパティ値を設定してみよう。まず、Textプロパティを「"VB.NET Sample"」という値に書き換え、次にBackColorプロパティを黄色に変えてみた(図7-9)。

●図7-9 VB.NETでフォームのTextプロパティとBackColorプロパティを変更

 この変更後に、InitializeComponentメソッドは以下のように変化した。

 1: ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
 2: 'Windows フォーム デザイナを使って変更してください。
 3: ' コード エディタを使って変更しないでください。
 4: <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
 5:   '
 6:   'Form1
 7:   '
 8:   Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
 9:   Me.BackColor = System.Drawing.Color.Yellow
10:   Me.ClientSize = New System.Drawing.Size(292, 273)
11:   Me.Name = "Form1"
12:   Me.Text = "VB.NET Sample"
13:
14: End Sub
リスト7-10 InitializeComponentメソッドの内容(Visual Studio .NET 2003でのもの。 2002の場合は少し異なるが基本的には同じである)

 Textプロパティの変更は、12行目にはっきりと反映されている。BackColorプロパティの変更は、9行目に反映されている。System.Drawing.Color.Yellowは名前による色指定である。System.Drawing.Color構造体は、共有プロパティ(Sharedな定数値)をいくつも持っていて、それぞれに色の名前が付いている。Yellowもその1つである。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 07 Windowsアプリケーションの構造
    1.単純なWindowsアプリケーション
  2.フォームデザイナによって生成されたコード/プロパティ値の設定により変化するコード
    3.ボタンの配置により生成されるコード
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


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