我做了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; }
}
因为它已经在的意见,并感谢@Remy勒博的帮助下进行了讨论,在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进行编码了),也许有一种更惯用的书写方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句