【问题标题】:Delphi, at design-time, what is the state of ComponentState, ControlState when created with a nil owner?Delphi,在设计时,使用 nil 所有者创建时 ComponentState、ControlState 的状态是什么?
【发布时间】:2020-07-16 11:09:18
【问题描述】:

如果一个函数在设计时执行,并创建一个拥有 nil 的 TComponent / TControl 后代,System.Classes 中的以下代码将不会调用 InsertComponent:

constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end;

因此,我们的新对象不会继承 ComponentState。 依赖于该组件的 csDesigning 标志的条件会发生什么情况?

if csDesigning in ComponentState

【问题讨论】:

  • 问问自己在运行时创建的组件是否在设计时创建过

标签: delphi pascal


【解决方案1】:

条件将呈现False

这意味着作为组件构建者的您,当您显然有意创建一个没有所有者的(子)组件时,任何依赖于该组件是否是由最终用户设计的根本不应该存在 .如果是这样,您将不得不实现一个自定义的“正在设计”状态系统,但您最好重新设计您的需求。

对于被覆盖的组件,您可以自己调用受保护的SetDesigning 方法。

这一切都假设您完全意识到创建没有所有者的设计时子组件通常应该被阻止,除非您有非常令人信服的理由不这样做。请记住,组件托盘上的组件始终应遵循默认的所有者机制。

【讨论】:

  • 据我所知,任何设计时组件都不应该在没有所有者的情况下创建。为什么?如果没有所有者,则无法保证此类组件会被销毁,这可能导致 Delphi IDE 泄漏内存。
  • @SilverWarior 这不是关于组件本身,而是关于内部的子组件。至少这就是我提出的问题。否则你绝对是对的!
  • 是的,但同样的规则适用。除非提及的组件设计正确,否则无法保证提及的子组件将被销毁。因此,依赖一个依赖 Owner 属性并在基组件类中实现的组件通知系统,比让组件开发人员没有搞砸并忘记正确销毁所有子组件所需的代码要安全得多。
  • @NGLN 是的,我指的是在设计时创建组件时的子组件。在可能的情况下应该避免这种情况是有道理的,谢谢!
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 2014-04-04
  • 2022-06-12
  • 2018-01-24
  • 1970-01-01
  • 2015-05-17
  • 2020-03-13
  • 1970-01-01
相关资源
最近更新 更多