- PR -

FormB(子)を操作したときのFormA(親)の振舞い

投稿者投稿内容
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-08-23 16:33
こんにちは。mocoです。
VS2005 C#でWindowsアプリを作っています。アドバイスお願いします。

FormA(親)とFormB(子)があり、次のことを実現したいと思います。
1.FormBが最小化されたとき、FormAも最小化
2.タスクバーには1つしか表示させたくない

そこで次のコードを書いてみました。

== FormA Dialog ==
FormB dialog = new FormB();
dialog.Owner = this;
dialog.ShowDialog();
dialog.Owner = null;
dialog.Dispose();

== FormB Dialog ==
FormB_Shownイベント
this.this.Owner.Visible = false;

FormB_Resizeイベント
if (this.WindowState == FormWindowState.Minimized)
this.Owner.WindowState = FormWindowState.Minimized;

FormB_FormClosingイベント
this.Owner.Visible = true;


実現したい2つは満足できたのですが、
問題がタスクマネージャにアプリが表示されなくなってしまいました。
Visibleをfalseにしているせいだと思います。
この問題を解消したいのですが、何か良い方法はないでしょうか。

このソフトはメイン画面から沢山の子Formが連なっており、
実際にはFormBの下にも幾つか子Formが存在します。
なのでタスクバーにいくつもタスクを表示させたくありません。
皆さんは、こういったソフト作りではどのように作り込まれるのでしょうか。

申し訳ないですが教えてください。
よろしくおねがいします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-23 17:07
引用:

mocoさんの書き込み (2007-08-23 16:33) より:

dialog.Owner = null;


これは必要ありません。

引用:

dialog.Dispose();


using を使ってあげてください。

引用:

this.this.Owner.Visible = false;


これは転記ミス... でしょうか?

引用:

FormB_Resizeイベント
if (this.WindowState == FormWindowState.Minimized)
this.Owner.WindowState = FormWindowState.Minimized;

FormB_FormClosingイベント
this.Owner.Visible = true;


呼び出し先 (子) は、呼び出し元 (親) を意識しない作りが望ましいです。 呼び出し元は自分が呼び出したものを意識しても良いです。 これはモジュールの 「結合度」 などの概念でよく言われることですが Form でも同じことです。

たとえば、呼び出し元で呼び出し先の Form のインスタンスを確保して、最小化したかどうかをイベントによって通知する方法を取ると子 Form は親 Form を意識せずタイミングを知ることができます。

引用:

実現したい2つは満足できたのですが、問題がタスクマネージャにアプリが表示されなくなってしまいました。Visibleをfalseにしているせいだと思います。この問題を解消したいのですが、何か良い方法はないでしょうか。


いくつかあると思いますが、どれが望ましいかは要件次第になります。

引用:

このソフトはメイン画面から沢山の子Formが連なっており、実際にはFormBの下にも幾つか子Formが存在します。なのでタスクバーにいくつもタスクを表示させたくありません。
皆さんは、こういったソフト作りではどのように作り込まれるのでしょうか。


ここが本題ですね。

子 Form と呼ばれているものが複数ドキュメントのようなイメージであれば、MDI アプリケーションという方法が望ましいです。 今回はまさにこれに当たるのではないでしょうか? moco さんが使用している Visual Studio 2005 もそのようにドキュメント管理していますよね。

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

子 Form と呼ばれているものが複数ドキュメントのようなイメージであれば、MDI アプリケーションという方法が望ましいです。 今回はまさにこれに当たるのではないでしょうか?


あえて言うなら、ShowDialog()と書かれているところが気になりますが。
いずれにしろ子フォームの仕様上の性質がポイントですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-23 17:28
引用:

まどかさんの書き込み (2007-08-23 17:15) より:

あえて言うなら、ShowDialog()と書かれているところが気になりますが。


「タスク バーへの表示」 を気になさっていたようなので、そのためかと勝手に判断しておりました。 モーダル表示でないといけない、ということになると話は変わりますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-08-23 17:39
アドバイスありがとうございます。

引用:

----------------------------------------------------------
this.this.Owner.Visible = false;
----------------------------------------------------------
これは転記ミス... でしょうか?


すみません。ミスでした。

引用:

たとえば、呼び出し元で呼び出し先の Form のインスタンスを確保して、最小化したかどうかをイベントによって通知する方法を取ると子 Form は親 Form を意識せずタイミングを知ることができます。


すぐに試してみます。

引用:

いくつかあると思いますが、どれが望ましいかは要件次第になります。


要件次第というと、どのような条件があるのでしょうか。
ごめんなさい知識不足で、、

引用:

ここが本題ですね。

子 Form と呼ばれているものが複数ドキュメントのようなイメージであれば、MDI アプリケーションという方法が望ましいです。 今回はまさにこれに当たるのではないでしょうか? moco さんが使用している Visual Studio 2005 もそのようにドキュメント管理していますよね。


MDIアプリケーションですね!使ったことないのを使うのは楽しみです。


あ、あと、モーダル表示でないといけないんです。
MDIはモーダレスでないと使えませんか?




[ メッセージ編集済み 編集者: moco 編集日時 2007-08-23 17:40 ]

[ メッセージ編集済み 編集者: moco 編集日時 2007-08-23 17:42 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-23 19:35
おっと、編集で追記なさっていますね。

引用:

mocoさんの書き込み (2007-08-23 17:39) より:

あ、あと、モーダル表示でないといけないんです。
MDIはモーダレスでないと使えませんか?


MDI アプリケーションでモーダル表示というのは一般的ではないかもしれませんが、できないなんてことはないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-08-23 19:48
ありがとうございます。じゃんぬさん。

じゃんぬさんのホームページにはいつもお世話になっております。

またよろしくお願い致します。
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-08-23 21:45
MDIを今試しているのですが、分からなくなってしまいました。
すみません、また教えていただけますか。

引用:

MDI アプリケーションでモーダル表示というのは一般的ではないかもしれませんが、できないなんてことはないです。


こちらから、単純に子FormをShowDialog()で表示させようとしましたが、
MDI コンテナ フォームはトップレベルにしてください。
とエラーが出ます。
じゃんぬさんのおっしゃった方法を教えて頂けませんか。
なんかいも申し訳ないです。

MDIでは親1に対し複数の子を存在させることができ、
親は1つしか存在できないようです。
一方で、あたしの実現したいかたちは『親 → 子 → 孫 → ・・・』というように、
親子関係が続いて深くなっているので
MDIでどう実現すればよいか悩んでいます。

基本的なことでしたらゴメンなさい。。

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