- PR -

VB.NET MDIChildFormの判別方法

1
投稿者投稿内容
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 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
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-10 13:53
比較演算子の「TypeOf〜Is」演算子を使うのはどうですか?
使い方はリンク先を参照してください。

#他にも良い方法があるかもしれませんが……。
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 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も表示させたくない)

やっぱり地道に変数を用意して判定するのがてっとり
早くわかりやすいのかな?
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-10 15:10
引用:

ヤマザキさんの書き込み (2004-05-10 14:20) より:

しかしながら、frmChild1 が非アクティブになったら
(frmChild2 の下に隠れる)意味がなくなることに
今更ながら気がつきました(泣)


実のところ Me.ActiveMdiChild を見かけた時点で、多分そうなるだろうとは思っていましたが

私はMDIのプログラムに触っていませんので試していませんが、Form.MdiChildren プロパティを使ってみるとか……は、どうでしょう。
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 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
投稿数: 22
投稿日時: 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 で配列走査したかった割には、
なんか幼稚な気もしますが、レベルアップするまで
これでいこうと思います。

ぢゃん♪様 色々ありがとうございました。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-10 16:13
引用:

ヤマザキさんの書き込み (2004-05-10 15:58) より:

コード:
If System.Array.IndexOf(Me.MdiChildren, frm) < 0 Then




ああ、やっぱりこうしちゃいましたか……。

IndexOfで探せるのは、同一と判断される(Equalsの結果がTrueになる)内容のものです。
TypeOf比較演算のような、型での検索(比較)はされないと思います。

Formなら、ウィンドウのインスタンス(frmという変数に入っているインスタンス)でしょう。
ですから、MDIとして登録する前はMdiChildrenプロパティのリストに入っていないはずであり、探せないのも当然といえます。

配列から特定型を検索したい場合のbestやbetterな方法は思いつきませんが、たとえばMdiChildrenプロパティ(配列)をloopで調べるとか……。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-10 16:18 ]

<追記>
本返信を書き込んでいるうちに解決していたようですね。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-10 16:43 ]
1

スキルアップ/キャリアアップ(JOB@IT)