- ベストアンサー
【VC++2005(CLR)】フォームが開かれていることを検知するには
いつも大変お世話になっております。 VC++初心者です。 現在、フォームAからフォームB、フォームCを呼び出しています。 フォームCがフォームBが開かれているかどうか検知したいのですが、 どのようにコーディングすればよいか教えて頂けませんでしょうか。 お手数ですが、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FormAはFormCを開いていることがわかるのであれば、FormBからFormAの関数 を使えるような感じにすればいいかも。 // デリゲードを使う例 // FormB.h public: delegate bool IsOtherFormShowed(); IsOtherFormShowed^ IsOtherFormShowed_; // コンストラクタでnullptrを入れておく private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if (this->IsOtherFormShowed_ != nullptr) { if (this->IsOtherFormShowed_()) { MessageBox::Show(L"ほかのフォームを開いている"); } } } // FormA.h private: bool IsFormCShowed() { return (this->FormC_ != nullptr) && !this->FormC_->IsDisposed); } // FormBに対するインスタンスを作成する箇所 this->FormB_ = gcnew FormB(); this->FormB_->IsOtherFormShowed_ += gcnew FormB::IsOtherFormShowed(this, &FormA::IsFormCShowed); デリゲードを使う利点はFormBからはFormAの内容を一切知らなくても使える ということです。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8753/19861)
かなり邪道だけど。 ・フォームのコンストラクタで、誰からでもアクセス可能なグローバル変数に「フォームが開かれる事」をセットする。 例えば、グローバル変数をポインタにしておき、開くフォームのオブジェクトアドレスを代入するとか。 ・フォームのデストラクタで誰からでもアクセス可能なグローバル変数に「フォームが破棄された事」をセットする。 例えば、グローバル変数をポインタにしておき、NULLポインタを代入するとか。 そうすれば「いつでもでも、どこでも、誰からでも、そのフォームが開いているか閉じているか」を知る事が出来る。 もし「最小化しているかどうか」を知りたいなら、グローバル変数がヌルかどうか見て、ヌルじゃなけりゃそれが「フォームクラスのオブジェクト」へのポインタだと思って、そのフォーム(そのオブジェクト)のプロパティを調べれば良い。 よく「グローバル変数はクラスのアクセス制御の概念を破壊する」と言うけど「このタイミングでは、AからBのメンバが見えないで困る」って言う場合には、グローバル変数を使うのが手っ取り早い。危険だけどね。
補足
ご回答ありがとうございます。 (返信遅れてすみませんでした。) 一応、教えていただいたソースでできたのですが、 警告で以下のメッセージが発生しました。 どこが原因かご教授いただけませんでしょうか。 >warning C4358: '+=': 複合デリゲートの戻り値の型は 'void' ではありません。返された値は定義されていません (不勉強ですみません。)