Treeview.DragMode:=dmAutomatic;
TreeView.DragKind:=dkDrag;ListView.OnDragOver:
begin
  if Source is TTreeView then
    Accept := true;
end;ListView.OnDragDrop:
var
  tvSrc:TTreeView;
  lvSdr:TListView;
  NewItem:TListItem;
begin
  tvSrc := Source as TTreeView;
  lvSdr := Sender as TListView;
  NewItem := lvSdr.Items.Add;
  (*这时可以用lvSdr.Selected判断拖放到了ListView的哪一个节点上.以便于添加到正确的位置.*)
  NewItem.Caption := tvSrc.Selected.Text;
  //以及其它数据
  //或遍历tvSrc.Selected的所有子节点,全添加进来.
  tvSrc.Items.Delete(tvSrc.Selected);
  //或者不删除
end;

解决方案 »

  1.   

    第1步
      Treeview1.DragMode:=dmAutomatic;
    第2步
      定义一个全局变量DradStr
    第3步
      关于listbox1的ondragover事件
    procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
     if source=treeview1 then
      DradStr:=TreeView1.Selected.Text;
    end;
    第4步
      关于listbox1的ondrapdrop事件
      procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
     if source=treeview1 then
       ListBox1.Items.Add(DradStr);
    end;
    OK了!
      

  2.   

    对不起,刚才看错了,原来是ListBox呀!
    OnDragOver不变,OnDragDrop改为:
    var
      tvSrc:TTreeView;
      lvSdr:TListBox;
    begin
      tvSrc := Source as TTreeView;
      lvSdr := Sender as TListBox;
      lvSdr.Items.Add(tvSrc.Selected.Text);
      //用X和Y判断拖放到了ListView的哪一个节点上.
      //以及其它数据
      //或遍历tvSrc.Selected的所有子节点,全添加进来.
      tvSrc.Items.Delete(tvSrc.Selected);
      //或者不删除
    end;
      

  3.   

    再补充一下,OnDragOver最好再加一个分支:
    if Source is TTreeView then
        Accept := true
    else
        Accept := false;