いつも大変お世話になっております。
VC++初心者です。

現在、フォームAからフォームB、フォームCを呼び出しています。
フォームCがフォームBが開かれているかどうか検知したいのですが、
どのようにコーディングすればよいか教えて頂けませんでしょうか。

お手数ですが、よろしくお願いします。

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

この回答への補足

ご回答ありがとうございます。
(返信遅れてすみませんでした。)

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

(不勉強ですみません。)

補足日時:2009/06/08 13:21
    • good
    • 0

かなり邪道だけど。



・フォームのコンストラクタで、誰からでもアクセス可能なグローバル変数に「フォームが開かれる事」をセットする。

例えば、グローバル変数をポインタにしておき、開くフォームのオブジェクトアドレスを代入するとか。

・フォームのデストラクタで誰からでもアクセス可能なグローバル変数に「フォームが破棄された事」をセットする。

例えば、グローバル変数をポインタにしておき、NULLポインタを代入するとか。

そうすれば「いつでもでも、どこでも、誰からでも、そのフォームが開いているか閉じているか」を知る事が出来る。

もし「最小化しているかどうか」を知りたいなら、グローバル変数がヌルかどうか見て、ヌルじゃなけりゃそれが「フォームクラスのオブジェクト」へのポインタだと思って、そのフォーム(そのオブジェクト)のプロパティを調べれば良い。

よく「グローバル変数はクラスのアクセス制御の概念を破壊する」と言うけど「このタイミングでは、AからBのメンバが見えないで困る」って言う場合には、グローバル変数を使うのが手っ取り早い。危険だけどね。
    • good
    • 0

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


人気Q&Aランキング

おすすめ情報