Delphi,在设计时,ComponentState、ControlState 在创建时拥有者为 nil 时的状态是什么?

Delphi, at design-time, what is the state of ComponentState, ControlState when created with a nil owner?

如果函数在设计时执行,并创建一个拥有者为 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

条件将呈现 False

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

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

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