- PR -

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

投稿者投稿内容
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-09 17:31
引用:

じゃんぬねっとさんの書き込み (2005-09-09 17:20) より:
一応、実行時に決定することもできます。
が、Name プロパティは、そういうことに使用する「識別子」ではないので、
CODING HORROR になるような気がします。

第三者が見て、すぐにわからないんじゃないかな?


Nameプロパティにそのような使い方はできる事は解りますが、
じゃんぬさんの仰るとおり、可読性は落ちると思います。

そもそも、同じ子画面の生成を許すのかどうかは解りませんが…、

もしそうであれば、子画面に独自プロパティを作って
そいつに、親が一意となるような識別子を振ってやって、
かつ、For Eachでぐるぐるまわして、画面の型+識別子で判定ってなるんですかねぇ。

# 日本語編集

[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-09-09 17:32 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-09 17:42
こんにちは、じゃんぬ です。

引用:

そもそも、同じ子画面の生成を許すのかどうかは解りませんが…、


質問者のみぞ知るってところですが。
MDI ドキュメントって Word のような多数のドキュメントを扱えるものですから、
普通にあり得ますよね? (囚人さんの仰る通り)

引用:

もしそうであれば、子画面に独自プロパティを作って
そいつに、親が一意となるような識別子を振ってやって、
かつ、For Eachでぐるぐるまわして、画面の型+識別子で判定ってなるんですかねぇ。


そうですね、Name よりはその方が良いでしょう。
まあ、Tag を使うという方法もありますけど、
これも意味のある状態にしないと使いにくいですからね。

で、そこまで言うならば、別の構造で管理しておくべきだと思うんですよね。
要するに、変数に参照を取って、コレクション何かで管理するとかですね。
そうすれば、Name のような識別もできますし。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-09 17:43
今回の場合は「型」で判断し、それで解決できますね。
しかし通常は「型」で判断のほうがありえなくはないでしょうか?

引用:

そもそも、同じ子画面の生成を許すのかどうかは解りませんが…、



何故でしょうか?それは今回の事例の事を言ってそういってるのであればいいのですが、
動的に子フォームを生成する事は普通にあると思います。

引用:

もしそうであれば、子画面に独自プロパティを作って
そいつに、親が一意となるような識別子を振ってやって、
かつ、For Eachでぐるぐるまわして、画面の型+識別子で判定ってなるんですかねぇ。



確かに Name よりはそっちのほうがいいですね。

そうなると、アクティブにするトリガーとフォームを別のオブジェクトに管理させたいですね。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-09 17:51
お世話になります。

引用:

囚人さんの書き込み (2005-09-09 17:43) より:
引用:

そもそも、同じ子画面の生成を許すのかどうかは解りませんが…、


何故でしょうか?それは今回の事例の事を言ってそういってるのであればいいのですが、
動的に子フォームを生成する事は普通にあると思います。


確かに普通にあると思います。
自分は同一子画面の生成を許さないものをつい最近つくったばかりなので、
余計な事を書いてしまったかもしれません。

引用:

今回の場合は「型」で判断し、それで解決できますね。
しかし通常は「型」で判断のほうがありえなくはないでしょうか?


確かに。
最初に型で判定したのは、
上記の自分の理由なので、例としては適切ではなかったですね。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-09-09 18:10
[qute]
Dim frmChild As New Form1()
frmChild.MdiParent = Me
frmChild.Show()
[/quote]
ここで生成したForm1のインスタンスをどこかに保持しておけば、万事解決ですよね。
普通はそうすると思います。

#私なんかは、保持しておかないとガベージコレクタに回収されそうで、不安でならないのだが。
#到達不可能なインスタンスは破棄されちゃうよね。
#ま、実際にはフレームワーク内部をくぐって到達可能なんだろうけど。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-09 18:25
引用:

#私なんかは、保持しておかないとガベージコレクタに回収されそうで、不安でならないのだが。
#到達不可能なインスタンスは破棄されちゃうよね。
#ま、実際にはフレームワーク内部をくぐって到達可能なんだろうけど。



コード:

public Form MdiParent
{
set
{
・・・
// midChildren が何かわからないけど、何かのコレクションと仮定して
value.mdiChildren.Add(this);
・・・
}
}



MdiParent の実装ってこんなノリじゃないでしょうか。だから掃除されないと思います。

引用:

ここで生成したForm1のインスタンスをどこかに保持しておけば、万事解決ですよね。
普通はそうすると思います。



万事解決だと私も思うんですけど、上記の理由から、自分のメンバ2つが同じ所指してるのかぁとおもったら、ちょっと気持ち悪かったり^^;


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-09 18:27 ]
eguchi
会議室デビュー日: 2005/09/09
投稿数: 6
投稿日時: 2005-09-09 19:00
じゃんぬねっとさん、なおこ(・∀・)さん、囚人さん、甕星さん
ありがとうございます。

内容を理解するのに必死で遅くなり申し訳ありませんでした。
(まだ全部は理解出来てませんが・・・)

私の場合では「同じ子画面の生成」は考えていませんでした。
あるMDI子フォームをアクティブにしたいと思っていたのは
同じ子画面を2つ生成せずに、最初に生成したMDI子画面をアクティブにして
一番上に表示したかったからです。

「型」で判断して動作することが出来ました。
(本当に助かりました。)

同じ子画面がある場合は難しそうですね・・・
またよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-09 21:12
こんにちは、じゃんぬ です。

引用:

eguchiさんの書き込み (2005-09-09 19:00) より:
内容を理解するのに必死で遅くなり申し訳ありませんでした。
(まだ全部は理解出来てませんが・・・)


アチャー、元質問者さまをそっちのけで盛り上がってしまったみたいです。
情報の共有が本来の目的ですので、お許しください。(*_ _)

引用:

同じ子画面がある場合は難しそうですね・・・
またよろしくお願いします。


別で管理するという構造であれば、同じであろうとそうであろうと関係ないです。
そして、それほど難しいことではありません。


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

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