Tvirtualstringtree, более 2000 строк, он добавляет узлы в нижнюю часть и становится невидимым, а также не запускается на функциях рисования? - PullRequest
0 голосов
/ 06 марта 2012

Я читаю тексты о скрытии и показе узлов для целей фильтрации, но если мы установим более 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;
...