我自己写的代码type TBtnInfo = Record Button: TButton; //FTop : integer; end; BtnInfoArr = Array of TBtnInfo; TForm1 = class (TForm) Panel1: TPanel; btn1: TButton; tv1: TTreeView; btn2: TButton; btn3: TButton; btn4: TButton; btn5: TButton; tv2: TTreeView; tv3: TTreeView; tv4: TTreeView; tv5: TTreeView; Edit1: TEdit; Label1: TLabel; procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); procedure btn3Click(Sender: TObject); procedure btn4Click(Sender: TObject); procedure btn5Click(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); procedure FormCreate(Sender: TObject); private procedure TreeViewMoveTo(TreeView: TTreeView; Button: TButton; Parent_Panel: TPanel); function GetBtnInfo(Button: TButton; TreeView: TTreeView; Parent_Panel: TPanel): BtnInfoArr; function BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean; { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function TForm1.BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean; begin Result := (Button.Top > TreeView.Top); end;function TForm1.GetBtnInfo(Button: TButton; TreeView: TTreeView; Parent_Panel: TPanel): BtnInfoArr; { Get Informations of the buttons that between Button and TreeView } var i, j: integer; MinTop, MaxTop: integer; pTBtnInfo : ^TBtnInfo; begin if Button.Top < TreeView.Top then begin MinTop := Button.Top; MaxTop := TreeView.Top; end else begin MinTop := TreeView.Top; MaxTop := Button.Top; end; j := 0; for i := 0 to self.ComponentCount - 1 do if (self.Components[i] is TButton)and (TButton(self.Components[i]).Parent = Parent_Panel) then if (TButton(self.Components[i]).Top < MaxTop) and(TButton(self.Components[i]).Top > MinTop) then Inc(j); SetLength(Result, j); j := 0; for i := 0 to self.ComponentCount - 1 do if (self.Components[i] is TButton)and (TButton(self.Components[i]).Parent = Parent_Panel) then if (TButton(self.Components[i]).Top < MaxTop) and(TButton(self.Components[i]).Top > MinTop) then begin new(pTBtnInfo); pTBtnInfo^.Button := TButton(self.Components[i]); Result[j] := pTBtnInfo^; Dispose(pTBtnInfo); Inc(j); end; end; procedure TForm1.TreeViewMoveTo(TreeView: TTreeView; Button: TButton; Parent_Panel: TPanel); var i, Len: integer; myArr : BtnInfoArr; begin myArr := GetBtnInfo(Button, TreeView, Panel1); Len := Length(MyArr); if Len <> 0 then if BtnUnderTv(Button, TreeView) then begin TreeView.Top := TreeView.Top + ((Len + 1)* Button.Height); for i := 0 to Len - 1 do myArr[i].Button.Top := myArr[i].Button.Top - TreeView.Height; Button.Top := Button.Top - TreeView.Height; end else begin TreeView.Top := TreeView.Top - (Len * Button.Height); for i := 0 to Len - 1 do myArr[i].Button.Top := myArr[i].Button.Top + TreeView.Height; end else begin//中间没有间隔 //Button刚刚在TreeView的下面 if (TreeView.Top + TreeView.Height = Button.Top) then begin TreeView.Top := TreeView.Top + Button.Height; Button.Top := Button.Top - TreeView.Height; end; end; //Button刚刚在TreeView的上面 if (Button.Top + Button.Height = TreeView.Top) then begin for i := 0 to self.ComponentCount - 1 do if (self.Components[i] is TTreeView) and(TTreeView(self.Components[i]).Parent = Parent_Panel) then begin TTreeView(self.Components[i]).Visible := false; TTreeView(self.Components[i]).Top := TreeView.Top; end; TreeView.Visible := true; end; end;procedure TForm1.btn1Click(Sender: TObject); begin TreeViewMoveTo(tv1, btn1, Panel1); end;procedure TForm1.btn2Click(Sender: TObject); begin TreeViewMoveTo(tv2, btn2, Panel1); end;procedure TForm1.btn3Click(Sender: TObject); begin TreeViewMoveTo(tv3, btn3, Panel1); end;procedure TForm1.btn4Click(Sender: TObject); begin TreeViewMoveTo(tv4, btn4, Panel1); end;procedure TForm1.btn5Click(Sender: TObject); begin TreeViewMoveTo(tv5, btn5, Panel1); end; procedure TForm1.FormResize(Sender: TObject); var i: integer; begin //btn_Width := self.Width - 14; Panel1.Width := self.Width - 8; for i := 0 to self.ComponentCount - 1 do if TWinControl(self.Components[i]).Parent = Panel1 then TWinControl(self.Components[i]).width := Panel1.Width - 6; end;procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); begin try if NewWidth > StrToInt(edit1.Text) then Resize := false; except ShowMessage('非法数值!'); end; end;procedure TForm1.FormCreate(Sender: TObject); begin edit1.Text := '300'; end;end.
也可以自己写一个
TBtnInfo = Record
Button: TButton;
//FTop : integer;
end;
BtnInfoArr = Array of TBtnInfo; TForm1 = class (TForm)
Panel1: TPanel;
btn1: TButton;
tv1: TTreeView;
btn2: TButton;
btn3: TButton;
btn4: TButton;
btn5: TButton;
tv2: TTreeView;
tv3: TTreeView;
tv4: TTreeView;
tv5: TTreeView;
Edit1: TEdit;
Label1: TLabel;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
procedure FormCreate(Sender: TObject); private
procedure TreeViewMoveTo(TreeView: TTreeView; Button: TButton;
Parent_Panel: TPanel);
function GetBtnInfo(Button: TButton; TreeView: TTreeView;
Parent_Panel: TPanel): BtnInfoArr;
function BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function TForm1.BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean;
begin
Result := (Button.Top > TreeView.Top);
end;function TForm1.GetBtnInfo(Button: TButton; TreeView: TTreeView;
Parent_Panel: TPanel): BtnInfoArr;
{ Get Informations of the buttons that between Button and TreeView }
var
i, j: integer;
MinTop, MaxTop: integer;
pTBtnInfo : ^TBtnInfo;
begin
if Button.Top < TreeView.Top then begin
MinTop := Button.Top;
MaxTop := TreeView.Top;
end
else begin
MinTop := TreeView.Top;
MaxTop := Button.Top;
end; j := 0;
for i := 0 to self.ComponentCount - 1 do
if (self.Components[i] is TButton)and
(TButton(self.Components[i]).Parent = Parent_Panel) then
if (TButton(self.Components[i]).Top < MaxTop)
and(TButton(self.Components[i]).Top > MinTop) then
Inc(j); SetLength(Result, j); j := 0;
for i := 0 to self.ComponentCount - 1 do
if (self.Components[i] is TButton)and
(TButton(self.Components[i]).Parent = Parent_Panel) then
if (TButton(self.Components[i]).Top < MaxTop)
and(TButton(self.Components[i]).Top > MinTop) then
begin
new(pTBtnInfo);
pTBtnInfo^.Button := TButton(self.Components[i]);
Result[j] := pTBtnInfo^;
Dispose(pTBtnInfo);
Inc(j);
end;
end;
procedure TForm1.TreeViewMoveTo(TreeView: TTreeView; Button: TButton;
Parent_Panel: TPanel);
var
i, Len: integer;
myArr : BtnInfoArr;
begin
myArr := GetBtnInfo(Button, TreeView, Panel1);
Len := Length(MyArr); if Len <> 0 then if BtnUnderTv(Button, TreeView) then begin
TreeView.Top := TreeView.Top + ((Len + 1)* Button.Height);
for i := 0 to Len - 1 do
myArr[i].Button.Top := myArr[i].Button.Top
- TreeView.Height;
Button.Top := Button.Top - TreeView.Height;
end
else begin
TreeView.Top := TreeView.Top - (Len * Button.Height);
for i := 0 to Len - 1 do
myArr[i].Button.Top := myArr[i].Button.Top + TreeView.Height;
end else begin//中间没有间隔
//Button刚刚在TreeView的下面
if (TreeView.Top + TreeView.Height = Button.Top) then begin
TreeView.Top := TreeView.Top + Button.Height;
Button.Top := Button.Top - TreeView.Height;
end;
end; //Button刚刚在TreeView的上面
if (Button.Top + Button.Height = TreeView.Top) then begin
for i := 0 to self.ComponentCount - 1 do
if (self.Components[i] is TTreeView)
and(TTreeView(self.Components[i]).Parent = Parent_Panel) then
begin
TTreeView(self.Components[i]).Visible := false;
TTreeView(self.Components[i]).Top := TreeView.Top;
end;
TreeView.Visible := true;
end;
end;procedure TForm1.btn1Click(Sender: TObject);
begin
TreeViewMoveTo(tv1, btn1, Panel1);
end;procedure TForm1.btn2Click(Sender: TObject);
begin
TreeViewMoveTo(tv2, btn2, Panel1);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
TreeViewMoveTo(tv3, btn3, Panel1);
end;procedure TForm1.btn4Click(Sender: TObject);
begin
TreeViewMoveTo(tv4, btn4, Panel1);
end;procedure TForm1.btn5Click(Sender: TObject);
begin
TreeViewMoveTo(tv5, btn5, Panel1);
end;
procedure TForm1.FormResize(Sender: TObject);
var
i: integer;
begin
//btn_Width := self.Width - 14;
Panel1.Width := self.Width - 8;
for i := 0 to self.ComponentCount - 1 do
if TWinControl(self.Components[i]).Parent = Panel1 then
TWinControl(self.Components[i]).width := Panel1.Width - 6;
end;procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
try
if NewWidth > StrToInt(edit1.Text) then
Resize := false;
except
ShowMessage('非法数值!');
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text := '300';
end;end.
EForumLib中有类似OutLook的控件!