我做了两份表格。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; }
}发布于 2014-06-06 10:55:55
正如注释中讨论的那样,在@Remy的帮助下,在TMainForm类中,您需要在销毁它所指向的表单之后将ChildFrom指针设置为NULL。这可以在TChildForm类的析构函数中完成,方法是使用在构造时传递给它的所有者的指针。
问题主要在代码片段中:
if(!ChildForm)
{ ChildForm = new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }第一次,一切都按计划进行。但是,当ChildForm被销毁时,指针不会被重置,下次请求创建ChildForm时,第一个测试就会失败,当然也不会创建表单。
所以:
TChildForm类保留其所有者指针的副本(您可能需要将构造函数原型更改为:
__fastcall儿童表格::TMainForm*owner
为了让TChildForm知道它的所有者的完整类型( #include应该为您提供TMainForm头,或者请求许可)。TMainForm中创建一个方法来处理TChildForm指针重置,并为TChildForm调用它提供正确的访问级别。owner->onChildFormTermination()或类似的东西)在~TChildForm中让它的所有者知道。请注意,我的VCL有点生疏(我已经多年没有用C++Builder编写代码了),可能有一种更惯用的编写方法。
https://stackoverflow.com/questions/24016452
复制相似问题