Чтобы найти количество отображаемых узлов, вам нужно написать собственную функцию, но в этом случае должно быть достаточно получить первый и последний отображаемый узел, используя TopNode
и BottomNode
или GetFirst
и GetLast
если они не существуют.
procedure TContactsFrame.vstContactsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
lTopNode, lBottomNode : PVirtualNode;
begin
case vstContacts.GetNodeLevel(Node) of
0 : CellText := 'Group'
1 : begin
if Contacts[Node.Index].Index = -1 then
begin
// getting DB table values of visible records only
lTopNode := vstContacts.TopNode;
if not Assigned(lTopNode) then
lTopNode := vstContacts.GetFirst;
lBottomNode := vstContacts.BottomNode;
if not Assigned(lBottomNode) then
lBottomNode := vstContacts.GetLast;
GetContacts(lTopNode.Index + 1, lBottomNode.Index + 1, Contacts);
end;
CellText := Contacts[Node.Index].Name;
end;
end;
end;
Однако я должен сказать, что это не самое эффективное решение, потому что вы будете выполнять тысячи запросов при случайной прокрутке дерева.Во всяком случае, я бы умножил количество найденных контактов, чтобы вам не приходилось так часто запускать новые запросы.