【问题标题】:MDI Application - Cannot open child formMDI 应用程序 - 无法打开子窗体
【发布时间】:2014-06-03 13:27:38
【问题描述】:

我做了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; }
}

【问题讨论】:

  • 某事告诉我,您还需要在 FormClose 的正文中将 ChildForm 设置为 NULL。
  • TChildForm::TChildForm 中的代码是什么?如果它以某种方式保留了它所获得的指向TMainForm 的指针的副本,那么应该可以告诉它重置它所持有的ChildForm 指针。
  • @didierc:这是正确的答案,因此您应该将其发布为答案,而不是评论。但是,我建议在孩子的析构函数中重置指针,而不是在 OnClose 事件中。
  • @didierc:谢谢.. 它的工作。 :)

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


【解决方案1】:

正如 cmets 中所讨论的,感谢@Remy Lebeau 的帮助,在TMainForm 类中,您需要在销毁它指向的表单后将ChildFrom 指针设置为NULL .这可以在TChildForm 类的析构函数中完成,方法是使用在构造时传递给它的所有者的指针。

问题基本上在于代码 sn-p:

  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 调用它。

  • 在~TChildForm 中添加对该方法的调用(即owner-&gt;onChildFormTermination() 或类似的东西),让其所有者知道。

请注意,我的 VCL-fu 有点生疏(我已经有 10 多年没有使用 C++Builder 编写代码了),可能有更惯用的方式来编写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多