- - PR -
VB.NET MDIChildFormの判別方法
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-10 13:29
初めまして。ヤマともうします。
色々と過去ログ、Tips等を見ていたのですが、 わからない事がでてきまして、皆様のお知恵を拝借できないかと 思い投稿しています。 MDIの親フォームから、数種類の子フォームを表示しようとするとき、 該当する子フォームが表示されているかどうかの判定をしたいのです。 下記の If frmActive Is Nothing Then の箇所でなのですが、 「frmActive に表示させようとするフォームが入っていたら、表示せず、 他のフォームであれば表示したい」という事をしたいのです。 それぞれ子フォーム毎の変数を持って判断すればできると思っているのですが、 どうにかスマートにいきたいのですが。 諸先輩のお知恵をご教授願えれば幸いです。 SampleCode: Public Class frmMain : Private Sub Button1_Click(ByVal .... Dim frmActive = Me.ActiveMdiChild Dim frm As New frmChild1 frm.MdiParent = Me If frmActive Is Nothing Then frm.Show() End If End Sub Private Sub Button2_Click(ByVal .... Dim frmActive = Me.ActiveMdiChild Dim frm As New frmChild2 frm.MdiParent = Me If frmActive Is Nothing Then frm.Show() End If End Sub : End Class | ||||||||
|
投稿日時: 2004-05-10 13:53
比較演算子の「TypeOf〜Is」演算子を使うのはどうですか?
使い方はリンク先を参照してください。 #他にも良い方法があるかもしれませんが……。 | ||||||||
|
投稿日時: 2004-05-10 14:20
ぢゃん♪様
早速のお返事ありがとうございます。 TypeOf演算子、いい感じ?で使用できました。 Private Sub Button1_Click(ByVal .... Dim frmActive = Me.ActiveMdiChild Dim frm As New frmChild1 frm.MdiParent = Me If Not TypeOf frmActive Is frmChild1 Then frm.Show() End If End Sub 以下略・・ しかしながら、frmChild1 が非アクティブになったら (frmChild2 の下に隠れる)意味がなくなることに 今更ながら気がつきました(泣) Button1_Click->frmChild1.show Button2_Click->frmChild2.show (本来はここで、1も2も表示させたくない) やっぱり地道に変数を用意して判定するのがてっとり 早くわかりやすいのかな? | ||||||||
|
投稿日時: 2004-05-10 15:10
実のところ Me.ActiveMdiChild を見かけた時点で、多分そうなるだろうとは思っていましたが 私はMDIのプログラムに触っていませんので試していませんが、Form.MdiChildren プロパティを使ってみるとか……は、どうでしょう。 | ||||||||
|
投稿日時: 2004-05-10 15:58
当のMdiChildrenプロパティも色々試してみようとは
思ったのですが、どうも意図した動作になりません。 Private Sub Button1_Click(ByVal sender ... Dim frm As New frmChild1 If System.Array.IndexOf(Me.MdiChildren, frm) < 0 Then frm.MdiParent = Me frm.Show() Trace.WriteLine(System.Array.IndexOf(Me.MdiChildren, frm)) ' 0,1,2,と加算されて行きます。。。なぜ? End If Me.MdiChildren.IndexOf(???, frm) かもしれないのですが、第1引数に 入れるものがわかりません。 明らかな勉強不足でしょうか。。(汗) ちなみに、ArrayList作成で、親で子フォーム名を「Add」、子で「Remove」で If Not (ar.Contains(frm.Name)) Then では、意図した動作はOKでした。 | ||||||||
|
投稿日時: 2004-05-10 16:12
とりあえず解決?いたしました。
Private fm As Form Private Sub Button1_Click(ByVal sender ... Dim frm As New frmChild1 For Each fm In Me.MdiChildren If fm.Name = frm.Name Then Exit Sub End If Next frm.MdiParent = Me frm.Show() End Sub Private Sub Button2_Click(ByVal sender ... Dim frm As New frmChild2 IndexOf で配列走査したかった割には、 なんか幼稚な気もしますが、レベルアップするまで これでいこうと思います。 ぢゃん♪様 色々ありがとうございました。 | ||||||||
|
投稿日時: 2004-05-10 16:13
ああ、やっぱりこうしちゃいましたか……。 IndexOfで探せるのは、同一と判断される(Equalsの結果がTrueになる)内容のものです。 TypeOf比較演算のような、型での検索(比較)はされないと思います。 Formなら、ウィンドウのインスタンス(frmという変数に入っているインスタンス)でしょう。 ですから、MDIとして登録する前はMdiChildrenプロパティのリストに入っていないはずであり、探せないのも当然といえます。 配列から特定型を検索したい場合のbestやbetterな方法は思いつきませんが、たとえばMdiChildrenプロパティ(配列)をloopで調べるとか……。 [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-10 16:18 ] <追記> 本返信を書き込んでいるうちに解決していたようですね。 [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-10 16:43 ] |
1