- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# の MDI)
C#のMDIの応用問題についての解決方法
このQ&Aのポイント
- C#のMDIを使って複数の異なる子ウインドウを作りたい場合、子ウインドウごとにフラグを設けて、開くたびにフラグをセットする処理を行えば実現できます。
- ただし、フラグがセットされたままになってしまい、二度と開けなくなる問題があります。子ウインドウが閉じられたことを知るためには、デストラクタを使用する方法が一般的ですが、C#ではデストラクタが呼び出されないため、別の方法で実現する必要があります。
- 別の方法としては、子ウインドウを閉じる際にフラグをセット解除する処理を行うことが考えられます。子ウインドウのクローズイベントなどを利用してフラグのセット解除処理を行えば、問題を解決することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
noname#49664
回答No.1
C#ということは、.NET 1.1あたりでしょうか・・。 ウィンドウを閉じた際の処理をデストラクタで、というのはちょっと違うように思います。デストラクタは、インスタンスが破棄される際のものですので。ウィンドウを閉じたからといってその場で瞬時にデストラクタが呼び出されるとは限りません。例えば、他からそのインスタンスが参照されていれば、参照が切れるまで破棄はされませんから。 通常は、ウィンドウを閉じる際のイベントを利用するのが一般的だろうと思います。「Closing」「Closed」といったイベントが用意されているはずですので、それにメソッドをバインドして、その中で処理されてはいかがでしょう。
その他の回答 (1)
noname#49664
回答No.2
#1です。 Closingは、閉じる操作を行ったときに最初に送られるイベントです。これは、「クローズのキャンセル」のためにあるといっていいでしょう。例えば、多くのソフトではクローズボックスをクリックすると「ウィンドウを閉じるか、保存するか」といった確認のダイアログが現れ、キャンセルすることで閉じる操作を撤回できますね? そのためのものです。このイベントが無事に処理された後で、Closedイベントが発生します。こちらは本当に「閉じる際(直前)の処理」のためのものです。 Closingでは、引数にCancelEventArgsインスタンスが渡されます。この中のCancelをtrueに変更すると、クローズ操作がキャンセルされたと見なされ、次のClosedイベントは発生せず、ウィンドウも閉じられません。
質問者
お礼
よく理解できました。 大変分かりやすい回答ありがとうございました。
お礼
回答ありがとうございました。 おっしゃるとおり「Closing」と「Closed」イベントがあり、この中でフラグのクリア処理を行えばうまく動作するようになりました。 「Closing」と「Closed」の差は何なのでしょうね。ウインドウを閉じる前と後に呼び出されるイベントかと思ってそれぞれの中でメッセージボックスを出力する処理を入れてみましたが、どちらの場合もウインドウが閉じられる前にメッセージボックスが現れます。