アプリ版:「スタンプのみでお礼する」機能のリリースについて

フリーソフトの SharpDevelop を使って独学で C# の勉強をしています。

(同じタイプの) 複数の子ウインドウを持つ MDI の作り方は本を読んで分かったのですが、その応用問題として、複数の異なる子ウインドウを一つずつ持つ MDI を作ろうとして行き詰ってしまいました。例えば SharpDevelop はメインウインドウの中にプロパティウインドウやアウトプットウインドウが一つづつ開けますがそのようなことをしたいということです。

子ウインドウごとにフラグを設けて、子ウインドウを開くたびにそのフラグをセットし、そのフラグがセットされていれば新たに子ウインドウを開くことはしないという処理にすればいいはずですが、どうもうまくいきません。

このままでは一度開いてその後閉じられた子ウインドウはフラグがセットされたままになっているため、二度と開けないことになります。子ウインドウが閉じられたことを知るためにデストラクタを使用し、その中でフラグをクリアすればいいと思ったのですが子ウインドウを閉じてもデストラクタが呼び出されないようです。

普通こういう処理はデストラクタを使用するのでしょうか、あるいは別の方法で実現するのでしょうか。

A 回答 (2件)

C#ということは、.NET 1.1あたりでしょうか・・。



ウィンドウを閉じた際の処理をデストラクタで、というのはちょっと違うように思います。デストラクタは、インスタンスが破棄される際のものですので。ウィンドウを閉じたからといってその場で瞬時にデストラクタが呼び出されるとは限りません。例えば、他からそのインスタンスが参照されていれば、参照が切れるまで破棄はされませんから。
 通常は、ウィンドウを閉じる際のイベントを利用するのが一般的だろうと思います。「Closing」「Closed」といったイベントが用意されているはずですので、それにメソッドをバインドして、その中で処理されてはいかがでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

おっしゃるとおり「Closing」と「Closed」イベントがあり、この中でフラグのクリア処理を行えばうまく動作するようになりました。

「Closing」と「Closed」の差は何なのでしょうね。ウインドウを閉じる前と後に呼び出されるイベントかと思ってそれぞれの中でメッセージボックスを出力する処理を入れてみましたが、どちらの場合もウインドウが閉じられる前にメッセージボックスが現れます。

お礼日時:2005/05/09 11:12

#1です。



Closingは、閉じる操作を行ったときに最初に送られるイベントです。これは、「クローズのキャンセル」のためにあるといっていいでしょう。例えば、多くのソフトではクローズボックスをクリックすると「ウィンドウを閉じるか、保存するか」といった確認のダイアログが現れ、キャンセルすることで閉じる操作を撤回できますね? そのためのものです。このイベントが無事に処理された後で、Closedイベントが発生します。こちらは本当に「閉じる際(直前)の処理」のためのものです。

Closingでは、引数にCancelEventArgsインスタンスが渡されます。この中のCancelをtrueに変更すると、クローズ操作がキャンセルされたと見なされ、次のClosedイベントは発生せず、ウィンドウも閉じられません。
    • good
    • 0
この回答へのお礼

よく理解できました。

大変分かりやすい回答ありがとうございました。

お礼日時:2005/05/09 18:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!