电竞比分网-中国电竞赛事及体育赛事平台

分享

Delphi XE7實(shí)現(xiàn)TTabControl在TabItem添加關(guān)閉按鈕

 A芝蘭之室 2017-10-20






介紹

本文章介紹了Delphi XE7實(shí)現(xiàn)TTabControl在TabItem添加關(guān)閉按鈕,該程序使用到了uFMXTabItemWithCloseBtn,在這個(gè)單元中實(shí)現(xiàn)了點(diǎn)擊按鈕關(guān)閉tabitem的功能,具體代碼如下:
  1. unit uFMXTabItemWithCloseBtn;

  2. interface

  3. uses
  4.   FMX.TabControl;

  5. type
  6.   TTabControlHelper = class helper for TTabControl
  7.   private
  8.     procedure CloseButtonClick(Sender: TObject);
  9.     procedure TimerOnTimer(Sender: TObject);
  10.   public
  11.     procedure CheckCloseBtn(const iBtnResourceName: String = 'closebutton');
  12.   end;

  13. implementation

  14. uses
  15.   System.UITypes
  16.   , System.Classes
  17.   , FMX.Types
  18.   , FMX.StdCtrls
  19.   ;

  20. { TTabControlHelper }

  21. var
  22.   GRemoveTimer: TTimer;
  23.   GIndex: Integer;
  24.   GRemoveTab: TTabItem;
  25.   GTabControlHelperChecked: Boolean = False;

  26. procedure TTabControlHelper.CheckCloseBtn;
  27. var
  28.   B: TFmxObject;
  29.   TabItem: TTabItem;
  30.   i: Integer;
  31. begin
  32.   if (GTabControlHelperChecked) then
  33.     Exit;

  34.   for i := 0 to TabCount - 1 do begin
  35.     TabItem := Tabs[i];

  36.     B := TabItem.FindStyleResource(iBtnResourceName);

  37.     if (B <> nil) and (B is TCustomButton) then begin
  38.       B.TagObject := TabItem;

  39.       TabItem.AutoSize := False;
  40.       TabItem.Width := TabItem.Width + TCustomButton(B).Width * 1.5;

  41.       TCustomButton(B).OnClick := CloseButtonClick;

  42.       GTabControlHelperChecked := True;
  43.     end;
  44.   end;
  45. end;

  46. procedure TTabControlHelper.CloseButtonClick(Sender: TObject);
  47. var
  48.   TabItem: TTabItem;
  49.   i: Integer;
  50.   Len: Integer;
  51. begin
  52.   if (Sender is TCustomButton) then begin
  53.     GRemoveTab := TTabItem(TCustomButton(Sender).TagObject);

  54.     GIndex := -1;
  55.     Len := TabCount - 1;

  56.     for i := 0 to Len do begin
  57.       TabItem := Tabs[i];

  58.       if (TabItem = GRemoveTab) then begin
  59.         if (i = Len) then begin
  60.           if (Len > 0) then
  61.             GIndex := i - 1;

  62.           Break;
  63.         end
  64.         else begin
  65.           GIndex := i;
  66.           Break;
  67.         end;
  68.       end;
  69.     end;

  70.     GRemoveTab.Release;

  71.     TabIndex := -1;

  72.     if (GIndex <> -1) then begin
  73.       GRemoveTimer := TTimer.Create(nil);
  74.       GRemoveTimer.OnTimer := TimerOnTimer;
  75.       GRemoveTimer.Interval := 20;
  76.       GRemoveTimer.Enabled := True;
  77.     end;
  78.   end;
  79. end;

  80. procedure TTabControlHelper.TimerOnTimer(Sender: TObject);
  81. var
  82.   Ist: Boolean;
  83.   i: Integer;
  84. begin
  85.   Ist := False;

  86.   for i := 0 to TabCount - 1 do
  87.     if (Tabs[i] = GRemoveTab) then begin
  88.       Ist := True;
  89.       Break;
  90.     end;

  91.   if (Ist) then
  92.     Exit;

  93.   GRemoveTimer.DisposeOf;
  94.   GRemoveTImer := nil;
  95.   GRemoveTab := nil;

  96.   TabIndex := GIndex;
  97. end;

  98. end.
復(fù)制代碼

然后在主程序上進(jìn)行調(diào)用
  1. unit Unit1;

  2. interface

  3. uses
  4.   System.SysUtils
  5.   , System.Types
  6.   , System.Classes
  7.   , System.Generics.Collections
  8.   , FMX.Types
  9.   , FMX.Controls
  10.   , FMX.Graphics
  11.   , FMX.Forms
  12.   , FMX.StdCtrls
  13.   , FMX.TabControl
  14.   ;

  15. type
  16.   TForm1 = class(TForm)
  17.     StyleBook1: TStyleBook;
  18.     TabControl1: TTabControl;
  19.     TabItem1: TTabItem;
  20.     TabItem2: TTabItem;
  21.     TabItem3: TTabItem;
  22.     procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
  23.   private
  24.   public
  25.   end;

  26. var
  27.   Form1: TForm1;

  28. implementation

  29. uses
  30.   uFMXTabItemWithCloseBtn;

  31. {$R *.fmx}

  32. procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  33.   const ARect: TRectF);
  34. begin
  35.   TabControl1.CheckCloseBtn;
  36. end;

  37. end.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多