如何在 FMX 设计时与非存储 child 控件交互? (TTabControl 选项卡内容)

How to interact with non stored child controls in FMX design time? (TTabControl Tab Content)

这三天我一直在扫描TTabControl的代码,我发现了以下内容:

  1. 该控件将接受 child 控件,但会根据它所处的状态重定向它们,例如: 如果 child 是 TTabItem 它将分配给用作标签容器的 FContent: TContent,否则如果 child 是一个特殊控件(TEffect, TAnimation ...) 它将被添加到 TTabControl 否则如果有一个活动选项卡 child 将被重定向到那个,否则它将被重定向到 FNoItemsContent: TContent 不可见控件(不知道为什么!!!).
  2. 当 child 被重定向到活动选项卡时,它将被重定向到选项卡的 FContent: TContent 成员(在设计时会调整位置)。

这里重定向的意思是parent将child分配给哪个

所以 Child.Parent := TabControl; 触发了上面的内容,这是执行此操作的方法。

procedure TTabControl.AddOrInsertObject(const AObject: TFmxObject; const Index: Integer = MaxInt);

令我困惑的是以下是非存储控件,但它们在 child.

的设计和运行时是 parents

存储了TTabItem,所以在IDE中添加选项卡时(右键单击添加新TabItem),您将在结构面板中看到TTabItems是选项卡控件的 children,放下另一个控件,您将看到它是活动选项卡的 child(TTabItem 而不是其 FContent)。

您可以与控件和所有控件进行交互。

我的问题

这个机制背后的想法是什么,如果我想从头开始,如何做同样的事情?

我想要的是设计时功能。

我看到代码覆盖了 DoAddObject 和 DoInsertObject,从两者调用 AddOrInsertObject,Add 不传递索引,因此它使用后一种方法的默认值,即 MaxInt。

在那个方法中它写道:

// If AObject is TabItem, then we add it to the tab items container (FContent)
// If AObject is Effect, Animation, Style resource, we add it to the Self
// In all other cases, we add AObject to active tab or special container (FNoItemsContent)

从下往上看:

显然,当 TTabControl 没有选项卡到 add/insert 子项到

时,将使用 FNoItemsContent

这就像我认为他们正在使用的委托模式,以便您可以与 TTabControl 本身交互,如果可用,它会将其传递到当前选项卡(除了 Effect、Animation、Style 特殊对象之外)添加到TTabControl itSelf)

当然,如果您尝试添加 TTabItem,它将被添加到选项卡集合(选项卡项目容器,又名 FContent)