把 DragMode 设置为 dmAutomatic,  DragKind 设置为 dkDrag;
在 OnDragOver 事件中加入代码: Accept:=True;这时运行程序,你已经可以拖动 ListItem 了.
在 OnDragDrop 事件中处理你要做的事情。

解决方案 »

  1.   

    我的意思在OnDragDrop 中怎么处理,比如把第三项移到第一项
      

  2.   

    var
        DragNode           : TTreeNode;procedure TTreeViewForm.TreeView1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    begin
      DragNode := TreeView1.Selected;
    end;procedure TTreeViewForm.TreeView1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
      ...
      Accept := True;
    end;procedure TTreeViewForm.TreeView1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    Var TreeNode   : TTreeNode;
    begin
      TreeNode := TreeView1.GetNodeAt( X, Y );
      ...
      DragNode.MoveTo( TreeNode, naAddChild );
      ...
    end;procedure TTreeViewForm.TreeView1EndDrag(Sender, Target: TObject; X,
      Y: Integer);
    begin
      ...
      DragNode := nil;
    end;
      

  3.   

    我没说清楚,我是指在同一个listview中移动ListItem
      

  4.   

    我有:
    procedure TForm1.treeview1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
       Accept:=sender=source;
    end;procedure TForm1.treeview1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    var
       AnItem: TTreeNode;
       AttachMode: TNodeAttachMode;
       HT: THitTests;
       strentpcode,struppercode:string;
    begin 
      if TreeView1.Selected = nil then Exit;
      HT := TreeView1.GetHitTestInfoAt(X, Y);
      AnItem := TreeView1.GetNodeAt(X, Y);
      if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then
      begin
        if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild
        else if htNowhere in HT then AttachMode := naAdd    else if htOnIndent in HT then AttachMode := naInsert;
        TreeView1.Selected.MoveTo(AnItem, AttachMode);
      end;
    end;
      

  5.   

    为什么大家看题目都不仔细啊,我要用listview,而不是treeview啊
      

  6.   

    参考几位的treeview方法,我自己实现了,给分
      

  7.   

    参考几位的treeview方法,我自己实现了,给分
      

  8.   

    sorry, 看错了,对于ListView,使用Items.Insert, 
    在dragdrop事件中,先保存被drag的item的属性和放下的位置索引 i,软后删除该Item,
    在ListView1.Items.Insert在放下的位置i,最后,在该项恢复保存的被drag的Item值
    注意,如从上往下drag,则i应减1(判断相对位置)
      

  9.   

    下面的代码是当你拖动一个 Item 到另一个 Item 上时,就插入在他之前。仅供参考。
    var SrcItem: TListItem;
    procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var tempItem1, tempItem2 :TListItem;
        hit: THitTests;
    begin
     hit:=listview1.GetHitTestInfoAt(x,y);
     if htOnLabel in hit then
       begin
        tempItem1:=Listview1.GetItemAt(x,y);
        tempItem2:=Listview1.Items.Insert(tempitem1.index);
        tempitem2.Caption :=SrcItem.Caption;
        SrcItem.Delete;
        listview1.Refresh;
       end;
    end;procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      SrcItem:=Listview1.GetItemAt(x,y);
    end;