![]() |
VirtualTreeView: Bestimmten Knoten finden
Beim Einfügen eines neuen Knotens kann es vorkommen, dass der neue Knoten alle Inhalte eines anderen Knotens übernehmen soll. Bloss dieser alte Knoten kann irgendwo im Baum sein (aber immer nur auf der obersten Ebene), wie finde ich den? Wie durchlaufe ich einen VirtualTreeView? Gibts einen Index, den ich ansprechen kann?
|
Re: VirtualTreeView: Bestimmten Knoten finden
Hallo,
kannst du den Quellknoten nicht in einer Variablen zwischenspeichern? Ansonsten kannst du mit
Delphi-Quellcode:
alle Knoten des Trees durchlaufen.
Node := vst.GetFirst;
while (Assigned(Node)) do begin // Kontrolle, ob der Knoten der gesuchte ist ... // nächsten Knoten holen. Node := vst.GetNext(Node); end; Mit
Delphi-Quellcode:
durchläufst du alle Knoten, die in der Ebene von IrgendeinKnoten liegen.
Node := IrgendeinKnoten;
while (Assigned(Node)) do begin // Kontrolle, ob der Knoten der gesuchte ist ... // nächsten Knoten holen. Node := vst.GetNextSibling(Node); end; Viele Grüße, pszopp |
Re: VirtualTreeView: Bestimmten Knoten finden
Hallo,
den Knoten findest Du, indem Du alle Elemente der obersten Ebene durchläufts:
Delphi-Quellcode:
Aufgerufen wird das ganze dann in etwa so:
type
PMyNodeData=^TMyNodeData; TMyNodeData=record NodeName:WideString; ... end; // TMyNodeData function TForm1.FindeNode(const aName:String):PVirtualNode; var n:PVirtualNode; d:PMyNodeData; begin Result:=nil; n:=VirtualStringTree1.GetFirst; while (n<>nil) do begin d:=VirtualStringTree1.GetNodeData(n); if SameText(d^.NodeName, aName) then begin Result:=n; Break; end; // if n:=n^.NextSibling; end; // while end; // TForm1.FindeNode
Delphi-Quellcode:
...
with VirtualStringTree1 do begin FocusedNode:=FindeNode('huhu, wo bist Du?'); if (FocusedNode<>nil) then Selected[FocusedNode]:=True; end; // with ... |
Re: VirtualTreeView: Bestimmten Knoten finden
Danke Euch beiden, werde beides mal probieren. Noch ne Frage zu GetNext: Durchläuft es einfach alle Indizes des Baums oder geht es nur vom Root zu einem Child?
Achja, es wird etwas komplizierter: Kann man sich den Baum vorher sortieren lassen? Alle meine Knoten haben ein Datum und ich suche den Knoten mit dem Ziel-Inhalt des jüngsten Datums. Ich schätze aber, die Indizes sind so wie sie erstellt wurden. Also werd ich da wohl alle Knoten durchlaufen müssen, das Datum vergleichen und den jüngsten Knoten merken. Dürfte ja auch nicht so schwer sein. |
Re: VirtualTreeView: Bestimmten Knoten finden
Zitat:
Delphi-Quellcode:
wobei ich deine Datenstruktur für das Datum natürlich nicht kenne.
PROCEDURE TForm.VirtualTreeViewCompareNodes(
Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; VAR Result: Integer ); VAR lData1, lData2 : PNodeData; BEGIN // Knotendaten beider Knoten ermitteln lData1 := Sender.GetNodeData(Node1); lData2 := Sender.GetNodeData(Node2); // falls die Daten gültig sind ... IF (Assigned(lData1) AND Assigned(lData2)) THEN Result := lData1.Datum - lData2.Datum; END; Wenn "Result" < 0 ist, dann kommt Knoten1 zuerst, wenn "Result" > 0 ist, dann kommt Knoten2 zuerst. Gruß Dale |
Re: VirtualTreeView: Bestimmten Knoten finden
Diese Routine habe ich bereits. Die Darstellung ist sortiert. Frage ist, ob die Indizes mit durchsortiert werden, oder ob die in der Reihenfolge bleiben wie sie erstellt wurden.
|
Re: VirtualTreeView: Bestimmten Knoten finden
|
Re: VirtualTreeView: Bestimmten Knoten finden
Je nach dem ob du auf- oder absteigend sortiert hast, ist der erste oder der letzte Knoten der Knoten mit dem jüngsten Datum, also "GetFirst" bzw. "GetLast" müsste dir direkt den gesuchten Knoten liefern.
Gruß Dale |
Re: VirtualTreeView: Bestimmten Knoten finden
die schnellste methode sollte mit "iteratesubtree" sein.
|
Re: VirtualTreeView: Bestimmten Knoten finden
Zitat:
Zitat:
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz