MDI应用程序 - 无法打开子表单

时间:2014-06-03 13:27:38

标签: c++ c++builder mdi c++builder-6

我做了2个表格。 MainForm和ChildForm(我设置成可用表格)

design>> 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; }
}

1 个答案:

答案 0 :(得分:0)

正如评论中所讨论的那样,并且感谢@Remy Lebeau的帮助,在TMainForm课程中,您需要在ChildFrom之后将NULL指针设置为TChildForm摧毁了它指向的形式。这可以在 if(!ChildForm) { ChildForm = new TChildForm(this); } else { ChildForm->WindowState=wsNormal; } 类的析构函数中完成,方法是使用在构造时传递给它的所有者的指针。

问题基本上在该代码段中:

ChildForm

第一次,一切都按计划进行。但是,当ChildForm被销毁时,指针不会被重置,并且下次请求TChildForm创建时,第一次测试失败,当然表单也没有创建。< / p>

所以:

  • __fastcall TChildForm::TChildForm(TMainForm *owner) 类保留其所有者指针的副本(您可能需要将构造函数原型更改为以下内容:

    TChildForm

    #include知道其所有者的完整类型(IDE应为TMainForm TMainForm标题,或者请求权限这样做。)

  • TChildForm中创建一个方法来处理TChildForm指针重置,并为owner->onChildFormTermination()调用它提供正确的访问级别。

  • ~TChildForm中添加对该方法的调用(即{{1}}或类似内容)以让其所有者知道。

请注意,我的VCL-fu有点生疏(我还没有用C ++ Builder编写10年以上),可能有更惯用的写法。