ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
【VB.NET】Visual Studio いろいろ ( No.0 )
日時: 2008/06/22 23:23
名前: lightbox



※ あまり役に立たないかもしれない知識



これによって作成される ApplicationEvents.vb でダイアログを表示すると、
メインのフォームが表示される前にプログラムの開始を選択できます

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
				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
ここでは、親フォームが存在しないので、呼び出しに Me を指定しません
Dim ret As DialogResult = MyDialog.ShowDialog()
ダイアログの定義は以下のようになっており、フォーム内から呼び出した時とそうで無い場合を判断しています
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
フォームの定義は以下のようになっています
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
※ フォームが表示される前に終了します。
※ デバッグ構成の場合は、フォームデザイナが使用できますが、リリース構成ではコード表示しかされません
※ OnCreateControl も最後に実行されます( コンストラクタ->Load->OnCreateControl )
※ コンストラクタで呼び出されたダイアログは、親フォームを Object で参照しているので
  TextBox1 と TextBox2 は、Public で定義しています( 通常 Friend )
  ( これは、コード記述時に、親フォームのクラスを特定でき無いが、フィールド名は決まっているという使い方 )
ちなみに、#If のせいで以下のような警告が出ます
名前空間またはクラス定義が、ファイル "Form1.vb" の条件付きコンパイル ディレクティブ内で見つかりました。
これは、リソース "Form1.resx" のマニフェスト リソース名に対して不適切な選択を導く可能性があります。
※ Partial が多い場合に手動で変えればいいんですが。