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;
我没说清楚,我是指在同一个listview中移动ListItem
我有: 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;
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;
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;
在dragdrop事件中,先保存被drag的item的属性和放下的位置索引 i,软后删除该Item,
在ListView1.Items.Insert在放下的位置i,最后,在该项恢复保存的被drag的Item值
注意,如从上往下drag,则i应减1(判断相对位置)
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;