フォームを1つしか表示させないようにする方法を調べていると、次のサイトに説明がありました。
フォームが一つしか表示されないようにする: .NET Tips: C#, VB.NET
フォームを静的プロパティ、シングルトンを使って保持する
静的プロパティ、シングルトンを使うと実現はできますが、フォーム毎にそのコードを書く必要があり、メンテナンス性が低下します。
シングルトンを使った場合、フォームを閉じる処理でフォームを閉じるのではなく、フォームを隠す必要があるようです。
閉じる処理が、本来とは別の処理になってしまうので良くないですね。
新しい方法「Application.OpenForms」を使う
メンテナンス性が良く、言語に依存しない形を探した所、Application.OpenForms
が有力だったのでそれで実装してみました。
Application.OpenForms
は、インスタンス化されているフォームを取得することができます。
コード説明
Application.OpenForms
を使用して表示させたいフォームがインスタンス化されているかを判断します。
インスタンス化されていればそのまま表示し、なければ新規でインスタンス化しフォームを表示させます。
フォームをForm.Hide
で隠していたとしても、インスタンスとしてまだ存在しており、Application.OpenForms
で取得できるので、そのままフォームを表示させます。
C#
public static void ShowOnlyOneForm(Type formType) { Form openForm = Application.OpenForms[formType.Name]; if (openForm == null) { Form form = (Form)Activator.CreateInstance(formType); form.Show(); } else openForm.Show(); }
VB
Public Shared Sub ShowOnlyOneForm(formType As Type) Dim openForm As Form = Application.OpenForms(formType.Name) If openForm Is Nothing Then DirectCast(Activator.CreateInstance(formType), Form).Show() Else openForm.Show() End If End Sub