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

Posted

技术标签:

【中文标题】如何在 FMX 设计时与非存储子控件交互? (TTabControl 选项卡内容)【英文标题】:How to interact with non stored child controls in FMX design time? (TTabControl Tab Content) 【发布时间】:2020-12-21 22:59:59 【问题描述】:

这三天我一直在扫TTabControl的二维码,发现如下:

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

这里重定向这个词的意思是将孩子分配给哪个父母。

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

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

让我感到困惑的是,以下是非存储控件,但它们是孩子设计和运行时的父母。

TTabItem.FContentTTabControl.FContentTTabControl.FNoItemContent

TTabItem是存储的,所以在IDE中当你添加一个tab时(右键add new TabItem),你会在结构面板中看到TTabItems是tab控件的children,drop另一个控件您会看到它是活动选项卡的子项(TTabItem 而不是它的 FContent)。

您可以与控件进行交互。

我的问题

这个机制背后的想法是什么,如果我想从头开始怎么做?

我想要的是设计时功能。

【问题讨论】:

这个机制背后的想法是什么” - 听起来你应该直接问 Embarcadero,因为他们就是这样设计的。 @RemyLebeau 我想我最终将不得不这样做,我在这里问这个的原因只是为了从知识渊博的人那里获得更快的答案。也许有人不得不做我在这里想做的事情。 【参考方案1】:

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

在那个方法中它写道:

// 如果 AObject 是 TabItem,那么我们将它添加到选项卡项容器 (FContent) // 如果AObject是Effect, Animation, Style资源,我们添加到Self // 在所有其他情况下,我们将 AObject 添加到活动选项卡或特殊容器 (FNoItemsContent)

自下而上:

显然,当 TTabControl 没有选项卡可添加/插入子项时使用 FNoItemsContent

它就像我认为他们正在使用的委托模式,以便您可以与 TTabControl 本身进行交互,并将其传递到当前选项卡(如果可用)(效果、动画、样式要添加的特殊对象除外)到 TTabControl itSelf)

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

【讨论】:

非常感谢,我记得在这个问题之后我得出了相同的结论并进行了自定义控件。我也不记得你引用的 cmets(当时我在 10.3.3)。无论如何,我希望我们有更多的选项来对这些控件进行子类化,它们中的大多数都隐藏了你需要的好功能,迫使你复制整个控制单元来覆盖一个功能。

以上是关于如何在 FMX 设计时与非存储子控件交互? (TTabControl 选项卡内容)的主要内容,如果未能解决你的问题,请参考以下文章

FMX TListView 动态添加Item和Item里面的Object

Delphi FMX组件重影去除子组件

如何在使用 cssSelector 清除 Chrome 浏览器的浏览数据时与 #shadow-root (open) 中的元素进行交互

一个支持FMX.Win框架的托盘控件

如何将 CDialog::SetDefId 与非按钮控件一起使用?

FMX布局:TLayout和TScaledLayout