大家都知道,TPageControl在设计时可手动添加每一页,我现在要求在每一页中再增加一个关闭按钮,主要是用来关闭PAGE[ITEMINDEX],并且是做成控件,其实也看了下源码,感觉晕晕的,要加的那段居然是私有的,可能是自己太弱了,还请各位给予指点,不胜感激,多谢了,其实也没太大作用,就是客户有这要求,没办法,双击关闭不是挺好的嘛,还要加个按钮,我看ULTRAEDIT也没这样做啊!多谢各位了!

解决方案 »

  1.   

    没太明白按钮加在哪,是页头上还是页面上.ULTRAEDIT只是在ToolBar多加了一个按钮.好像是多页头似的.
      

  2.   

    作个button9,它的caption写成一个x,把它的大小尽量调整到最小
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
            Button9.Top := PageControl1.Top + PageControl1.TabRect(PageControl1.ActivePageIndex).Top;
            Button9.Left := PageControl1.Left + PageControl1.TabRect(PageControl1.ActivePageIndex).Left;
    end;如果觉得button在点击后变得不太好看,可以换成别的点击前后没有外观变化的组件就可以了。
    注意:
    1.PageControl1需要把全部的TabSheet的caption都前导几个空格,这样关闭按钮不会挡住caption;
    2.PageControl1的所有的TabSheet都能显示全,否则button的位置对不准,呵呵,没有细研究,将就着用吧。
      

  3.   

    TO erhan() :我要写成控件啊!写在哪啊?TPAGECONTROL是继承TCustomTabControl
      

  4.   

    我试过raize,还是不行啊,那个不能分TAB控制啊,我要每个TAB上都有个按纽,行不?能实现吗?
      

  5.   

    我那个不行吗?而且那个带叉叉的按钮还可以跟着选中的tab来回走哈啊。
      

  6.   

    请参考如下代码,并稍作修改
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, CommCtrl, Buttons, StdCtrls;type
      TPageControlEx = class(TPageControl)
      private
        FCloseBtn: TSpeedButton;
      protected
        procedure CloseBtnClick(Sender: TObject);
        procedure DrawTab(TabIndex: Integer; const Rect: TRect;
          Active: Boolean); override;
        property OwnerDraw;
        property OnDrawTab;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
      end;  TForm1 = class(TForm)
        btnAddBtn: TButton;
        procedure btnAddBtnClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        PC: TPageControlEx;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TPageControlEx }procedure TPageControlEx.CloseBtnClick(Sender: TObject);
    begin
      if Self.ActivePage <> nil then
        Self.ActivePage.Free;
      if Self.ActivePage = nil then
        FCloseBtn.Hide;
    end;constructor TPageControlEx.Create(AOwner: TComponent);
    begin
      inherited;
      FCloseBtn := TSpeedButton.Create(Self);
      FCloseBtn.Flat := True;
      FCloseBtn.Width := 16;
      FCloseBtn.Height := 16;
      FCloseBtn.Caption := 'X';
      FCloseBtn.OnClick := CloseBtnClick;
      OwnerDraw := True;
    end;destructor TPageControlEx.Destroy;
    begin
      FCloseBtn.Free;
      inherited;
    end;procedure TPageControlEx.DrawTab(TabIndex: Integer; const Rect: TRect;
      Active: Boolean);
    var
      NewTabWidth: Integer;
      R: TRect;
    begin
      inherited;
      NewTabWidth := Canvas.TextWidth(Tabs[TabIndex]) + 24;
      if (Rect.Right - Rect.Left) < NewTabWidth then
        TabWidth := NewTabWidth;
      TabCtrl_GetItemRect(Handle, TabIndex, R);
      if Active then
      begin
        FCloseBtn.Parent := Self;
        FCloseBtn.Left := Rect.Left + 2;
        FCloseBtn.Top := Rect.Top + 2;
        FCloseBtn.Show;
        Canvas.TextOut(R.Left + 20, R.Top + 2, Tabs[TabIndex]);
      end
      else begin
        Canvas.TextOut(R.Left + 2, R.Top + 2, 'X');
        Canvas.TextOut(R.Left + 16, R.Top + 2, Tabs[TabIndex]);
      end;
    end;procedure TForm1.btnAddBtnClick(Sender: TObject);
    begin
      with TTabSheet.Create(PC) do
      begin
        PageControl := PC;
        Caption := 'hello world';
      end;
      with TTabSheet.Create(PC) do
      begin
        PageControl := PC;
        Caption := '你好,世界';
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      PC := TPageControlEx.Create(Self);
      PC.Parent := Self;
    end;end.
      

  7.   

    真的是非常感谢大家,特别是linzhengqun(风。我回来了) :你的代码我已经测试了,不过不是很懂,只能是自己看了,我刚学写控件,其实也没办法,刚换的工作,需要做这个,我以前没做过,希望以后还请各位多多支持.
    另外:linzhengqun(风。我回来了) :我试了一下,再做删除每页的时候,把最后一页删除完后那个PAGECONTROL上还有个按钮,但是TABSHEET已经删除完了,不过运行的时候看不到,我想可能是这个原因吧,在CREATE的时候,就创建了,然后每加一个TABSHEET会加一个,就是说有TABSHEET+1个,是不?不知道我说的对不对?我想修改不知道怎么改?谢谢了,再帮我看一下,回头就结贴,另再给你50分,肯定不会失言的,因为毕竟以后还要相互学习呢,是吧,多谢了
      

  8.   

    var       
    Tabarr:array of TTabSheet;
    btnarr:array of TButton;----new
    SetLength(Tabarr, Length(Tabarr)+1);
    Tabarr[Length(Tabarr)-1]:=TTabSheet.Create(Self);
    Tabarr[Length(Tabarr)-1].Name:='TabArr'+inttostr(Length(Tabarr));
    Tabarr[Length(Tabarr)-1].PageControl:=PageControl1;SetLength(btnarr, Length(btnarr)+1);
    btnarr[Length(btnarr)-1]:=TButton.Create(Self);
    btnarr[Length(btnarr)-1].Name:='btnarr'+inttostr(Length(btnarr));
    btnarr[Length(btnarr)-1].Parent:=Tabarr[Length(Tabarr)-1];
    btnarr[Length(btnarr)-1].OnClick:=....关闭