如何在TVirtualStringTree中获得许多显示的节点?

时间:2019-03-07 10:50:11

标签: delphi tvirtualstringtree

我需要在TVirtualStringTree中显示一个长数据库表(例如50000条记录)。为了减少查询执行时间,我限制了记录的数量,仅使用树中实际显示的记录。下面是处理OnGetText的代码段。问题是VisibleCount返回50000而不是20-30,这破坏了这种方法。有办法正确执行吗?

procedure TContactsFrame.vstContactsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; 
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
begin
  if vstContacts.GetNodeLevel(Node) = 0 then
    CellText := 'Group'
  else if vstContacts.GetNodeLevel(Node) = 1 then
  begin
    if Contacts[Node.Index].Index = -1 then
    begin
      // getting DB table values of visible records only
      GetContacts(Node.Index + 1, Node.Index + 1 + vstContacts.VisibleCount, Contacts);
    end;
    CellText := Contacts[Node.Index].Name;
  end;
end;

2 个答案:

答案 0 :(得分:2)

VisibleCount为您提供了设置了vsVisible标志(可见表示不隐藏)的节点数。

要枚举当前显示在树视图中的节点,可以使用TopNodeBottomNode,其方式类似于:

var
  Run, LastNode: PVirtualNode;
begin
  LastNode := Treeview.GetNextVisible(Treeview.BottomNode);
  Run := Treeview.TopNode;

  while Assigned(Run) do
  begin
    // your processing here

    Run := Treeview.GetNextVisible(Run);
    if Run = LastNode then
      Break;
  end;
end;

答案 1 :(得分:1)

要查找显示的节点数,您需要编写自己的函数,但是在这种情况下,使用TopNodeBottomNode或{ {1}}和GetFirst(如果不存在)。

GetLast

但是,我不得不说这似乎不是最有效的解决方案,因为您在随意滚动树时将运行数千个查询。如果有的话,我会乘以检索到的联系人的数量,因此您不需要那么频繁地运行新查询。