Firemonkey 在Common Controls 页面中有自己的TTabControl(默认情况下)。您可以使用TStylebook 设置它的样式。例如,我很有信心可以在标签本身上添加一个关闭按钮。
毕竟,FMX 是一个基于矢量的框架,因此所有视觉元素都必须存在于样式中。为此,您可能希望将样式加载到 TStylebook 中,因为我无法找到将默认样式加载到其中的方法。向下导航到tabitemstyle,然后您就可以从那里调整它的视觉外观。只需根据需要添加关闭按钮(对齐、布局等)。
回到您的应用程序代码中,您将寻求使用FindStyleResource 例程来设置代码(XE2 使用FindBinding,因此您需要设置BindingName 属性)。我将假设您的关闭按钮称为“关闭按钮”(不带引号);
var
MyTab : TTabItem;
begin
MyTab := ((TabItem1 as TTabItem).FindStyleResource('CloseButton') as TButton).OnClick := TabClose;
end;
您希望在最初创建选项卡时添加该代码,或者如果在设计时创建所有选项卡,您需要在 FormCreate 中运行它。您基本上是在告诉它,当单击 CloseButton 时,您想要调用通知事件/过程TabClose。此过程与单击按钮相同。
您甚至可以将选项卡的StyleName 属性更改为CloseButton+Index_of_tab。
现在,至于关闭选项卡本身的代码,类似这个未经测试的示例可能会起作用,尽管您需要对其进行迭代。
procedure TForm1.TabClose(Sender: TObject);
var
_mytab : Integer;
_activetab : Integer;
begin
_activetab := ((Sender as TTabItem).Parent as TTabControl).ActiveTab.Index;
_mytab := ((Sender as TTabItem).Parent as TTabControl).ActiveTab.Index;
((Sender as TTabItem).Parent as TTabControl).Tabs[_MyTab].Free;
((Sender as TTabItem).Parent as TTabControl).TabIndex := _activetab;
end;
现在,这是聪明的部分,并利用了框架的设计。当您单击另一个元素内的样式元素时,默认情况下,它将选择父元素。在此示例中,它将选择包含用户单击的关闭按钮的选项卡。然后,它将关闭该选项卡(从技术上讲,它会释放它,我在开发中没有过多处理选项卡,因此您需要研究“关闭”它们的正确方法)。
这有一个问题;如果您希望切换回之前活动的选项卡,您可能希望找到一种更好的方法来检测之前的活动选项卡。现在,它只会打开您刚刚关闭的选项卡之后的选项卡(由于选项卡计数现在减少 1,因此活动选项卡索引选择下一个物理选项卡)。您可能可以通过将_activetab 代码拆分到别处来做到这一点。
我用自己的一些程序做过类似的事情,这就是我通常创建“混合”组件的方式。您实质上是在利用框架的模块化设计,使其做您想做的事情,而无需依赖第三方组件。