- PR -

【C#】Form_Load中の子画面のCloseで・・・

投稿者投稿内容
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2006-02-03 18:01
Shin_fmです。

ちょっと不可解な現象に出会ったので、知恵を貸して下さい。

構成はExeファイル1、Dllファイル2で、それぞれにFormを持つWindowsアプリです。
Exeファイルはメニュー画面、Dllファイルは親画面、子画面という関係にあります。

動作はメニュー画面のボタンクリックのイベントから親画面を表示し、表示直後に子画
面を表示します。

メニュー画面のボタンクリックのイベントから子画面までを一気に表示する為、親画面
のForm_Loadイベントで子画面を表示させているのですが、この状態(子画面を表示して
いる)で親画面にイベントが発生する事があります。イベントが発生したら、メッセー
ジボックスで終了するか続行するかを決めます。終了する場合は親画面ごと閉じてメニュ
ー画面を表示します。

問題は続行する場合です。続行する場合、子画面の操作を続行したいのでイベントからは
そのまま抜けます。この後子画面を閉じたときに親画面まで一緒に閉じてしまいます。親
画面を閉じないようにしたいのですが、何か方法はありますか?。

開発環境はVS2003、FrameWork1.1、OSはWinXPです。

画面の表示方法は メニュー画面から親画面、親画面から子画面共にShowDialogで表示
させています。
親画面はCloseされていないようで、Closingイベントは発生しません。発生していれば
Cancelする事で防げるとは思うのですが。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-03 18:10
引用:

shin_fmさんの書き込み (2006-02-03 18:01) より:

親画面のForm_Loadイベントで子画面を表示させているのですが、
この状態(子画面を表示している)で親画面にイベントが発生する事があります。


ここをもうちょっと詳しく知りたいです。
発生して良いものなのでしょうか?

引用:

イベントが発生したら、メッセージボックスで終了するか続行するかを決めます。
終了する場合は親画面ごと閉じてメニュー画面を表示します。
問題は続行する場合です。


とありますが、仕様から不可解に思えてきます。
どこかと言いますと、

引用:

メニュー画面から親画面、親画面から子画面共にShowDialogで表示させています。


とあるのにも関わらず、イベントの発生を許容している点です。

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

メニュー画面のボタンクリックのイベントから子画面までを一気に表示する為、親画面
のForm_Loadイベントで子画面を表示させているのですが、この状態(子画面を表示して
いる)で親画面にイベントが発生する事があります。イベントが発生したら、メッセー
ジボックスで終了するか続行するかを決めます。終了する場合は親画面ごと閉じてメニュ
ー画面を表示します。

画面の表示方法は メニュー画面から親画面、親画面から子画面共にShowDialogで表示
させています。


動作の可否に関わらず、まずいような。。。
子画面を閉じると初めて親のLoad_EndSubを抜けますから。

引用:

親画面はCloseされていないようで、Closingイベントは発生しません。発生していれば
Cancelする事で防げるとは思うのですが。


前記の理由でWindowsメッセージがおかしく(欠落?)なってるのかな?

閉じるのも子→親→メニューと「通知」を連鎖させるが一番いいと思うんですが。
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2006-02-03 19:12
じゃんぬめっとさん、まどかさん、早速のお返事有難う御座います。

確かにShowDialog中に親画面のイベントを発生させるのは行儀が良くありませんが。

親画面自体はベース画面を継承していて、イベントを起こしているのはベースの画面
です。子画面は親画面にデータを表示する為のパラメータ設定を行います。
イベントのキック自体はPC外部からの入力で発生します。

親画面のみを表示している時にも閉じる必要があるので親画面でのイベント処理を
書かないということは出来ません。

子画面にイベント発生を書いた場合、親と子の両方にイベントが発生しませんか?
この時に親のイベントを処理しないようにしても同じことが起きませんか?

ちなみに、外部入力の部分はPlugin化されています。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-02-04 00:55
引用:

親画面自体はベース画面を継承していて、イベントを起こしているのはベースの画面
です。


引用:

親画面のみを表示している時にも閉じる必要があるので親画面でのイベント処理を
書かないということは出来ません。


うーん、よくわかりません。
上段では、「イベントを起こしている」
下段では、「イベントを受け取っている」
親フォームが自分で自分に通知している???
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2006-02-06 12:14
まどかさん、こんにちは。

引用:

まどかさんの書き込み (2006-02-04 00:55) より:
引用:

親画面自体はベース画面を継承していて、イベントを起こしているのはベースの画面
です。


引用:

親画面のみを表示している時にも閉じる必要があるので親画面でのイベント処理を
書かないということは出来ません。


うーん、よくわかりません。
上段では、「イベントを起こしている」
下段では、「イベントを受け取っている」
親フォームが自分で自分に通知している???



ごめんなさい、書き方が紛らわしいですね。てか、間違ってました。

イベントの発生元は親フォームが参照している外部入力からのPluginになります。
イベントの受け取りは親フォームになります。

イベントの発生でメッセージボックスを表示します。
メッセージボックスの入力値によりCloseしてメニューまで戻るか、継続するかを決定します。
子フォームは表示されていない事がありますが、表示されていた場合には子フォーム
ごとCloseする必要があります。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-06 12:22
構成がまずいことは置いといて、
Load イベントで受け取りつつも、処理を Activate まで先延ばしすれば出来そうな気がしますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
shin_fm
常連さん
会議室デビュー日: 2004/05/24
投稿数: 36
お住まい・勤務地: 昼間は千代田区
投稿日時: 2006-02-06 14:21
引用:

じゃんぬねっとさんの書き込み (2006-02-06 12:22) より:
構成がまずいことは置いといて、
Load イベントで受け取りつつも、処理を Activate まで先延ばしすれば出来そうな気がしますが...



子画面と親画面を Close するのなら Activate まで先延ばしして・・・ というのは判るの
ですが、問題にしているのは一番最初にも書いたとおりイベントにより Close しない場
合です。

親画面の FormLoad 中に子画面の入力が発生します。
子画面の入力中に親画面のイベントが発生してきます。
イベントの発生でメッセージボックスが表示され、終了か継続かを問い合わせます。
終了する場合、子画面、親画面とも Close します。
継続する場合、イベントを無視して子画面の入力を続けます。

問題は継続した場合、子画面の入力が完了して子画面を閉じたときに親画面も一緒にとじられてしまう、という所です。

#子画面の表示を親画面の Activate に移せばいいのかな?。

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