佐々木屋

技術的なことから趣味まで色々書きます

フォームの表示切替

フォームの表示方法でShowDialog(Show)メソッドによって実現していますが、Form1を閉じてForm2を開くような画面変遷を兼ねている場合、呼び出し元であるForm1を閉じずにHideメソッドで隠しておく必要があります。

Form2 f = new Form2();
f.Show();
this.Hide();

問題はForm2を閉じる時、再度Form1を開く作業が必要であるということです。また、不意にForm1を開く前にForm2が閉じてしまうと、アプリケーションが終了せずプロセスに残り続ける状態になってしまいます。

これを簡単に回避するには、メインフォームを切り替える方法があります。

Form1がメインフォームの場合は、Form2を閉じてもForm1を閉じない限りアプリケーションは終了しませんし、Form2が開いた状態でもForm1を閉じると全てのフォームが終了してアプリケーションが終了します。
メインフォームをForm2へ切り替えれば、Form1を閉じてもアプリケーションが終了することはありません。


そもそもWindowsフォームアプリケーションは、エントリポイントでApplication.Runに指定されたフォームが閉じられるとアプケーションが終了する仕組みになっています。これをApplicationContextに変更してあげると、ApplicationContextのMainFormプロパティに設定されたフォームが閉じたときにアプリケーションが終了するようになります。

つまり、MainFormプロパティをフォームを開く前に変更してあげれば、メインフォームを移動することができ、安全に呼び出し元のフォームを閉じることが可能となります。

まず、エントリポイントを以下の様に変更します。

public static ApplicationContext mainFormContext;

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    mainFormContext = new ApplicationContext();
    mainFormContext.MainForm = new Form1();
    Application.Run(mainFormContext);
}
Public mainFormContext As ApplicationContext
    
<STAThread()>
Sub Main()
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)

    mainFormContext = New ApplicationContext
    mainFormContext.MainForm = New Fomr1
    Application.Run(mainFormContext)
End Sub



これによってForm1がApplicationContextクラスのメインフォームとなりました。
後は、フォームを切り替える時にApplicationContextクラスのメインフォームを置き換える処理を入れます。

mainFormContext.MainForm = new Form2();
mainFormContext.MainForm.Show();
this.Close();
mainFormContext.MainForm = New Form2
mainFormContext.MainForm.Show()
Me.Close()


一方通行のような場合はこの方法が有用で、各インスタンスの管理をする必要もなくなります。