Hi,
habe jetzt VST auf die Version 4.8.5 upgedated und seither ein kleines Problem (Endlosschleife) in der Funktion TBaseVirtualTree.GetVisibleParent. Wie mir im Vergleich zu der vorherigen Version von VST (4.7.0) aufgefallen ist, gabe es dort auch einiges an Änderungen:
Alt:
Delphi-Quellcode:
function TBaseVirtualTree.GetVisibleParent(Node: PVirtualNode): PVirtualNode;
// Returns the first (nearest) parent node of Node which is visible.
// This method is one of the seldom cases where the hidden root node could be returned.
begin
Assert(Assigned(Node), 'Node must not be nil.');
Result := Node;
while Result <> FRoot do
begin
// FRoot is always expanded hence the loop will safely stop there if no other node is expanded
repeat
Result := Result.Parent;
until vsExpanded in Result.States;
if (Result = FRoot) or FullyVisible[Result] then
Break;
// if there is still a collapsed parent node then advance to it and repeat the entire loop
while (Result <> FRoot) and (vsExpanded in Result.Parent.States) do
Result := Result.Parent;
end;
end;
Neu:
Delphi-Quellcode:
function TBaseVirtualTree.GetVisibleParent(Node: PVirtualNode): PVirtualNode;
// Returns the first (nearest) parent node of Node which is visible.
// This method is one of the seldom cases where the hidden root node could be returned.
begin
Assert(Assigned(Node), 'Node must not be nil.');
Result := Node;
while (Result <> FRoot) and not FullyVisible[Result] do
Result := Result.Parent;
end;
Mein Coding ist unverändert:
Delphi-Quellcode:
if (not oNodeData.IsFolder) and (oNodeData.FolderType <> ftyRoot) then
repeat
// Step back to get parent
Result := treeAccounts.GetVisibleParent(Result);
if Result = nil then
Break;
oNodeData := treeAccounts.GetNodeData(Result);
until (oNodeData.IsFolder) or (oNodeData.FolderType = ftyRoot);
Wobei seit der Version 4.8.5. die Funktion GetVisibleParent() immer wieder den gleichen Node zurückliefert, mit dem ich eingestigen bin. D.h. das Coding niemals mehr auf die Abbruch-Bedingung trifft, da es sich immer um den gleichen (Quell-Node) dreht.
Der Aufbau meines Tree ist sehr einfach: zuerst ein Root-Node und als Child lediglich ein einziger Knoten. Mit diesem Knoten steige ich in die o.g. Schleife ein und ermittle mir zuerst dessen Node-Daten um anschließend dessen Parent zu finden, was eigentlich der Root Knoten sein sollte.
Wie gesagt drehe ich mich in diesem Coding im Kreis, was auf jedenfall auf die Änderungen im Source zu 4.8.5. zurückzuführen ist. Evtl. sogar schon früher, nur meine bisherige VST Version war halt 4.7.0.