コメント |
※ あまり役に立たないかもしれない知識
http://lightbox.on.coocan.jp/image/ApplicationEvents.png
これによって作成される [[ApplicationEvents.vb]] でダイアログを表示すると、
メインのフォームが表示される前にプログラムの開始を選択できます
@DIV
Namespace My
Partial Friend Class MyApplication
' ********************************************************
' スタートアップ
' ********************************************************
Private Sub MyApplication_Startup(ByVal sender As Object, _
ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
Dim MyDialog As New LoginForm1()
Dim ret As DialogResult = MyDialog.ShowDialog()
MyDialog.Dispose()
If ret = DialogResult.Cancel Then
@C:red(e.Cancel = True)
End If
End Sub
' ********************************************************
' シャットダウン
' ********************************************************
Private Sub MyApplication_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown
End Sub
End Class
End Namespace
@END
@C:green(ここでは、親フォームが存在しないので、呼び出しに Me を指定しません)
@DIV
Dim ret As DialogResult = MyDialog.ShowDialog()
@END
@C:green(ダイアログの定義は以下のようになっており、フォーム内から呼び出した時とそうで無い場合を判断しています)
@DIV
Public Class LoginForm1
Private Sub OK_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles OK.Click
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Close()
End Sub
Private Sub Cancel_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Cancel.Click
Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Close()
End Sub
Private Sub LoginForm1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim myOwner As Object = Me.Owner
If Not Me.Owner Is Nothing Then
Me.UsernameTextBox.Text = myOwner.TextBox1.Text
Me.PasswordTextBox.Text = myOwner.TextBox2.Text
End If
End Sub
End Class
@END
@C:green(フォームの定義は以下のようになっています)
@DIV
Imports System.ComponentModel
#If DEBUG Then
<DesignerCategory("Form")> _
Public Class Form1
#Else
<DesignerCategory("")> _
Public Class Form1
#End If
Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
Dim MyDialog As New LoginForm1()
Dim ret As DialogResult = MyDialog.ShowDialog(Me)
MyDialog.Dispose()
Console.WriteLine("コンストラクタ")
End Sub
Protected Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
Console.WriteLine("OnCreateControl")
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.Dispose()
Console.WriteLine("Load")
End Sub
End Class
@END
@DIV
※ フォームが表示される前に終了します。
※ デバッグ構成の場合は、フォームデザイナが使用できますが、リリース構成ではコード表示しかされません
※ OnCreateControl も最後に実行されます( コンストラクタ->Load->OnCreateControl )
※ コンストラクタで呼び出されたダイアログは、親フォームを Object で参照しているので
TextBox1 と TextBox2 は、Public で定義しています( 通常 Friend )
( これは、コード記述時に、親フォームのクラスを特定でき無いが、フィールド名は決まっているという使い方 )
@END
ちなみに、#If のせいで以下のような警告が出ます
@DIV
名前空間またはクラス定義が、ファイル "Form1.vb" の条件付きコンパイル ディレクティブ内で見つかりました。
これは、リソース "Form1.resx" のマニフェスト リソース名に対して不適切な選択を導く可能性があります。
@END
※ Partial が多い場合に手動で変えればいいんですが。 |