如何在 FMX 设计时与非存储 child 控件交互? (TTabControl 选项卡内容)
How to interact with non stored child controls in FMX design time? (TTabControl Tab Content)
这三天我一直在扫描TTabControl
的代码,我发现了以下内容:
- 该控件将接受 child 控件,但会根据它所处的状态重定向它们,例如:
如果 child 是
TTabItem
它将分配给用作标签容器的 FContent: TContent
,否则如果 child 是一个特殊控件(TEffect, TAnimation ...
) 它将被添加到 TTabControl
否则如果有一个活动选项卡 child 将被重定向到那个,否则它将被重定向到 FNoItemsContent: TContent
不可见控件(不知道为什么!!!).
- 当 child 被重定向到活动选项卡时,它将被重定向到选项卡的
FContent: TContent
成员(在设计时会调整位置)。
这里重定向的意思是parent将child分配给哪个
所以 Child.Parent := TabControl;
触发了上面的内容,这是执行此操作的方法。
procedure TTabControl.AddOrInsertObject(const AObject: TFmxObject; const Index: Integer = MaxInt);
令我困惑的是以下是非存储控件,但它们在 child.
的设计和运行时是 parents
TTabItem.FContent
.
TTabControl.FContent
.
TTabControl.FNoItemContent
.
存储了TTabItem
,所以在IDE中添加选项卡时(右键单击添加新TabItem),您将在结构面板中看到TTabItem
s是选项卡控件的 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)
这三天我一直在扫描TTabControl
的代码,我发现了以下内容:
- 该控件将接受 child 控件,但会根据它所处的状态重定向它们,例如:
如果 child 是
TTabItem
它将分配给用作标签容器的FContent: TContent
,否则如果 child 是一个特殊控件(TEffect, TAnimation ...
) 它将被添加到TTabControl
否则如果有一个活动选项卡 child 将被重定向到那个,否则它将被重定向到FNoItemsContent: TContent
不可见控件(不知道为什么!!!). - 当 child 被重定向到活动选项卡时,它将被重定向到选项卡的
FContent: TContent
成员(在设计时会调整位置)。
这里重定向的意思是parent将child分配给哪个
所以 Child.Parent := TabControl;
触发了上面的内容,这是执行此操作的方法。
procedure TTabControl.AddOrInsertObject(const AObject: TFmxObject; const Index: Integer = MaxInt);
令我困惑的是以下是非存储控件,但它们在 child.
的设计和运行时是 parentsTTabItem.FContent
.TTabControl.FContent
.TTabControl.FNoItemContent
.
存储了TTabItem
,所以在IDE中添加选项卡时(右键单击添加新TabItem),您将在结构面板中看到TTabItem
s是选项卡控件的 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)