[英]MDI Application - Cannot open child form
我做了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 Lebeau的帮助,在TMainForm
类中,您需要在ChildFrom
指向它的表单后将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()
添加对该方法的调用(即owner->onChildFormTermination()
或类似的东西),以~TChildForm
其所有者。
请注意,我的VCL-fu有点生锈(我已经有10多年没有使用C ++ Builder进行编码了),也许有一种更惯用的方式编写它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.