如何知道一个节点是 Virtual TreeView 中的根节点?

How to know a node is root in Virtual TreeView?

我正在使用虚拟树视图。有没有可靠的方法知道一个节点是否是根节点?

我尝试使用

if not Assigned(Node.Parent) then
  Output('This is root')
else
  Output('This is not root')

但是不起作用。

我尝试使用

if Node = tvItems.RootNode then
  Output('This is root')
else
  Output('This is not root')

但也不行。

VTV(或VST)中的最终根节点是一个特殊的不可见节点,它充当所有用户创建的根节点(使用parent = nil创建的节点)的父节点。这个特殊的不可见节点通过设计将其 NextSiblingPrevSibling 属性设置为指向自身。

要检测节点是否为根节点(在用户创建根的意义上),您可以例如做:

procedure TForm16.tvItemsNodeClick(Sender: TBaseVirtualTree;
  const HitInfo: THitInfo);
begin
  if HitInfo.HitNode.Parent.NextSibling = HitInfo.HitNode.Parent then
    Caption := 'Root node'
  else
    Caption := 'Not root node';
end;

或者,正如 OP 所评论的,并且不使用内部实现细节:

procedure TForm16.tvItemsNodeClick(Sender: TBaseVirtualTree;
  const HitInfo: THitInfo);
begin
  if HitInfo.HitNode.Parent = Sender.RootNode then
    Caption := 'Root node'
  else
    Caption := 'Not root node';
end;

参考:TBaseVirtualTree.RootNode 属性(在帮助中)