- PR -

MDI子フォームの終了を取得する方法は?

投稿者投稿内容
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-02-10 17:32
こんにちは。
VB.NETで開発している者です。

現在、MDIを作成しているのですが、親フォームで子フォームを"Show"
しています。
ここで、子フォームが閉じられたかどうかを取得するタイミング(イベント?)
が分かりません。
まさかタイマーを動かして、定期的に取得とはしたくないんで...

どなたかいい方法がありましたら、ぜひご教授下さい。
お願いします。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-02-10 17:45
こんにちは。
子フォーム(フォーム)の終了時にいくつかイベントが起こされると思いますが
できませんか?

_________________
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-02-10 18:54
返信、ありがとうございます。

すいません、説明不足でした。
MDIで親フォームのバツボタンを押下すると、MDI子フォームのClosing,Closed
イベントが起こらないのです。
普通に終わるときはCHNさんの言うとおりなのですが、上記ような場合、
どのようにしたらよいのでしょうか?
お願いします。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-02-10 19:39
それなら、子フォーム起動時に「起動」したという情報を保存しておき、
閉じるときその情報をクリアするって仕組みでいいのでは...
>MDIで親フォームのバツボタン
のように親のイベント内でこの情報を調べることで可能だと思います。
複数の子フォームなら、配列の変数でも用意して...という感じで
#これがベスト解だと思いませんが、ひとつの方法としては成立していると思います。

イベントは発生すると言われてますね、>KKKさん

_________________
世界平和を願う!
http://park8.wakwak.com/~chin/

[ メッセージ編集済み 編集者: CHN 編集日時 2004-02-10 19:47 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-10 19:43
諸農です。

引用:

MDIで親フォームのバツボタンを押下すると、MDI子フォームのClosing,Closed
イベントが起こらないのです。



試してみましたが、イベントは発生します。
また、ドキュメントにも発生すると書かれていました。

コード:
//親側
private void menuItem2_Click(object sender, System.EventArgs e)
{
    Form2 f = new Form2();
    f.MdiParent = this;
    f.Show();
}

//子側
private void Form2_Closing(object sender,
                           System.ComponentModel.CancelEventArgs e)
{
    MessageBox.Show("閉じられそうです");
}



SDK Form.Closingイベントより引用
ms-help://MS.NETFrameworkSDKv1.1.JA/cpref/html/frlrfsystemwindowsformsformclassclosingtopic.htm
引用:

フォームが MDI 親フォームの場合は、MDI 親フォームの Closing イベントが発生する前に、すべての MDI 子フォームの Closing イベントが発生します。さらに、MDI 親フォームの Closed イベントが発生する前に、すべての MDI 子フォームの Closed イベントが発生します。MDI 子フォームの Closing イベントをキャンセルしても、MDI 親フォームの Closing イベントは発生します。



但し以下のような内容も書かれていました。
引用:

注意 Application.Exit メソッドが呼び出されてアプリケーションを終了する場合、 Form.Closed イベントと Form.Closing イベントは発生しません。これらのイベントのいずれかに実行する必要がある検証コードがある場合は、 Exit メソッドを呼び出す前に、開いている各フォームに対して Form.Close メソッドを個別に呼び出す必要があります。




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-10 19:48
諸農です。

引用:

CHNさんの書き込み (2004-02-10 19:39) より:

のように親のイベント内でこの情報を調べることで可能だと思います。
複数の子フォームなら、配列の変数でも用意して...という感じで



MDI親フォームの場合、MdiChildrenプロパティを持っているので、
親フォームのClosingイベントで、子フォームのメソッドなりイベン
トなりを、このプロパティを使って呼び出すことができそうですね。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-02-11 17:25
みなさん、ありがとうございます。

試してみましたが、MDI親フォームのバツボタンで閉じても、
なぜかMDI子フォームのClosedイベントが発生しません。
なにかやり方に問題があるのでしょうか?
もしかしたら、バツボタンでは、 Application.Exit メソッドと
同じことが起きているのでしょうか??
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-11 18:13
諸農です。

引用:

試してみましたが、MDI親フォームのバツボタンで閉じても、
なぜかMDI子フォームのClosedイベントが発生しません。
なにかやり方に問題があるのでしょうか?



私は、VS2003のC#で親フォームにメニューを配置して、
子フォームには何も配置せずに行いました。
ClosingとClosedイベントの両方にメッセージを出力する
イベントハンドラを追加して行いましたが、両方のメッセ
ージが出力されます。

引用:

もしかしたら、バツボタンでは、 Application.Exit メソッドと
同じことが起きているのでしょうか??



私の方では、親フォームの×ボタンで行いました。

こちらの環境はWin2000SP4です。

なんだか妙な現象ですね。
切り分けとして、上記のような単純にフォームだけのプロジェクトを
作成して試してみることは可能でしょうか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

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