
フリーソフトの SharpDevelop を使って独学で C# の勉強をしています。
(同じタイプの) 複数の子ウインドウを持つ MDI の作り方は本を読んで分かったのですが、その応用問題として、複数の異なる子ウインドウを一つずつ持つ MDI を作ろうとして行き詰ってしまいました。例えば SharpDevelop はメインウインドウの中にプロパティウインドウやアウトプットウインドウが一つづつ開けますがそのようなことをしたいということです。
子ウインドウごとにフラグを設けて、子ウインドウを開くたびにそのフラグをセットし、そのフラグがセットされていれば新たに子ウインドウを開くことはしないという処理にすればいいはずですが、どうもうまくいきません。
このままでは一度開いてその後閉じられた子ウインドウはフラグがセットされたままになっているため、二度と開けないことになります。子ウインドウが閉じられたことを知るためにデストラクタを使用し、その中でフラグをクリアすればいいと思ったのですが子ウインドウを閉じてもデストラクタが呼び出されないようです。
普通こういう処理はデストラクタを使用するのでしょうか、あるいは別の方法で実現するのでしょうか。

No.1ベストアンサー
- 回答日時:
C#ということは、.NET 1.1あたりでしょうか・・。
ウィンドウを閉じた際の処理をデストラクタで、というのはちょっと違うように思います。デストラクタは、インスタンスが破棄される際のものですので。ウィンドウを閉じたからといってその場で瞬時にデストラクタが呼び出されるとは限りません。例えば、他からそのインスタンスが参照されていれば、参照が切れるまで破棄はされませんから。
通常は、ウィンドウを閉じる際のイベントを利用するのが一般的だろうと思います。「Closing」「Closed」といったイベントが用意されているはずですので、それにメソッドをバインドして、その中で処理されてはいかがでしょう。
回答ありがとうございました。
おっしゃるとおり「Closing」と「Closed」イベントがあり、この中でフラグのクリア処理を行えばうまく動作するようになりました。
「Closing」と「Closed」の差は何なのでしょうね。ウインドウを閉じる前と後に呼び出されるイベントかと思ってそれぞれの中でメッセージボックスを出力する処理を入れてみましたが、どちらの場合もウインドウが閉じられる前にメッセージボックスが現れます。

No.2
- 回答日時:
#1です。
Closingは、閉じる操作を行ったときに最初に送られるイベントです。これは、「クローズのキャンセル」のためにあるといっていいでしょう。例えば、多くのソフトではクローズボックスをクリックすると「ウィンドウを閉じるか、保存するか」といった確認のダイアログが現れ、キャンセルすることで閉じる操作を撤回できますね? そのためのものです。このイベントが無事に処理された後で、Closedイベントが発生します。こちらは本当に「閉じる際(直前)の処理」のためのものです。
Closingでは、引数にCancelEventArgsインスタンスが渡されます。この中のCancelをtrueに変更すると、クローズ操作がキャンセルされたと見なされ、次のClosedイベントは発生せず、ウィンドウも閉じられません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- Chrome(クローム) 最近Win10にてブラウザが左にスッと隠れていく現象に悩まされてます 3 2023/07/22 23:11
- Illustrator(イラストレーター) ウインドウの固定 1 2022/05/02 17:11
- その他(OS) Mac OSの操作について 2 2022/06/08 09:19
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
- その他(OS) MacのFinder操作について 2 2022/07/13 07:29
- PDF Just PDF 5 proでポップアップしたファイル名がつきまとう 2 2022/12/18 09:56
- ノートパソコン asusのパソコンを開らいたら セーフモードになってしまった。 通常ウインドウに戻す方法は? 3 2022/04/13 03:55
- ドライブ・ストレージ 外付けHDDの取り出し 3 2022/04/20 10:54
- マウス・キーボード タッチパッドでドラッグしたい 1 2023/08/08 20:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# の MDI
-
VBでRegisterWindowMessage関数...
-
2秒間のメッセージウィンドウ
-
コールバック関数とは…(C言語)
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
コンソールからのメッセージボ...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
「アイテムは収集されました」...
-
皆さん、おはようございます♪ ...
-
ウィンドウのないActiveXコント...
-
別アプリの終了について
-
アクセスのセルの数え方。
-
有限要素法について教えてください
-
PanelとCanvasの違いについて
-
ラジオボタンの初期指定
-
有限要素法(FEM)について教え...
-
マインクラフト(pc版)で座標...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
他のウィンドウのボタンを自動...
-
VB.netでFindWindowExやると・...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
システム例外のメッセージを変...
-
VBでRegisterWindowMessage関数...
-
VC++(MFC)でタスクバーに常駐し...
-
VBA 複数セルが空白なら印刷さ...
-
16進数入力制限方法
-
グローバルフック(SetWindowsH...
-
マウスホイールをフックしたい
-
WM_NCLBUTTONUPについて
-
キーボード入力をHSPでさせたい...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
おすすめ情報