动态表单创建

时间:2012-02-10 00:16:12

标签: delphi

我在运行时创建我的表单,如下所示:

AboutForm := TAboutForm.Create(AboutForm);
try
  AboutForm.ShowModal;
finally
  AboutForm.Free;
end;

但是使用其中任何一个有什么区别:

AboutForm := TAboutForm.Create(Self);
AboutForm := TAboutForm.Create(nil);
AboutForm := TAboutForm.Create(Application);

他们似乎从我能看到的东西看起来都是一样的但是正确的,或者它们都是正确的,这通常是最好用的?

感谢您的评论:)

3 个答案:

答案 0 :(得分:8)

TForm.Create将Owner作为参数。

在您的第一个示例中,AboutForm是所有者。这显然是一个坏主意,因为它尚未创建。

Self是参数时,进行调用的实例是所有者 当Application是参数时,应用程序是所有者 当nil是参数时,AboutForm不具有所有者。这一切都很好,但在这种情况下你必须记得自己解雇表格。

当你传递给主人时,你实际上并不需要明确地释放我。当所有者被释放后,所有者将释放它。

这就是您的代码的样子:

AboutForm := TAboutForm.Create(nil);
try
  AboutForm.ShowModal;
finally
  AboutForm.Free;
end;

答案 1 :(得分:5)

当您动态创建表单时,表单为available表单。 您必须传递表单的owner

enter image description here

.. 所以在你的情况下

  

AboutForm:= TAboutForm.Create(Self);

     

AboutForm:= TAboutForm.Create(nil);

     

AboutForm:= TAboutForm.Create(Application);

  1. 应用
  2. 是for AboutForm的所有者(您可能已经知道)

    But what is the difference though in using any of these:

    这是来自about.com-Form Owner

    的内容
      

    nil - 指定没有对象拥有表单 - 因此开发人员(您)负责释放创建的表单(通过在不再需要表单时调用myForm.Free)

         

    Self - 指定调用方法的对象。例如,如果您正在从Button的OnClick处理程序(此按钮放在MainForm上)中创建TMyForm表单的新实例 - self指的是“MainForm”。因此,当MainForm被释放时 - 它也将释放“MyForm”。

         

    应用程序 - 指定运行应用程序时创建的全局TApplication类型变量。 “应用程序”封装了您的应用程序,并提供了在程序后台发生的许多功能。

    这也是Form Owner

      

    a)Formx.Create(应用程序) - >申请被终止时,表格资源将被释放

         b)Formx.Create(Self) - >销毁所有者对象时释放表单资源(如果Self是TComponent的后代)

         c)Formx.Create(nil) - >你有责任解放表格。

    这是来自

      表单自动处理时,delphi使用

    a

         

    b 对于包含多个子窗口的主窗体非常方便,这些窗口需要在主窗体关闭时关闭

         

    c 非常便于显示对话框窗口

    为了免费,你可以ACtion := caFree关闭表格。

答案 2 :(得分:2)

第一个

AboutForm := TAboutForm.Create(AboutForm);

告诉TAboutForm,它的所有者是一个对象,之前已经分配给指针“AboutForm”(也可能是NIL - >没有所有者)。

的“所有者”参数
TForm.Create(Owner: TComponent) 

告诉表单,谁是它的所有者。如果提供了一些,TComponents会在其所有者处注册。所以,主人和孩子之间有某种沟通方式。

示例:如果所有者被释放,他也可以释放它拥有的组件。

因此,

TAboutForm.Create(Self);

表示“自我”是新TAboutForm的所有者,如果(Self is TComponent)

TAboutForm.Create(NIL);

也是一个可以接受的解决方案,但在这里,你必须自己释放组件(除了你在MDI窗口中创建TAboutForm)。