VirtualStringTree-如何从绝对索引获取节点?

假设我在虚拟模式下使用 VirtualStringTree

我想指出树上有一些节点:

VirtualStringTree1.RootNodeCount := 999983;

并且由于该树处于虚拟模式;所有数据管理都在应用程序中按需进行。

现在稍后某个时候,我想将一个节点标记为已选择。我的基础TList(索引797977)发生了什么事,这可能导致节点之一(如果可见)需要更改其 selected 状态。

由于虚拟树中的所有内容均基于Node.Index,因此理想情况下,将有一种方法表明选择了索引

VirtualStringTree1.RootNodeCount := 999983;
VirtualStringTree1.Selected[797977] := True; //indicate that node at index 797977 is now selected

但是树没有重载来按索引设置选择。

更改节点选定状态的唯一方法是:

  • a) 拥有 一个PVirtualNode
  • b)将其传递给VirtualStringTree1.Selected[node] := True;

当我没有节点时,如何将其标记为选定节点?

Windows ListView解决方案

虚拟模式下的Windows ListView 控件可以非常简单地解决它。

  • 一切均基于Node.Index
  • ,并且该控件使用回调向应用程序按需询问显示信息

因此,您将得到一个LVN_GETDISPINFO回调。那就是当您填充callback structure并为树提供其按需请求的信息时:

  • 文字
  • 状态(例如已选中)
  • ImageIndex
  • 缩进

所以我将树中的项目标记为 Selected 的方式是:

ListView1.Invalidate;

如果当前正在显示#797,977项目:它将在选定的下一个绘画周期内重新绘制。

当您只有虚拟模式索引时,将节点标记为已选择虚拟Treeivew 是什么?

Hack

function GetNodeByIndex(Tree: TVirtualStringTree; Index: Integer): PVirtualNode;
var
   node: PVirtualNode;
begin
    Result := nil;

    node := Tree.GetFirstChildNoInit(nil);
    while Assigned(node) do
    begin
       if node.Index = Index then
       begin
          Result := node; 
          Exit;
       end;
       node := Tree.GetNextNoInit(node);
    end;
end;

但是遍历797,977个项目的链接列表以获取节点 n 是非常糟糕的。

zxl2118 回答:VirtualStringTree-如何从绝对索引获取节点?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3033550.html

大家都在问