DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォームを連続して表示する

例えば、アプリケーション開始時にログインダイアログを表示し、それからメインフォームを表示させたいというように、フォームを連続して表示する方法を考えてみます。

メインフォームを表示する前にダイアログを表示する

アプリケーション開始時のフォームを非表示にする」と「フォームにOKボタン、キャンセルボタンを付ける」を使えば、メインフォームを表示する前にダイアログを表示することができます。

一つ例を示します。メインフォーム「Form1」を表示する前にログインダイアログ「LoginForm」を表示して、ShowDialogメソッドがDialogResult.OKを返した場合にのみメインフォームを表示するようにしています。以下のコードがよく分からないという場合は、「アプリケーション開始時のフォームを非表示にする」と「フォームにOKボタン、キャンセルボタンを付ける」をご覧ください。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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イベントを使用してください。
VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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クラスを継承したクラスを作成することにより、上記と同じことをするには、次のようにします。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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アプリケーションモデルを使用する方法

Visual Studio 2005以降のVB.NETでは、Visual Basicアプリケーションモデルを使用した方法も考えられます。

以下にその手順を示します。

  1. メニューの「プロジェクト」-「プロパティ」により、プロジェクトのプロパティを表示します。
  2. 「アプリケーション」タブを選択します(デフォルトで選択されています)。
  3. 「アプリケーションフレームワークを有効にする」にチェックを入れ、有効にします。
  4. 「Windowsアプリケーションフレームワークプロパティ」の「シャットダウンモード」を「最後のフォームが閉じるとき」にします。
  5. Form1、Form2と連続してフォームを表示するには、次のようなコードを書きます。Form1が閉じられたときに、Form2を表示しています。なおこのコードは、Form1クラスに書かれているものとします。
    VB.NET
    コードを隠すコードを選択
    '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
    
  • 履歴:
  • 2007/2/6 Visual Basicアプリケーションモデルを使用する方法を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。