主要函数在这里 ABtnInfo = Record Button: TButton; end; BtnInfoArr = Array of ABtnInfo; function TForm1.BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean; begin Result := (Button.Top > TreeView.Top);//top越大,越在下面 end;{判断button是否在TreeView在下面}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; pABtnInfo : ^ABtnInfo; 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(pABtnInfo); pABtnInfo^.Button := TButton(self.Components[i]); Result[j] := pABtnInfo^; Dispose(pABtnInfo); 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;
ABtnInfo = Record
Button: TButton;
end;
BtnInfoArr = Array of ABtnInfo;
function TForm1.BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean;
begin
Result := (Button.Top > TreeView.Top);//top越大,越在下面
end;{判断button是否在TreeView在下面}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;
pABtnInfo : ^ABtnInfo;
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(pABtnInfo);
pABtnInfo^.Button := TButton(self.Components[i]);
Result[j] := pABtnInfo^;
Dispose(pABtnInfo);
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;