Я читаю тексты о скрытии и показе узлов для целей фильтрации,
но если мы установим более 2000 строк, чтобы сделать узел видимым / невидимым,
После этого количества строк, когда мы пытаемся вставить ChildNode в верхнюю часть, он добавляет узел в нижнюю часть, и в этой строке узел не отображается.
Я посмотрел код VirtualTreeView & rarr; CacheThreshold , упомянутый в коде как значение инициализации 2000?
Вы можете воспроизвести ошибку, если добавите узлы в первый с помощью функции
Node := PGrid.InsertNode(nil, amAddChildFirst);
Вы можете добавлять много строк, когда захотите.
Но когда вы установите все эти строки видимыми после этой операции,
PGrid.IsVisible[Node] := True
попытка вставить дополнительные корневые узлы (root = nil всегда) будет добавлена снизу и, например, невидимым узлом, если число узлов достигнет CacheThreshold .
Показана только белая пустая область для добавленных ранних детей ... в нижней части дерева?
Кроме того, для этой пустой белой области OnGetText , OnPaint события не инициируются?
Я пытался увеличить CacheThreshold , тогда все в порядке с указанным количеством суммы, но после большего числа возникает та же проблема.
[Изменено]
Если я использую код, как показано ниже, он работает нормально, но стоит больше ресурсов процессора,
PGrid.BeginUpdate;
try
Node := PGrid.InsertNode(nil, amAddChildFirst);
Data := PGrid.GetNodeData(Node);
Data.P := RowInformer;
RowInformer.pNode := Node;
finally
Pgrid.EndUpdate;
end;
RowInformer.NodeisVisible;
RowInformer.InvalidateRow;
Но если я использую код, как показано ниже, он работает некоторое время, а затем становится нестабильным после 2000 года (порог кэша по умолчанию), я добавляю узлы в верхнюю часть, но после добавления 2000, он начинает добавлять в нижнюю часть, и узлы становятся невидимыми, но имеют громкость в виде строки только с пустой белой областью ..
Я хочу использовать код как удар для обновления только соответствующей строки, но это проблематично после 2000
Вызов функции NodeisVisible ()
Node := PGrid.InsertNode(nil, amAddChildFirst);
Data := PGrid.GetNodeData(Node);
Data.P := RowInformer;
RowInformer.pNode := Node;
if RowInformer.NodeisVisible then
begin
if PGrid.FullyVisible[Node] then
PGrid.InvalidateNode( Node );
end;
NodeisVisibleFunction:
begin
Result := True;
try
with OwnerGridTable do
begin
Result := Result and Filter_Account.GetFilterResult(PItem.P040_AccountID.AsInteger);
Result := Result and Filter_SymbolID.GetFilterResult(PItem.P030_SymbolID.AsInteger);
Result := Result and Filter_OrderStatus.GetFilterResult(PItem.P060_OrderStatus.AsOrderStatus);
end;
finally
if Result then
begin
if not (vsVisible in pNode.States) then
OwnerGridTable.PGrid.IsVisible[pNode] := True;
end
else
begin
if (vsVisible in pNode.States) then
OwnerGridTable.PGrid.IsVisible[pNode] := False;
end;
end;