• ベストアンサー

【VC++2005(CLR)】フォームを閉じたことを検知するには?

いつもお世話になっております。 現在フォームAからフォームBをモードレスで呼び出しております。 フォームBが閉じたことをフォームAに知らせたいのですが、 どのようにすればよいか教えて頂けませんでしょうか。 現在下記のタイミングでコーディングすればよいと思うのですが、 いかがでしょうか。 private: System::Void FormB_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) { //ここにコード記述 } お手数ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

FormBのFormClosingイベントに FormAで定義したFormClosingEventHandlerデリゲードを設定する。 // ずっと前のコードに追加 private:   Form2^ childForm_; private:   System::Void ChildForm_Closing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)   {     MessageBox::Show(L"フォームが閉じるよ");   } private:   System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)   {     if ((this->childForm_ != nullptr) &&     !this->childForm_->IsDisposed)     {       this->childForm_->Close();       /this->childForm_ = nullptr;     }     else     {       this->childForm_ = gcnew Form2();       this->childForm_->FormClosing += gcnew FormClosingEventHandler(this, &Form1::ChildForm_Closing);              this->childForm_->Show();     }   } ただ >フォームを閉じたこと だったら、FormClosingではなくFormClosedではないかと。

yuki7091
質問者

補足

回答ありがとうございます。 (返信遅れてすみません。) ※本件はhttp://okwave.jp/qa4865001.htmlで質問させていただいた延長でした。 >FormBのFormClosingイベントに >FormAで定義したFormClosingEventHandlerデリゲードを設定する。 とはどういうことなのでしょうか。 また、教えていただいたソースは、以下の部分も含めてすべて呼び出し元のフォームに書き込むのでしょうか。   System::Void ChildForm_Closing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)   {     MessageBox::Show(L"フォームが閉じるよ");   } お手数ですが、よろしくお願いします。

その他の回答 (2)

回答No.3

>とはどういうことなのでしょうか。 は示したコードのとおり。 >以下の部分も含めてすべて呼び出し元のフォームに書き込むのでしょうか。 そう。 本気でC++/CLIをやるのであれば、ちゃんとした基本を勉強しておくべきでしょう。 オススメ書籍 http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5C-CLI-%E6%A5%B5%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%A8%E5%AE%9F%E7%94%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E4%B8%AD-%E5%8D%9A%E4%BF%8A/dp/4797336277

yuki7091
質問者

お礼

ご回答ありがとうございます。 教えていただいたとおりしたら、何とかできました! ありがとうございます。 しかしながら、デリゲートをまったく理解していないので、 教えていただいた本を利用して、もう一度勉強させて頂きます。

回答No.1

 こんばんは。こう言う事でしょうか。 //フォームA public: System::Void FormA::NotifyClosing(System::Windows::Forms::Form^ form) { //必要であればformを使用して何かする } //フォームB private: System::Void FormB_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) { //ここにコード記述 FormA^ formA = dynamic_cast<FormA^>(this->Owner); if(formA == nullptr)return; formA->NotifyClosing(this); }

yuki7091
質問者

補足

早速のご回答ありがとうございます。 やりたいことは、教えていただいたソースのイメージです。 しかしながら、教えていただいたソースではエラーが 出てしまいました。 (FormAが定義されていませんと出てきます。) また、 formA->NotifyClosing(this); のように、formAはNotifyClosingを利用できませんでした。

関連するQ&A