![]() |
VirtualStringTree Node anhand des Index ermitteln
Es gibt die Möglichkeit über VST.AbsoluteIndex(NODE) Den Index eines Nodes herraus zu bekommen.
Nun möchte ich aber den Node anhand des Index (also umgekehrt) ermitteln... ich suche schon seit einiger zeit den VST nach einer passenden Funktion durch... Gibt es solch eine Funktion überhaupt? :gruebel: |
Re: VirtualStringTree Node anhand des Index ermitteln
nein - gibt es nicht.
du kannst in einer While-Schleife nur mit Node.NextSibling und Node.PrevSibling solange in dem Level durchgehen, bis Node.Index Deinem Index entspricht. ggf. sind noch optimierungen möglich, z.b. vom selectierten vor oder zurück starten. Im schlechtesten Fall musst du das ganze Nodelevel durchsuchen |
Re: VirtualStringTree Node anhand des Index ermitteln
Vielen Dank für deine Antwort... ich hatte es befürchtet :x
So eine Komponente... Die hat fast alles! Doch so ne Kleinigkeit hat sie nicht :wall: Argh... nagut, muss ich mir wohl ne schleife basteln oder ne Funktion bauen. Danke Trotzdem für die Hilfe :cheers: |
Re: VirtualStringTree Node anhand des Index ermitteln
die schleife ist kein problem und auch bei vielen Nodes sehr schnell:
hier mal ein beispiel:
Delphi-Quellcode:
const
VST_MOVEDOWN = -5; VST_MOVEUP = -6; class procedure TVirtualTreeviewHelper.SelectNode(_Vst: TBaseVirtualTree; _StartNode: PVirtualNode; _IndexToSelect: Integer;_Center : Boolean = true); begin _Vst.ClearSelection; if _StartNode = nil then _StartNode := _Vst.RootNode.FirstChild; if _StartNode = nil then exit; case _IndexToSelect of VST_MOVEDOWN : _IndexToSelect := _StartNode.Index+1; VST_MOVEUP : _IndexToSelect := _StartNode.Index-1; -1 : exit; end; while _StartNode <> nil do begin if Integer(_StartNode.Index) = _IndexToSelect then begin _Vst.Selected[_StartNode] := true; _Vst.FocusedNode := _StartNode; _Vst.FocusedColumn := 0; _Vst.ScrollIntoView(_StartNode,_Center); break; end; if Integer(_StartNode.Index) < _IndexToSelect then _StartNode := _StartNode.NextSibling else _StartNode := _StartNode.PrevSibling; end; end; |
Re: VirtualStringTree Node anhand des Index ermitteln
okay..... :gruebel:
also ich habe das anderst gelöst... kürzer zumindest... hmmmmmmmmmmmmm
Delphi-Quellcode:
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
var Node : PVirtualNode; begin //Nehme den ersten Node node := VST.GetFirst(True); //Und Überprüfe bis der Übergebene index (ParentID) mit dem Node-Index übereinstimmt while vst.AbsoluteIndex(node) <> iIndex do begin node := Vst.GetNext(Node, True); end; //Der zurückgegebene Node ist also der gesuchte Parent result := Node; end; oder mache ich irgend welche gravierenden Fehler??!!?? :?: |
Re: VirtualStringTree Node anhand des Index ermitteln
Arbeitest Du dich durch eine Baumstruktur oder durch eine Liste von Nodes?
was gibt denn vst.AbsoluteIndex(node) zurück, wenn du z.b. den 5. Kindknoten des 2 Knotens prüfst? getnext gibt den nächsten knoten im Baum, also auch eine ebene drunter, wenn da einer ist. Ich schätze mal du möchtest dex x. Knoten in einer ebene haben, oder? |
Re: VirtualStringTree Node anhand des Index ermitteln
nee, ist schon OK so ... wollte auch grad sowas vorschlagen
es läßt sich nur noch etwas kürzen
Delphi-Quellcode:
in Delphi kann man auch direkt das Result nutzen ... nicht so wie in C, wo da auch gleich die Funkction verlassen wird.
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
begin Result := VST.GetFirst(True); while Assigned(Result) and (vst.AbsoluteIndex(Result) <> iIndex) do Result := Vst.GetNext(Result, True); end; Ansonten könnte man das Ganze noch etwas optimieren ... falls es dir nicht schnell genug ist.
Delphi-Quellcode:
oder man schaut im beim nächsten Sibling nach, was der für einen absoluten Index hat und überspringt mit .NextSibling einfach die SubNodes des aktuellen Nodes, da dort auf keinen Fall das gesuchte drinnen ist.
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
begin Result := VST.GetFirst(True); while Assigned(Result) and (iIndex <> 0) do begin Result := Vst.GetNext(Result, True); Dec(iIndex); end; end; [edit] es gibt doch ein Problem ... wenn der Index nicht vorkommt, dann geht deine Schleife über den letzen Node hinaus ... das Selbe, wenn garkein Node vorhanden war. [add] @sh17: wenn man mit GetPrev nach oben geht, dann gibt Absolute Index sozusagen die Anzahl der Knoten über dir an, also den absoluten Index zum RootNode |
Re: VirtualStringTree Node anhand des Index ermitteln
Ich möchte alle Nodes durchlaufen ^^
Denn ich speichere einen Baum (verzweigt) in einer DB mit verschiedenen Informationen: - Name (Inhalt der angezeigt wird) - Eigene ID (Position im Baum, unabhängig von der Ebene) - Parent ID (Position an dem der Node dran hängt) Und dann will ich den Baum wieder ausgeben lassen ^^ Sortiert nach "Eigene ID"... Und der Node muss ja immer irgendwo angehängt werden. Also wird ihm die Parent-ID übergeben an die er sich hängen soll. Genau für sowas brauch ich das ^^ (hoffe ich habe mich nicht ZU schlimm ausgedrückt) |
Re: VirtualStringTree Node anhand des Index ermitteln
Na dann vergiss meinen Code ;-)
|
Re: VirtualStringTree Node anhand des Index ermitteln
Hallo,
hier ist mein Versuch:
Delphi-Quellcode:
Gruß Hawkeye
function GetAbsoluteNode (aTree: TBaseVirtualTree; aIndex: Cardinal): PVirtualNode;
begin Result := aTree.GetFirst; while (Assigned(Result) and (aIndex > 0)) do if (aIndex >= Result.TotalCount) then begin Dec (aIndex, Result.TotalCount); Result := aTree.GetNextSibling(Result); end else begin Dec (aIndex); Result := aTree.GetFirstChild(Result); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 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