- PR -

複数MDI子フォームから1つを選択するには

投稿者投稿内容
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-09 22:06
> 自分のメンバ2つが同じ所指してるのかぁとおもったら、ちょっと気持ち悪かったり^^;
それなら、メンバ変数として参照しつつ Controls で参照しているのは?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-09 22:49
引用:

それなら、メンバ変数として参照しつつ Controls で参照しているのは?


お〜!確かにそうだ…。何言ってんだ自分。

ところで…。
ここで続けていいのか分からないのですが、今回の事でちょっと疑問が生まれました。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconpropertyusageguidelines.asp
プロパティの使用方法ガイドラインというのがあります。
ここに、「メンバが配列を返す場合。配列を返すプロパティは、混乱の原因になる可能性があります。」云々…。
とあるのですが、MdiChildren はもろに配列返してますね。
Form のコレクションとかを返してくれると思ったので、あれ〜?って思いました。

子フォームにしたいときは、MdiParent プロパティに設定しなければならない、という制限のつもりなのでしょうか。また、子フォームを入れ替えるとかできないようにとか?

parentForm.MdiChildren[0] = childForm;

なんてやっても、当然だめでしょう(未検証)。
何故 Controls のように

parentForm.MdiChildren.Add(childForm);

でないのか。こっちのほうが直感的なような気がしますが。
納得理由をご存知の方おられるでしょうか?


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-09 23:12 ]
とんぼ
会議室デビュー日: 2005/10/10
投稿数: 9
お住まい・勤務地: 大阪
投稿日時: 2005-10-10 19:20
こんなの作ってみました。
もう、解決してたらごめんなさい。

'*****************************************************************************
' TODO: isExistSubForm : サブフォームが開いているか
'*----------------------------------------------------------------------------
'* 補足説明 :サブフォームが開いていればアクティブにする
'*----------------------------------------------------------------------------
'* 戻り値  :サブフォームが開いていれば True
'*----------------------------------------------------------------------------
'* Revision : 作成 2005/08/25 CG H.Nasu
'* : 修正
'*****************************************************************************
Private Function isExistChildForm(ByVal TargetForm As Object) As Boolean

'既にフォームが有れば
For Each hForm As Form In Me.MdiChildren
If hForm.Equals(TargetForm) Then
'フォームをアクティブにする
hForm.Activate()
Return True
End If
Next hForm
Return False
End Function
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-11 08:50
こんにちは、じゃんぬ です。

引用:

とんぼさんの書き込み (2005-10-10 19:20) より:
こんなの作ってみました。
もう、解決してたらごめんなさい。

コード:

    Private Function isExistChildForm(ByVal TargetForm As Object) As Boolean

        '既にフォームが有れば
        For Each hForm As Form In Me.MdiChildren
            If hForm.Equals(TargetForm) Then
                'フォームをアクティブにする
                hForm.Activate()
                Return True
            End If
        Next hForm
        Return False
    End Function




  • TargetForm は Object 型である必要はないですよね。
  • Equals ではなく、Is 演算子を使った方が良いのではないでしょうか。
  • やっぱり、探すのではなく本来の参照を別の場所で取っておくべきだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-10-11 11:43
引用:

TargetForm は Object 型である必要はないですよね。


それと元の参照を保持していないと渡せませんね。

引用:

やっぱり、探すのではなく本来の参照を別の場所で取っておくべきだと思います。


.NET的にMDIChildrenの参照には含まれないが、インスタンスは存在するという状態はあるんですかね?
あ、MDIParentをNothingにすればいいのか。。。
いずれにしても独自の管理がベストでしょうね。
#個人的には探しまくってますが。(汗
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-11 11:51
引用:

まどかさんの書き込み (2005-10-11 11:43) より:

それと元の参照を保持していないと渡せませんね。


あら? これって親フォームだと思っていました。
小フォームの探し当てるターゲットだったとは...
それもそうですよね。

しかし「名前」指定とあまり変わりませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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