MDI アプリケーション - 子フォームを開けません
-
21-12-2019 - |
質問
2フォーム作りました。MainFormとChildForm(使用可能なフォームを設定しました)
デザイン >> http://i.imgur.com/UkV7lZh.png
ChildFormを呼び出したいときはこのコードを使用してください
void __fastcall TMainForm::ChildForm1Click(TObject *Sender)
{
if(!ChildForm)
{ ChildForm = new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }
}
そして閉じる
void __fastcall TChildForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action=caFree;
}
ChildFormを開いたときに閉じてしまうのはなぜですか。そしていつ再び開くか。チャイルドフォームが開けません??
#メインフォーム
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" //ChildForm
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ChildForm1Click(TObject *Sender)
{
if(!ChildForm)
{ ChildForm = new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }
}
解決
コメントで議論されているように、@Remy Lebeau の協力のおかげで、 TMainForm
クラスを設定する必要があります ChildFrom
へのポインタ NULL
それが指すフォームを破壊した後。これは、 TChildForm
クラスの構築時に渡されたその所有者のポインタを使用します。
問題は基本的に次のコード スニペットにあります。
if(!ChildForm)
{ ChildForm = new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }
初めて、すべてが計画どおりに機能します。いつ ChildForm
ただし、ポインタはリセットされず、次回は破壊されます。 ChildForm
作成が要求されると、最初のテストは失敗し、当然フォームは作成されません。
それで:
を作る
TChildForm
クラスはその所有者のポインターのコピーを保持します (おそらくコンストラクターのプロトタイプを次のように変更する必要があるでしょう:__fastcall TChildForm::TChildForm(TMainForm *owner)
のために
TChildForm
を知るために フルタイプ 所有者のもの (IDE は#include
のTMainForm
ヘッダーを作成するか、許可を求めてください)。でメソッドを作成します
TMainForm
処理するTChildForm
ポインタをリセットし、適切なアクセス レベルを与えます。TChildForm
それを呼び出すために。そのメソッドへの呼び出しを追加します(つまり、
owner->onChildFormTermination()
またはそのようなもの)~TChildForm
所有者に知らせるために。
私の VCL-fu は少し錆びていることに注意してください (私は 10 年以上 C++Builder でコードを書いていません)。これを書くにはもっと慣用的な方法があるかもしれません。