質問

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 は #includeTMainForm ヘッダーを作成するか、許可を求めてください)。

  • でメソッドを作成します TMainForm 処理する TChildForm ポインタをリセットし、適切なアクセス レベルを与えます。 TChildForm それを呼び出すために。

  • そのメソッドへの呼び出しを追加します(つまり、 owner->onChildFormTermination() またはそのようなもの) ~TChildForm 所有者に知らせるために。

私の VCL-fu は少し錆びていることに注意してください (私は 10 年以上 C++Builder でコードを書いていません)。これを書くにはもっと慣用的な方法があるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top