• ベストアンサー

【VC++2005(CLR)】フォームが開かれていることを検知するには

いつも大変お世話になっております。 VC++初心者です。 現在、フォームAからフォームB、フォームCを呼び出しています。 フォームCがフォームBが開かれているかどうか検知したいのですが、 どのようにコーディングすればよいか教えて頂けませんでしょうか。 お手数ですが、よろしくお願いします。

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

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

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の内容を一切知らなくても使える ということです。

yuki7091
質問者

補足

ご回答ありがとうございます。 (返信遅れてすみませんでした。) 一応、教えていただいたソースでできたのですが、 警告で以下のメッセージが発生しました。 どこが原因かご教授いただけませんでしょうか。 >warning C4358: '+=': 複合デリゲートの戻り値の型は 'void' ではありません。返された値は定義されていません (不勉強ですみません。)

その他の回答 (1)

回答No.2

かなり邪道だけど。 ・フォームのコンストラクタで、誰からでもアクセス可能なグローバル変数に「フォームが開かれる事」をセットする。 例えば、グローバル変数をポインタにしておき、開くフォームのオブジェクトアドレスを代入するとか。 ・フォームのデストラクタで誰からでもアクセス可能なグローバル変数に「フォームが破棄された事」をセットする。 例えば、グローバル変数をポインタにしておき、NULLポインタを代入するとか。 そうすれば「いつでもでも、どこでも、誰からでも、そのフォームが開いているか閉じているか」を知る事が出来る。 もし「最小化しているかどうか」を知りたいなら、グローバル変数がヌルかどうか見て、ヌルじゃなけりゃそれが「フォームクラスのオブジェクト」へのポインタだと思って、そのフォーム(そのオブジェクト)のプロパティを調べれば良い。 よく「グローバル変数はクラスのアクセス制御の概念を破壊する」と言うけど「このタイミングでは、AからBのメンバが見えないで困る」って言う場合には、グローバル変数を使うのが手っ取り早い。危険だけどね。

関連するQ&A

専門家に質問してみよう