【问题标题】:Dynamic Form Creation动态表单创建
【发布时间】:2012-02-10 00:16:11
【问题描述】:

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

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

但是使用这些有什么区别:

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

从我所见,它们似乎都工作相同,但哪个是正确的,或者它们都是正确的,通常是最好使用的?

感谢您的 cmets :)

【问题讨论】:

  • 1.您的第一个示例没有内存泄漏。
  • 回复:您现在删除的关于如何成为一名优秀程序员的问题 - 在向公众发送问题之前阅读精美的手册 - docwiki.embarcadero.com/VCL/en/Forms.TCustomForm.Create。你对哪个论点特别感兴趣?是的,AOwner - 点击链接 - docwiki.embarcadero.com/VCL/en/Classes.TComponent.Owner
  • @user539484 谢谢,我认为我的其他已删除问题将被允许,因为它是与编程相关的问题。
  • AboutForm := TAboutForm.Create(AboutForm) 是非常错误,因为 AboutForm 在传递给构造函数时没有初始化。如果它包含除 NIL 之外的其他内容,您的应用程序可能会崩溃。

标签: delphi


【解决方案1】:

TForm.Create 将Owner 作为参数。

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

Self为参数时,调用的实例为所有者。
Application为参数时,应用程序为所有者。
nil 为参数时,AboutForm 没有所有者。没关系,但在这些情况下,您必须记住自己释放表单。

当你传入一个所有者时,你实际上不需要明确地释放 i。当所有者被释放时,所有者将释放它。

你的代码应该是这样的:

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

【讨论】:

  • 这是有道理的,尤其是@PresleyDias 发布的信息。
  • 还可以看看这篇描述所有者和组件通知系统的文章,以及为什么不为您打算释放自己的组件分配所有者:delphi.about.com/od/kbcurt/ss/dynamiccreateno.htm跨度>
  • 非常感谢,我现在知道传递错误的参数是多么糟糕!
【解决方案2】:

当您动态创建表单时,即表单为available 表单。 您必须通过表单的owner

.. 所以在你的情况下

AboutForm := TAboutForm.Create(Self);

AboutForm := TAboutForm.Create(nil);

AboutForm := TAboutForm.Create(Application);

  1. 自我
  2. 应用

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”。

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

这也是Form Owner

a)Formx.Create(Application) -> 应用程序终止时将释放表单资源

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

c)Formx.Create(nil) -> 你负责释放表单。

这是来自

a在自动创建表单时被delphi使用

b 对于有多个子窗口需要在主窗体关闭时关闭的主窗体很方便

c 便于显示对话窗口

为了释放你可以这样做ACtion := caFree关闭表单。

【讨论】:

    【解决方案3】:

    第一个

    AboutForm := TAboutForm.Create(AboutForm);
    

    告诉TAboutForm,它的Owner是一个对象,之前已经赋值给指针“AboutForm”(也可以是NIL -> no Owner)。

    的“所有者”参数

    TForm.Create(Owner: TComponent) 
    

    告诉表单,它的所有者是谁。 TComponents 在其所有者处注册自己,如果提供的话。所以,主人和它的孩子之间有某种沟通。

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

    因此,

    TAboutForm.Create(Self);
    

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

    TAboutForm.Create(NIL);
    

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

    【讨论】:

    • 你认为第一个可能是对的吗?什么情况下一个TAboutForm应该创建并拥有另一个TAboutForm,然后丢弃对原始的引用并用新的替换它?
    • @RobKennedy:好的,第一个可能是对的!当然,在用新的 ObjRef 覆盖之前,可以创建另一个 TControl 并分配给 AboutForm。我读错了(在奥地利有点晚了;)
    • @RobKennedy 你上面的评论当你这样说的时候很有意义:)
    猜你喜欢
    • 2017-01-31
    • 2011-07-06
    • 2016-11-11
    • 2015-01-25
    • 2020-08-05
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多