例えば、Windowsの「メモ帳」で検索する時に表示される「検索ダイアログ」はモードレスですが、メインウィンドウの後ろに隠れることはありません。このように、モードレスダイアログがメインフォームの後ろに隠れないようにするには、そのダイアログをメインフォームが所有するようにします。
.NET Framework 2.0からは、Showメソッドでダイアログを表示させる時に、所有者となるフォームを指定することができます。
以下のコードはフォームクラスに書かれているものとして、自分のフォームに隠れないようにForm1をモードレスで表示しています。
'表示させるフォームのインスタンスを作成 Dim f As New Form1() '自分を所有者としてForm1をモードレスで表示する f.Show(Me)
//表示させるフォームのインスタンスを作成 Form1 f = new Form1(); //自分を所有者としてForm1をモードレスで表示する f.Show(this);
.NET Framework 1.1以前や、すでに表示されているモードレスダイアログを所有する場合は、AddOwnedFormメソッドやOwnerプロパティを使います。
'表示させるフォームのインスタンスを作成 Dim f As New Form1() 'Form1を所有する Me.AddOwnedForm(f) 'または次のようにする 'f.Owner = Me 'Form1をモードレスで表示する f.Show()
//表示させるフォームのインスタンスを作成 Form1 f = new Form1(); //Form1を所有する this.AddOwnedForm(f); //または次のようにする //f.Owner = this; //Form1をモードレスで表示する f.Show();
なお、フォームの所有について「Form.AddOwnedForm メソッド」には、次のように書かれています。
「フォームが別のフォームによって所有されている場合は、所有している側のフォームと連動して最小化したり閉じたりします。たとえば、Form2 がフォーム Form1 に所有されている場合、 Form1 が閉じられるか最小化されると、 Form2 も閉じられるか最小化されます。また、所有される側のフォームを所有する側のフォームの背面に表示することはできません。所有されているフォームは、検索ウィンドウや置換ウィンドウなど、所有側のフォームが選択されているときにその背面に表示できないようにするウィンドウに使用できます。」
所有を解除したいときは、RemoveOwnedFormメソッドを使用するか、OwnerプロパティにNothing(C#では、null)を設定します。
If Not Me.Owner Is Nothing Then 'フォームの所有を解除する Me.Owner.RemoveOwnedForm(Me) 'または次のようにする 'Me.Owner = Nothing End If
if (this.Owner != null) { //フォームの所有を解除する this.Owner.RemoveOwnedForm(this); //または次のようにする //this.Owner = null; }
あるフォームが所有しているフォームは、Form.OwnedFormsプロパティで取得できます。OwnedFormsプロパティはフォームの配列を返します。
'所有しているフォームのTextを列挙する Dim f As Form For Each f In Me.OwnedForms Console.WriteLine(f.Text) Next
//所有しているフォームのTextを列挙する foreach (Form f in this.OwnedForms) { Console.WriteLine(f.Text); }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。