Delphi 如何防止拖动某个虚拟StringTree节点级别?

Delphi 如何防止拖动某个虚拟StringTree节点级别?,delphi,delphi-xe2,drag,virtualtreeview,tvirtualstringtree,Delphi,Delphi Xe2,Drag,Virtualtreeview,Tvirtualstringtree,我正在努力实现的目标 我有一个虚拟的stringtree,其中包含可以由用户展开的子级别行。所有节点的顶层应可拖动。但所有子节点级别均不应为 如何测试 为了进行测试,我使用了当前虚拟TreeView版本的高级演示项目。第二个演示(一般能力和功能)有足够的节点层次结构,您可以拖动节点 考虑因素 我想我可以通过使用stringtree的OnDragAllowed事件来完成我的任务,但当我拖动时它不会被触发。 我的目的是在开始拖动之前检查节点级别(GetNodeLevel),并且只允许对顶部节点级别0

我正在努力实现的目标

我有一个虚拟的stringtree,其中包含可以由用户展开的子级别行。所有节点的顶层应可拖动。但所有子节点级别均不应为

如何测试

为了进行测试,我使用了当前虚拟TreeView版本的高级演示项目。第二个演示(一般能力和功能)有足够的节点层次结构,您可以拖动节点

考虑因素

我想我可以通过使用stringtree的
OnDragAllowed
事件来完成我的任务,但当我拖动时它不会被触发。 我的目的是在开始拖动之前检查节点级别(
GetNodeLevel
),并且只允许对顶部节点级别0进行拖动


如何防止虚拟stringtree的某些节点级别被拖动?

为了得到答案。。。所有的功劳都归于他

为了防止拖动某个节点级别,我们可以实现
OnDragAllowed
事件处理程序,并确保将StringTree的
DragMode
设置为
dmManual

下面是事件处理程序

procedure TForm1.vstDragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; var Allowed: Boolean);
begin
  { dragging shall only be possible for top nodes (level 0) }
  Allowed := TVirtualStringTree(Sender).GetNodeLevel(Node) = 0;
end;

本节介绍了拖放的基本原理和含义。

如果您走在正确的轨道上,
OnDragAllowed
事件就是正确的。但是,您必须将演示中的
VST2
DragMode
dmAutomatic
更改为
dmManual
,才能实现您想要的功能。太好了,谢谢
dmManual
成功了,我愿意接受这个答案。