Sugi@ぱぱんぶぃびぃ Blog

VBとかVB.NETとかVB2005とか・・・

AILight Banner
AILight Blog

プロフィール

Sugi@ぱぱんぶぃびぃ Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

VB2005: [続]VB2005のWinFormのデフォルトコンストラクタ

かなり久しぶりの書き込みになります。(^^;

以前、VB2005のフォームデザイナが自動生成するコードのデフォルトコンストラクタの定義の仕方が気にいらないという記事を書いたことがありました。
Beta2ではこの部分が変更されています。

以下がVB2005のフォームデザイナが作成した最もシンプルなWinFormのコードの内容です。

[ Form1.vb ]
Public Class Form1

End Class

[ Form1.Designer.vb ]
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Public Class Form1
    Inherits System.Windows.Forms.Form

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

    Private components As System.ComponentModel.IContainer

    <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

Beta1ではPartialクラスに定義されたデフォルトコンストラクタでInitalizeComponentメソッドが実行され、
フォームおよびコントロールの初期化がおこなわれていました。

しかしBeta2のコードにはデフォルトコンストラクタの存在はなく、InitializeComponentメソッドのみ定義されています。
見た目ではInitializeComponentはどこからも呼ばれていない状態です。

ここでこのプロジェクトをビルドし、ILDASMによりILを確認してみたところ、
以下のように確かにデフォルトコンストラクタ内で、InitializeComponentが実行されています。

.method public specialname rtspecialname
        instance void  .ctor() cil managed
{
  .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       13 (0xd)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
  IL_0006:  ldarg.0
  IL_0007:  callvirt   instance void WindowsApplication1.Form1::InitializeComponent()
  IL_000c:  ret
} // end of method Form1::.ctor

で、いったいこのデフォルトコンストラクタはどこにあるのか?と探してみましたが、どうってことはない、Formクラスに Microsoft.VisualBasic.CompilerServices.DesignerGenerated 属性が与えてやると、VBコンパイラがデフォルトコンストラクタが省略されている場合に限り、コンパイラが InitializeComponent メソッドを実行するデフォルトコンストラクタを自動挿入するという仕組みのようです。

確認のため、IDEを使用せずに以下のようにシンプルなWindowsアプリケーションのコードを作成し、Application1.vb として保存して

Namespace Application1

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

        Private Sub InitializeComponent()
            Me.Name = "Form1"
            Me.Text = "Form1"
        End Sub

    End Class

    Public Class App
        Public Shared Sub Main()
            Dim mainForm As New Form1
            System.Windows.Forms.Application.Run(mainForm)
        End Sub
    End Class

End Namespace

VBC /t:winexe Application.vb

のようにコンパイルしてみてください。

できたApplication1.exeを実行してみると、Form1とタイトルバーに表示されたフォームが表示されることから、InitializeComponentメソッドを通っていることが確認できます。

完全に見せなくしちゃっうのも方法の1つかもしれないけど、見た目のつじつまがあわなくなるのも考え物かと。
これからVBをはじめる人にはコンストラクタの存在を隠し、InitializeComponentは勝手に実行されるものと認識させるの?

ちなみにIDEのエディタにて フォームおよびその Partial クラス内で Public Sub New と入力し、エンターキーを押すと、

Public Sub New()
    ' この呼び出しは、Windows フォーム デザイナで必要です。
    InitializeComponent()
    ' InitializeComponent() 呼び出しの後で初期化を追加します。
End Sub

というコードをエディタが自動挿入してくれます。

投稿日時 : 2005年6月30日 0:04


コメントを追加

#  [Visual Basic]VB2005のフォームにはコンストラクタがない?! 2006年6月27日 23:59 Yamaki

Visual Basic 2005で、フォームのコンストラクタに処理を書こうと思ったのですがコンストラクタがどこにもありません。.Designer.vbファイル(Partialクラス部分)のほうにもないのです。
タイトル
名前
URL
コメント