是不是有专门的控件啊!我想做个那样的东东

解决方案 »

  1.   

    要啊! 谢发给俺吧[email protected]
      

  2.   

    主要函数在这里
     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;