.NET Framework 2.0以降では、Application.OpenFormsプロパティにより、アプリケーションで開いているすべてのフォームを取得できます。VB.NETでは、My.Application.OpenFormsプロパティでも可能です。
'現在開いているすべてのフォームのタイトルを取得する For Each f As Form In My.Application.OpenForms Console.WriteLine(f.Text) Next
//現在開いているすべてのフォームのタイトルを取得する foreach (Form f in Application.OpenForms) { Console.WriteLine(f.Text); }
VB6のFormsコレクションに相当するものは.NET Framework 1.1以前では用意されていませんし、フォームオブジェクト専用のコレクションもありません。
「マイクロソフト サポート技術情報 - 308537」の「[HOW TO] Visual Basic .NET で Forms コレクションを作成する方法」では、カスタムのFormsコレクションを作成する方法が紹介されています。
しかしここで紹介されているクラスでは、インデックスを指定してオブジェクトを取得できず、不便です。
そこで、インデックスを指定してオブジェクトを取得できるようにし、さらにInsert、IndexOf、Containsメソッドを追加したコレクションクラスを以下に紹介します。
''' <summary> ''' フォームのコレクション ''' </summary> Public Class FormCollection Inherits CollectionBase ''' <summary> ''' インデクサ ''' </summary> Default Public Property Item(ByVal index As Integer) As Form Get Return CType(List(index), Form) End Get Set(ByVal Value As Form) List(index) = value End Set End Property ''' <summary> ''' コレクションにフォームを追加する ''' </summary> ''' <param name="frm">追加するフォーム</param> ''' <returns>追加された位置</returns> Public Function Add(ByVal frm As Form) As Integer Return List.Add(frm) End Function ''' <summary> ''' コレクションからフォームを削除する ''' </summary> ''' <param name="frm">削除するフォーム</param> Public Sub Remove(ByVal frm As Form) List.Remove(frm) End Sub ''' <summary> ''' コレクションにフォームを挿入する ''' </summary> ''' <param name="index">挿入する位置</param> ''' <param name="frm">挿入するフォーム</param> Public Sub Insert(ByVal index As Integer, ByVal frm As Form) List.Insert(index, frm) End Sub ''' <summary> ''' フォームのインデックスを調べる ''' </summary> ''' <param name="frm">検索するフォーム</param> ''' <returns>フォームのインデックス</returns> Public Function IndexOf(ByVal frm As Form) As Integer Return List.IndexOf(frm) End Function ''' <summary> ''' コレクションにフォームが格納されているか調べる ''' </summary> ''' <param name="frm">検索するフォーム</param> ''' <returns>コレクションに格納されている時はtrue</returns> Public Function Contains(ByVal frm As Form) As Boolean Return List.Contains(frm) End Function End Class
/// <summary> /// フォームのコレクション /// </summary> public class FormCollection : CollectionBase { /// <summary> /// インデクサ /// </summary> public Form this[int index] { get { return (Form) List[index]; } set { List[index] = value; } } /// <summary> /// コレクションにフォームを追加する /// </summary> /// <param name="frm">追加するフォーム</param> /// <returns>追加された位置</returns> public int Add(Form frm) { return List.Add(frm); } /// <summary> /// コレクションからフォームを削除する /// </summary> /// <param name="frm">削除するフォーム</param> public void Remove(Form frm) { List.Remove(frm); } /// <summary> /// コレクションにフォームを挿入する /// </summary> /// <param name="index">挿入する位置</param> /// <param name="frm">挿入するフォーム</param> public void Insert(int index, Form frm) { List.Insert(index, frm); } /// <summary> /// フォームのインデックスを調べる /// </summary> /// <param name="frm">検索するフォーム</param> /// <returns>フォームのインデックス</returns> public int IndexOf(Form frm) { return List.IndexOf(frm); } /// <summary> /// コレクションにフォームが格納されているか調べる /// </summary> /// <param name="frm">検索するフォーム</param> /// <returns>コレクションに格納されている時はtrue</returns> public bool Contains(Form frm) { return List.Contains(frm); } }
このコレクションの使い方は、例えば次のような感じです。
'Dim _forms As New FormCollection 'というフィールドが宣言されているものとする 'Form1オブジェクトを作成 Dim f As New Form1 'コレクションに追加する _forms.Add(f) 'インデックス0のフォームを表示する _forms(0).ShowDialog()
//FormCollection _forms = new FormCollection(); //というフィールドが宣言されているものとする //Form1オブジェクトを作成 Form1 f = new Form1(); //コレクションに追加する _forms.Add(f); //インデックス0のフォームを表示する _forms[0].ShowDialog()
なお、このフォームコレクションには、開かれたフォームが自動的に追加されたり、閉じられたフォームが自動的に削除される機能がありません。これらの処理は自分で行う必要があります。
(この記事は「.NETプログラミング研究 第27号」で紹介したものです。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。