Delphi TTabControl在TabItem添加关闭按钮


本文整理自网络,侵删。

 

unit uFMXTabItemWithCloseBtn;

 

interface

 

uses

  FMX.TabControl;

 

type

  TTabControlHelper = class helper for TTabControl

  private

    procedure CloseButtonClick(Sender: TObject);

    procedure TimerOnTimer(Sender: TObject);

  public

    procedure CheckCloseBtn(const iBtnResourceName: String = 'closebutton');

  end;

 

implementation

 

uses

  System.UITypes

  , System.Classes

  , FMX.Types

  , FMX.StdCtrls

  ;

 

{ TTabControlHelper }

 

var

  GRemoveTimer: TTimer;

  GIndex: Integer;

  GRemoveTab: TTabItem;

  GTabControlHelperChecked: Boolean = False;

 

procedure TTabControlHelper.CheckCloseBtn;

var

  B: TFmxObject;

  TabItem: TTabItem;

  i: Integer;

begin

  if (GTabControlHelperChecked) then

    Exit;

 

  for i := 0 to TabCount - 1 do begin

    TabItem := Tabs[i];

 

    B := TabItem.FindStyleResource(iBtnResourceName);

 

    if (B <> nil) and (B is TCustomButton) then begin

      B.TagObject := TabItem;

 

      TabItem.AutoSize := False;

      TabItem.Width := TabItem.Width + TCustomButton(B).Width * 1.5;

 

      TCustomButton(B).OnClick := CloseButtonClick;

 

      GTabControlHelperChecked := True;

    end;

  end;

end;

 

procedure TTabControlHelper.CloseButtonClick(Sender: TObject);

var

  TabItem: TTabItem;

  i: Integer;

  Len: Integer;

begin

  if (Sender is TCustomButton) then begin

    GRemoveTab := TTabItem(TCustomButton(Sender).TagObject);

 

    GIndex := -1;

    Len := TabCount - 1;

 

    for i := 0 to Len do begin

      TabItem := Tabs[i];

 

      if (TabItem = GRemoveTab) then begin

        if (i = Len) then begin

          if (Len > 0) then

            GIndex := i - 1;

 

          Break;

        end

        else begin

          GIndex := i;

          Break;

        end;

      end;

    end;

 

    GRemoveTab.Release;

 

    TabIndex := -1;

 

    if (GIndex <> -1) then begin

      GRemoveTimer := TTimer.Create(nil);

      GRemoveTimer.OnTimer := TimerOnTimer;

      GRemoveTimer.Interval := 20;

      GRemoveTimer.Enabled := True;

    end;

  end;

end;

 

procedure TTabControlHelper.TimerOnTimer(Sender: TObject);

var

  Ist: Boolean;

  i: Integer;

begin

  Ist := False;

 

  for i := 0 to TabCount - 1 do

    if (Tabs[i] = GRemoveTab) then begin

      Ist := True;

      Break;

    end;

 

  if (Ist) then

    Exit;

 

  GRemoveTimer.DisposeOf;

  GRemoveTImer := nil;

  GRemoveTab := nil;

 

  TabIndex := GIndex;

end;

 

end.

 

然后在主程序上进行调用

unit Unit1;

 

interface

 

uses

  System.SysUtils

  , System.Types

  , System.Classes

  , System.Generics.Collections

  , FMX.Types

  , FMX.Controls

  , FMX.Graphics

  , FMX.Forms

  , FMX.StdCtrls

  , FMX.TabControl

  ;

 

type

  TForm1 = class(TForm)

    StyleBook1: TStyleBook;

    TabControl1: TTabControl;

    TabItem1: TTabItem;

    TabItem2: TTabItem;

    TabItem3: TTabItem;

    procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);

  private

  public

  end;

 

var

  Form1: TForm1;

 

implementation

 

uses

  uFMXTabItemWithCloseBtn;

 

{$R *.fmx}

 

procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;

  const ARect: TRectF);

begin

  TabControl1.CheckCloseBtn;

end;

 

end.

 

来源:https://www.cnblogs.com/YiShen/p/9722997.html

相关阅读 >>

Delphi获取13位格林治时间实现方法

Delphi的控制台程式添加公司信息、版权信息

Delphi之伪造referer下载文件

Delphi滚动标题栏文字

Delphi 删除动态数组的指定元素

Delphi android 保持唤醒状态

Delphi 10 firedac 连接池设置

Delphi经常用到的公共代码(tools.pas)

Delphi 另类计算程序代码运行耗时

Delphi xe taskbar按钮用法

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...