假设我在虚拟模式下使用 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
是非常糟糕的。