use*_*313 3 delphi treeview drag-and-drop
我希望允许用户按照自己喜欢的方式安排treeView的节点,但是我遇到了很多问题.例如:
这不好.我想要像这张照片中的行为

因此Node3的目的地应该在Node1和Node2之间.当然,节点的ON TOP应该是可用的,但是这个BETWEEN NODES功能也应该可用.
到目前为止我的代码是:
procedure TForm3.FormCreate(Sender: TObject);
begin
tv.FullExpand;
end;
procedure TForm3.tvDragDrop(Sender, Source: TObject; X, Y: Integer);
var
TargetNode, SourceNode : TTreeNode;
begin
with TV do
begin
TargetNode := GetNodeAt(X,Y); // Get target node
SourceNode := Selected;
if (TargetNode = nil) then
begin
EndDrag(False);
Exit;
end;
MoveNode(TargetNode,SourceNode);
SourceNode.Free;
end;
end;
procedure TForm3.tvDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Sender = TV) then // If TRUE than accept the draged item
begin
Accept := True;
end;
end;
procedure TForm3.tvEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
TV.Repaint;
end;
procedure TForm3.tvMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
tv.BeginDrag(false,-1);
end;
Procedure TForm3.MoveNode(TargetNode, SourceNode : TTreeNode);
var
nodeTmp : TTreeNode;
i : Integer;
begin
with TV do
begin
nodeTmp := Items.AddChild(TargetNode,SourceNode.Text);
for i := 0 to SourceNode.Count -1 do
begin
MoveNode(nodeTmp,SourceNode.Item[i]);
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
当然电视是TTreeView.
Dav*_*nan 12
首先,扔掉你目前拥有的所有代码.它有太多的缺陷值得讨论.
这需要的最小代码如下:
procedure TMyForm.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
Src, Dst: TTreeNode;
begin
Src := TreeView1.Selected;
Dst := TreeView1.GetNodeAt(X,Y);
Src.MoveTo(Dst, naAdd);
end;
procedure TMyForm.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
Src, Dst: TTreeNode;
begin
Src := TreeView1.Selected;
Dst := TreeView1.GetNodeAt(X,Y);
Accept := Assigned(Dst) and (Src<>Dst);
end;
Run Code Online (Sandbox Code Playgroud)
您需要设置DragMode到dmAutomatic树视图.而且你还需要将两个事件连接到OnDragDrop和OnDragOver.
如果您希望在drop中实现不同的逻辑来处理作为兄弟(之前或之后)的添加,或者作为子项添加,则为第二个参数传递不同的值MoveTo.
可能性列于此处:
type
TNodeAttachMode = (naAdd, naAddFirst, naAddChild, naAddChildFirst, naInsert);
Run Code Online (Sandbox Code Playgroud)
这些选项在文档中描述.