繁体   English   中英

MDI应用程序-无法打开子窗体

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM