c++ builder XE4, 10.2 Tokyo > 子フォームが閉じられたのを親が知るための実装


動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

親(Form1)がインスタンス作成した子フォーム(Form2)がある時、子フォーム側でクローズ処理をした後で親がそのフォームが閉じられたかどうか知る方法を考えてみた。

Form1以外の親でも使えるようにするため、子フォームで親のヘッダファイル(Form1.hなど)をincludeしないという前提。

Form2でIsClosed()を用意

Unit2.cpp
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
    m_closed = false;
}
bool __fastcall TForm2::IsClosed()
{
    return m_closed;
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
    m_closed = true;
}

Form2が閉じられた時にm_closedをtrueにしておいて、IsClosed()で親が確認するとした。

Unit1.cpp
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    m_forms[0] = NULL;
    m_forms[1] = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_createClick(TObject *Sender)
{
    m_forms[0] = new TForm2(this);
    m_forms[1] = new TForm2(this);

    m_forms[0]->Show();
    m_forms[1]->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_checkClick(TObject *Sender)
{
    TForm2 *formPtr;

    for(int idx=0; idx < 2; idx++) {
        formPtr = m_forms[idx];
        if (formPtr == NULL) {
            continue;
        }

        bool isClosed = formPtr->IsClosed();
        String msg3 = L"IsClosed: " + BoolToStr(isClosed);
        OutputDebugString(msg3.c_str());

        if (isClosed) {
            m_forms[idx]->Free();
            m_forms[idx] = NULL;
        }

    }
}
//---------------------------------------------------------------------------

検索用キーワード

(2018-11-05 追記)

  • ゾンビ
  • ゾンビプロセス