例えば、アプリケーション開始時にログインダイアログを表示し、それからメインフォームを表示させたいというように、フォームを連続して表示する方法を考えてみます。
「アプリケーション開始時のフォームを非表示にする」と「フォームにOKボタン、キャンセルボタンを付ける」を使えば、メインフォームを表示する前にダイアログを表示することができます。
一つ例を示します。メインフォーム「Form1」を表示する前にログインダイアログ「LoginForm」を表示して、ShowDialogメソッドがDialogResult.OKを返した場合にのみメインフォームを表示するようにしています。以下のコードがよく分からないという場合は、「アプリケーション開始時のフォームを非表示にする」と「フォームにOKボタン、キャンセルボタンを付ける」をご覧ください。
''' <summary> ''' アプリケーションのメイン エントリ ポイントです。 ''' </summary> <STAThread()> _ Shared Sub Main() Dim res As DialogResult 'ログインダイアログを表示 Dim f1 As New LoginForm res = f1.ShowDialog() f1.Dispose() 'ログインに成功していればメインフォームを表示 If res = System.Windows.Forms.DialogResult.OK Then Application.Run(New Form1) End If End Sub
/// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { DialogResult res; //ログインダイアログを表示 LoginForm f1 = new LoginForm(); res = f1.ShowDialog(); f1.Dispose(); //ログインに成功していればメインフォームを表示 if (res == DialogResult.OK) { Application.Run(new Form1()); } }
Application.Runメソッドのパラメータに指定されたフォームが閉じられると、アプリケーションは終了します。同様に、Application.RunメソッドのパラメータにApplicationContextを指定すると、そのMainFormプロパティに指定されたフォームが閉じられた時に、アプリケーションが終了します。よって、ApplicationContext.MainFormに指定されているフォームが閉じられる時に、つぎに開くフォームをApplicationContext.MainFormに指定すれば、メインフォームを次々と入れ替えて表示することができます。
以下にその例を示します。ここでははじめにForm1を表示し、Form1が閉じられてからForm2を開いています。エントリポイント等の意味が分からなければ、まずこちらをご覧ください。
注意:.NET Framework 2.0以降では、FormクラスのClosing、Closedイベントの代わりに、FormClosing、FormClosedイベントを使用してください。
Private Shared mainApplicationContext As ApplicationContext ''' <summary> ''' アプリケーションのメイン エントリ ポイントです。 ''' </summary> <STAThread()> _ Shared Sub Main() mainApplicationContext = New ApplicationContext 'はじめに開くフォーム Dim f As New Form1 AddHandler f.Closed, AddressOf f_Closed 'メインフォームに設定する mainApplicationContext.MainForm = f 'メッセージループを開始し、メインフォームを表示 Application.Run(mainApplicationContext) End Sub Private Shared Sub f_Closed( _ ByVal sender As Object, ByVal e As EventArgs) 'つぎに開くフォーム Dim f As New Form2 'メインフォームに設定する mainApplicationContext.MainForm = f 'フォームを表示 f.Show() End Sub
private static ApplicationContext mainApplicationContext; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { mainApplicationContext = new ApplicationContext(); //はじめに開くフォーム Form1 f = new Form1(); f.Closed += new EventHandler(f_Closed); //メインフォームに設定する mainApplicationContext.MainForm = f; //メッセージループを開始し、メインフォームを表示 Application.Run(mainApplicationContext); } private static void f_Closed(object sender, EventArgs e) { //つぎに開くフォーム Form2 f = new Form2(); //メインフォームに設定する mainApplicationContext.MainForm = f; //フォームを表示 f.Show(); }
補足:.NET Framework 2.0以降のVB.NETでは、My.Application.ApplicationContextプロパティにより、アプリケーションの現在のスレッドのApplicationContextを取得できます。
ApplicationContextクラスを継承したクラスを作成することにより、上記と同じことをするには、次のようにします。
Public Class Form1 Inherits System.Windows.Forms.Form ''' <summary> ''' アプリケーションのメイン エントリ ポイントです。 ''' </summary> <STAThread()> _ Shared Sub Main() 'メッセージループを開始し、メインフォームを表示 Application.Run(New MyApplicationContext) End Sub '省略... End Class Public Class MyApplicationContext Inherits ApplicationContext Public Sub New() 'はじめに開くフォーム Dim f1 As New Form1 AddHandler f1.Closed, AddressOf f1_Closed 'メインフォームに設定する Me.MainForm = f1 End Sub Private Sub f1_Closed( _ ByVal sender As Object, ByVal e As EventArgs) 'つぎに開くフォーム Dim f2 As New Form2 'メインフォームに設定する Me.MainForm = f2 'フォームを表示 f2.Show() End Sub End Class
public class Form1 : System.Windows.Forms.Form { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { //メッセージループを開始し、メインフォームを表示 Application.Run(new MyApplicationContext()); } //省略... } public class MyApplicationContext : ApplicationContext { public MyApplicationContext() { //はじめに開くフォーム Form1 f1 = new Form1(); f1.Closed += new EventHandler(f1_Closed); //メインフォームに設定する this.MainForm = f1; } private void f1_Closed(object sender, EventArgs e) { //つぎに開くフォーム Form2 f2 = new Form2(); //メインフォームに設定する this.MainForm = f2; //フォームを表示 f2.Show(); } }
なお最後のフォームだけをメインフォームとするならば、最後のフォームのMainFormプロパティだけを設定すればOKです(はじめのフォームをShowメソッドなどで表示させる必要があります)。
Visual Studio 2005以降のVB.NETでは、Visual Basicアプリケーションモデルを使用した方法も考えられます。
以下にその手順を示します。
'Form1のFormClosedイベントハンドラ Private Sub Form1_FormClosed(ByVal sender As Object, _ ByVal e As System.Windows.Forms.FormClosedEventArgs) _ Handles Me.FormClosed 'Fomr2を表示する Dim f As New Form2 f.Show() End Sub