Link to home
Start Free TrialLog in
Avatar of yehiaeg
yehiaegFlag for Egypt

asked on

Add Close button to Each Tab

HELLO,

i need to add a close button to each tab (TPageControl ot TTabControl)  so i used the drawtab event

// i is an imagelist
i.Draw(tabcontrol1.Canvas,Rect.Right -20,Rect.Top +2,0);

but this seems to remove all the 3d and xp style painting, anyway to make the
control continue the default painting after this line?

Thanks
Yehia
Avatar of Ivanov_G
Ivanov_G
Flag of Bulgaria image

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  Icon : TIcon;
begin
  inherited;
  Icon := TIcon.Create;
  with Control.Canvas do
    begin
      Pen.Color := clBlue;
      ImageList1.GetIcon(0, Icon);
      Draw(Rect.Right - 20, Rect.Top + 2, Icon);
    end;
end;
Avatar of yehiaeg

ASKER

na, didn't work, did u try it?
Avatar of yehiaeg

ASKER

still add the image but the xp style and default painting are gone
Avatar of Lukasz Lach
Lukasz Lach

You can use TMS TAdvPageControl v.1.2 from TMS Software, that has a built-in close button property for each tab.
It's fully functional, however, without source. See:
 - http://torry.net/pages.php?id=164
 - http://www.tmssoftware.com/
Avatar of yehiaeg

ASKER

don't really want to use 3rd parties product, anyother solution?
You could add an imagelist containing the image of a button, set the imagelist property of the pagecontrol to the imagelist and set the imageindex of each tab to the button's index. This approach ensures that you get the default drawing behaviour and reserves space for the "buttons".

Whether you use an imagelist or draw the button yourself, you'll need to determine when the "button" is clicked.  The mousedown of the pagecontrol will see clicks within the tabs and give you a and y coordinates, but you'l need to determine if the mouseclick corresponds to the position of a "button".  If the position of the tabs stays contant (no scrolling or multirow), you could store the limits for each button in your code.
>> na, didn't work, did u try it?
on Windows 2000, I don't have XP installed. :}
Avatar of yehiaeg

ASKER

i added the imagelist and it worked ok, but is there anyway to put the image after the text and not before it?
ASKER CERTIFIED SOLUTION
Avatar of cqhall
cqhall

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Maybe i read the question wrong but.....

why not create buttons and assign the parent of them to the PageControl?  That way you'd have all of the events, properties of the buttons - and could set the Onclick event to the same procedure for all of the buttons.
{pas}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  Button1.Parent:=PageControl1.ActivePage;
end;

end.


{dfm}

object Form1: TForm1
  Left = 244
  Top = 176
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 862
    Height = 613
    ActivePage = TabSheet1
    Align = alClient
    TabOrder = 0
    OnChange = PageControl1Change
    object TabSheet1: TTabSheet
      Caption = 'TabSheet1'
      object Button1: TButton
        Left = 760
        Top = 544
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
        OnClick = Button1Click
      end
    end
    object TabSheet2: TTabSheet
      Caption = 'TabSheet2'
      ImageIndex = 1
    end
    object TabSheet3: TTabSheet
      Caption = 'TabSheet3'
      ImageIndex = 2
    end
  end
end