treeview控件如何实现两个同级节点之间,把一个节点托到另一个节点上实现两个节点合并?

解决方案 »

  1.   

    A sample:  TForm1 = class(TForm)
        TreeView1: TTreeView;
        procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
      private
        FNode : TTreeNode;
        procedure TryStartDrag(ANode: TTreeNode; ATreeView: TTreeView);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      nodeDest  : TTreeNode;
      i : Integer;
    begin
      if( not((Sender is TTreeView)and(Sender=Source)) )then Exit;
      nodeDest  := TTreeView(Sender).GetNodeAt(X, Y);
      try
        if( (not Assigned(nodeDest))or(not Assigned(FNode)) )then Exit;
        if((FNode.Parent=nodeDest.Parent)and(FNode.Count>0))then
        begin
          for i:=FNode.Count-1 downto 0 do
            FNode.getFirstChild.MoveTo(nodeDest, naAddChild);
          FNode.Delete;
        end else
        begin
          FNode.MoveTo(nodeDest, naAddChild);
        end;
      finally
        FNode := nil;
      end;
    end;procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    var
      node  : TTreeNode;
    begin
      Accept  := ( (Sender is TTreeView)and(Sender=Source)and Assigned(FNode) );
      if(not Accept)then Exit;
      node    := TTreeView(Sender).GetNodeAt(X, Y);
      Accept  := ( Assigned(node)and(node<>FNode)and(not node.HasAsParent(FNode)) );
    end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if((Button=mbLeft)and(Shift=[ssLeft])and(Sender is TTreeView))then
        TryStartDrag(TTreeView(Sender).GetNodeAt(X, Y), TTreeView(Sender));
    end;procedure TForm1.TryStartDrag(ANode: TTreeNode; ATreeView: TTreeView);
    begin
      if(Assigned(ANode)and Assigned(ATreeView))then
      begin
        FNode := ANode;
        ATreeView.BeginDrag(False);
      end;
    end;