フィルタリング目的でノードの非表示と表示に関するテキストを読みましたが、ノードを表示/非表示にするために2000行を超える行を設定すると、
この量の行の後、ChildNodeを一番上に挿入しようとすると、一番下にノードが追加され、この行にはノードが表示されません。
コードで init value 2000 として言及されているVirtualTreeView → CacheThresholdのコードを見てみました。
関数ごとにノードを最初に追加すると、エラーを再現できます
Node := PGrid.InsertNode(nil, amAddChildFirst);
いつでも多くの行を追加できます。
しかし、この操作の後にこれらすべての行を表示に設定すると、
PGrid.IsVisible[Node] := True
さらにルート ノード (常に root=nil) を挿入しようとすると、ノード数がCacheThresholdを超えた場合に非表示ノードなどのように最下部に追加されます。
追加されたこの初期のチャイルドのために表示されている白い空白の領域のみが...ツリーの下部にある?
また、この空白の白い領域では、OnGetText、OnPaintイベントはトリガーされませんか?
私はCacheThresholdを増やそうとしましたが、これらの増分された数には問題ありませんが、数が増えると同じ問題が発生します。
[編集]
以下のコードを使用すると問題なく動作しますが、CPU 使用率が高くなり、
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;