0

我做了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 然后我关闭。以及何时再次打开。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; }
}
4

1 回答 1

0

正如评论中讨论的那样,并且感谢@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指针重置,并为其提供正确的访问级别以供 aTChildForm调用它。

  • 添加对该方法的调用(即owner->onChildFormTermination()或类似的方法)~TChildForm以使其所有者知道。

请注意,我的 VCL-fu 有点生疏(我已经 10 多年没有使用 C++Builder 编码了),可能有一种更惯用的写法。

于 2014-06-06T10:55:55.783 回答