я начал делать, но когда закончу не знаю. чтоб облегчить работу привожу набросок
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Tabs, StdCtrls, ComCtrls, ExtCtrls;
type TMyTabButton = Class;
TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
TMyTabButton = Class(Tpanel) protected FCaption : AnsiString; Procedure SetCapion(aCaption : AnsiString); Procedure Paint(var Message: TWMPaint); message WM_PAINT; public Property Caption : AnsiString read FCaption write SetCapion; constructor Create(AOwner: TComponent); override; destructor Destroy; Private textTop : Integer; textLeft : Integer; b : TButton; cnv : TCanvas; end;
TMyTabset = Class(Tpanel) protected Buttons : TList; Function GetItem(index : integer) : TMyTabButton; Function GetCount : integer; public constructor Create(AOwner: TComponent); override; destructor Destroy; procedure add(aCaption : AnsiString); procedure Insert(index : Integer;aCaption : AnsiString); procedure Delete(index : Integer); procedure Press(Sender: TObject); Property Items[index : integer] : TMyTabButton read GetItem; Property Count : integer read GetCount; end;
var Form1: TForm1; t : TMyTabset;
implementation
{$R *.dfm}
constructor TMyTabButton.Create(AOwner: TComponent); var l, W : Integer; Begin inherited Create(AOwner); parent := TWinControl(AOwner); b := TButton.Create(self); b.Parent := TPanel(self); FCaption := 'newtab';
cnv := TCanvas.Create; cnv.Handle := GetDC(self.Handle); cnv.Brush.Color := clBtnFace;
Width := cnv.TextWidth(FCaption) + 40; Height := 22;
b.Width := 16; b.Height := 16;
b.Top := (Height div 2) - (b.Height div 2); b.Left := Width - b.Width - 2;
w := cnv.TextWidth(FCaption); l := cnv.TextHeight(FCaption); textLeft := (Width div 2) - (w div 2) - 5; textTop := (Height div 2) - (l div 2) - 1; end;
Procedure TMyTabButton.Paint(var Message: TWMPaint); Begin inherited; cnv.TextOut(textLeft, textTop, FCaption); end;
Procedure TMyTabButton.SetCapion(aCaption : AnsiString); var l, W : Integer; Begin Width := cnv.TextWidth(aCaption) + 30;
FCaption := aCaption;
b.Top := (Height div 2) - (b.Height div 2); b.Left := Width - b.Width - 2;
w := cnv.TextWidth(FCaption); l := cnv.TextHeight(FCaption); textLeft := (Width div 2) - (w div 2) - 5; textTop := (Height div 2) - (l div 2) - 1; repaint; end;
destructor TMyTabButton.Destroy; Begin cnv.Free; b.Free; inherited Destroy; end;
constructor TMyTabset.Create(AOwner: TComponent); Begin inherited Create(AOwner); parent := TWinControl(AOwner); Buttons := TList.Create; end;
destructor TMyTabset.Destroy; Begin Buttons.Free; inherited Destroy; end;
procedure TMyTabset.add(aCaption : AnsiString); var Cr : TMyTabButton; aux : TMyTabButton; Begin Cr := TMyTabButton.Create(self); Cr.Caption := aCaption; Buttons.Add(Pointer(Cr)); if Buttons.Count > 1 then Begin aux := Items[Count - 2]; Cr.Left := aux.Left + aux.Width; end else Cr.Left := 2;
Cr.Top := 1;
Cr.OnClick := self.Press; Repaint; end;
procedure TMyTabset.Insert(index : Integer;aCaption : AnsiString); Begin
end;
procedure TMyTabset.Delete(index : Integer); var i : integer; aux1, aux2 : TMyTabButton; Begin Items[index].Free; Buttons.Delete(index); if Buttons.Count = 0 then exit; if index <> 0 then For i := index to (Buttons.Count - 1) do Items[i].Left := Items[i - 1].Left + Items[i - 1].Width else Begin Items[index].Left := 2; Items[index].Top := 1; For i := (index + 1) to Count - 1 do Items[i].Left := Items[i - 1].Left + Items[i - 1].Width; end; end;
Function TMyTabset.GetItem(index : integer) : TMyTabButton; Begin result := TMyTabButton(self.Buttons.Items[index]); end;
Function TMyTabset.GetCount : integer; Begin Result := buttons.Count; end;
procedure TMyTabset.Press(Sender: TObject); var i : integer; begin
// For i := 0 to self.Buttons.Count if TMyTabButton(Sender).BevelOuter = bvLowered then Begin TMyTabButton(Sender).BevelOuter := bvRaised; TMyTabButton(Sender).textLeft := TMyTabButton(Sender).textLeft - 1; TMyTabButton(Sender).textTop := TMyTabButton(Sender).textTop - 1; TMyTabButton(Sender).b.Left := TMyTabButton(Sender).b.Left - 1; TMyTabButton(Sender).b.top := TMyTabButton(Sender).b.top - 1; end else Begin TMyTabButton(Sender).BevelOuter := bvLowered; TMyTabButton(Sender).textLeft := TMyTabButton(Sender).textLeft + 1; TMyTabButton(Sender).textTop := TMyTabButton(Sender).textTop + 1; TMyTabButton(Sender).b.Left := TMyTabButton(Sender).b.Left + 1; TMyTabButton(Sender).b.top := TMyTabButton(Sender).b.top + 1; end;
repaint; end;
procedure TForm1.FormCreate(Sender: TObject); begin t := TMyTabset.Create(self); t.add('SomeCaption1'); t.add('SomeCaption2'); t.add('SomeCaption3'); t.add('SomeCaption4'); t.Top := 10; t.Left := 10; t.Width := 400; t.Height := 24; end;
procedure TForm1.Button1Click(Sender: TObject); begin t.Delete(1); end;
end.
|
|