15

要求 TComponent 作为所有者来实例化某种对象似乎完全无关紧要。为什么有这么多 Delphi 组件需要这个?

例如,TXMLDocument 需要一个 TComponent 对象来实例化。

为什么会这样,如果有充分的理由,我应该在那里使用什么来“做正确的事”?

4

6 回答 6

38

所有者组件应该管理其所有拥有的组件。当所有者被销毁时,拥有的组件会自动销毁。

这有助于开发人员从工具面板中拖动组件,将它们放到表单上,然后连接事件以完成工作,而无需担心管理组件的生命周期。

表单是放置在其上的所有组件的所有者。Application 对象是表单的所有者。当应用程序关闭时,应用程序对象被破坏,这反过来又破坏了表单和所有组件。

但是创建组件时,所有者并不是真正需要的。如果您将 Nil 传递给参数,则将在没有所有者的情况下创建组件,在这种情况下,您将负责管理组件的生命周期。

于 2009-01-23T21:14:19.403 回答
9

所有 TComponent 后代都需要 Owner,它在 TComponent 构造函数中定义。Owner 组件负责销毁所有的 Owned 组件。

如果要控制寿命,可以将 nil 作为参数传递。

于 2009-01-23T21:29:27.360 回答
3

只是为了添加一些额外的信息。

每个控件也有一个父控件。(一个 TWinControl)。所有者负责生命周期,父母负责显示对象。

例如,一个表单有一个面板,而面板有一个按钮。在这种情况下,表单拥有面板和按钮。但是表单是面板的父级,而面板是按钮的父级。

于 2009-01-23T22:02:55.453 回答
3

还有一点需要注意。我已经使用了多个第三方组件,它们依赖于在构造函数创建中传递的所有者组件,如果你传入 Nil 将引发异常/AV。

最终结果是,当您在 IDE 中使用可视化组件时,这些组件可以正常工作,但在运行时创建它们时会出现问题。

从某种意义上说,造成这些问题的原因是糟糕的设计。规则中没有任何内容表明您不能/不应该将 NIL 作为 aOwner 参数传递。

于 2009-01-26T00:16:21.943 回答
0

You shoudl use this for two reasons: - the ownership mechanism stands also as a kind of garbage collecting system - the ownership mechanism is important in Delphi serialization process (Stream.ReadComponent/WriteComponent etc).

于 2012-06-01T14:03:47.087 回答
0

An Owner parameter is only needed for TComponent descendants, as it is a parameter of the TComponent constructor. All components that are accessible at design-time for dropping on TForm, TFrame, and TDataModule classes are TComponent descendants (which includes TXMLDocument).

于 2012-06-01T18:14:02.903 回答