TTabControl 选项卡有一个“圆圈”来显示“已更改”和一个 [x] 关闭按钮

问题描述 投票:0回答:1

有没有简单的方法可以在Firemonkey中做类似Delphi IDE的选项卡而不继承

TTabControl

  1. 当该选项卡的内容更改时显示“实心圆圈”(即使选项卡未处于活动状态)
  2. 仅在活动选项卡上显示 [X](但如果
    TTabItem
    内容更改,则显示“实心圆圈”)

我看到了创建运行时TTabItem,firemonkey,但代码似乎有点复杂。

我应该从哪里开始看呢? OnPaint 事件?

delphi firemonkey tabcontrol
1个回答
0
投票

恕我直言,您应该使用自定义样式。 Custom Style

向样式添加实心圆应该很容易

这是我如何使用它的示例,“模拟 MDI 或对接应用程序”

procedure TMain.btnParametresClick(Sender: TObject);
var  F : TFormParam;
     ATabItem : TTabItem;
begin
// si existe déjà
if Liste.ContainsKey('Parametres')
  then begin
    TabControl1.ActiveTab:=IndexTab('Paramètres');
  end
else begin
// si non créé
  F:=TFormParam.Create(Self);
  ATabItem:=TabControl1.Add();
  // ajout à la liste
  Liste.Add('Parametres',F);
  ATabItem.Text:='Paramètres';
  ATabItem.StyleLookup:='CloseTabItem';
  TButton(ATabItem.FindStyleResource('btnCloseTab')).OnClick:=CloseTab;
  TButton(ATabItem.FindStyleResource('btnCloseTab')).TagObject:=ATabItem;
  TButton(ATabItem.FindStyleResource('btnCloseTab')).TagString:='Parametres';
  ATabItem.AddObject(F.MainLayout);
  TabControl1.TabIndex:=TabControl1.TabCount-1; // onglet actif=nouvelle fenêtre
end;
Multiview1.HideMaster;
end;

但是与按钮交互有点棘手。 要关闭我的表单相关选项卡,我使用这个

procedure TMain.CloseTab(Sender: TObject);
var F : TForm;
begin
 if not Datas.PeutFermer then Exit;

 if TabControl1.TabIndex=TabControl1.TabCount-1 then TabControl1.Previous else TabControl1.Next;

 if Liste.TryGetValue(TButton(Sender).TagString,F) then
   F.Close;

 TTask.Run(
    procedure
    begin
      TThread.Synchronize(nil,
        procedure
        begin
         TButton(Sender).TagObject.DisposeOf;
         if TabControl1.TabIndex>TabControl1.TabCount-1
           then TabControl1.TabIndex:=TabControl1.TabCount-1
        end);
    end);
 Liste.Remove(TButton(Sender).TagString);
end; 
© www.soinside.com 2019 - 2024. All rights reserved.