使用
TTreeView
设置 DragMode
dmAutomatic
我可以使用 OnDragDrop
和 OnDragOver
事件来处理拖放。但我不希望树中的特定TTreeNode
能够被拖动。我想我需要使用dmManual
,但我还没有找到如何做到这一点的例子,想知道这是否是必需的?
所以基本问题是,如何防止特定的
TTreeNode
项目被拖动(它可以是放置目标)?如果dmManual
,你如何使用那个模式?
TIA!!
在
OnDragOver
事件中,可以测试选中的TTreeNode
是否是不想被拖动的节点,如果是则可以拒绝拖动。例如:
procedure TMyForm.TreeView1DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node: TTreeNode;
begin
Accept := False;
if Source = TreeView1 then
begin
Node := TreeView1.Selected;
Accept := (Node <> nil) and (Node <> ANodeThatShouldNotBeDragged);
end;
end;
如果你想完全排除拖动开始,你必须使用
dmManual
模式,如你所写,并在BeginDrag
中设置OnMouseDown
:
if (Button = mbLeft) and
(Treeview1.Selected <> nil) and
(Treeview1.Selected.Text > 'b') then
TreeView1.BeginDrag(True);
在此示例中,带有
text='aa'
的节点未被拖动,而 node 'cc'
被拖动。
也许有时您还需要将
Immediate
更改为 False
并应用 Threshold
值(如果您需要点击)