![]() |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
^- Der Post kam während ich meinen geschrieben habe.
================================================== == Meine Daten sind aus einer alten Record-Datenbank. Die sind erst mal fix, aber die will ich ja später auf SQL exportieren, dann wird alles leichter. Ich werde deinen Source aber ganz sicher analysieren und wenn er passt auch verwenden. Aber ich muss jetzt, nachdem ich den Nachmittag dran gesessen bin, selber eine wenigstens brauchbare Version hinbekommen. Das kennst Du sicher ;) *** Also ich weis jetzt auch, warum ich die Liste der SubNode nicht gefunden hatte. Node.Item <> TTReeNodes, sondern nur eine Objekt-Liste (was auch reicht), aber weshalb mir die Codevervollständigung nichts angeboten hatte. Ohne himitsu's var-Deklaration wäre ich nie drauf gekommen. Dadurch musste ich die Schleife für TreeView.Items vom Konstrukt für Node.Item abspalten. Aber bin jetzt auf ~10.000ms für die 24.000 Node angekommen:
Delphi-Quellcode:
Das ganze muss ich jetzt noch feintunen...
function FindNodeByPath(const aTreeView: TTreeView; aPath: String): TTreeNode;
var i : Integer; found : Boolean; NodeText : String; begin Result := NIL; if Assigned(aTreeView) and (Length(aPath)>0) then begin // Pfadstring UpperCase und Delimiter anfügen aPath := AnsiUpperCase(aPath); if aPath[Length(aPath)] <> '\' then aPath := aPath +'\'; // NodeText des obersten Level ausschneiden und Pfad kürzen NodeText := Copy(aPath,1,Pos('\',aPath)-1); Delete(aPath,1,Pos('\',aPath)); // StartNode suchen for i := 0 to aTreeView.Items.Count-1 do if AnsiUpperCase(aTreeView.Items[i].Text) = NodeText then begin Result := aTreeView.Items[i]; Break; end; // Wenn StartNode gefunden und noch eine Ebene existiert while (aPath <> '') and (Result <> NIL) do begin // Name der nächste Ebene, Pfad kürzen NodeText := Copy(aPath,1,Pos('\',aPath)-1); Delete(aPath,1,Pos('\',aPath)); // Children durchsuchen found := false; for i := 0 to Result.Count do if AnsiUpperCase(Result[i].Text) = NodeText then begin Result := Result[i]; found := True; Break; end; // Wenn nicht gefunden, dann Result verwerfen if not found then Result := NIL; end; end; end; |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
Delphi-Quellcode:
Explode/ExcludeTrailingBackslash kennt D5 nicht,
Path := Explode('\', ExcludeTrailingBackslash(aPath));
|
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
schau mal, was deine OH alles kennt, was mit "Exclude" anfängt und dahinter irgendwas mit "Dir" oder "Path" stehen hat.
[add] eventuell ExcludeTrailingPathDelimiter [/add] ![]() |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
ExcludeTrailingBackslash kennt D5, war nur Explode, das den Fehler verursacht hat.
Aber das Explode kann ich nachbauen. Das Trennzeichen ist noch dran oder in der Stringliste weggeschnitten? |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
Funktioniert!
Aber nur etwa 200ms schneller (die 10.000ms sind damit aber knapp geknackt): Hier nochmal die D5 Variante:
Delphi-Quellcode:
Function FindNodeByPath(const aTreeView: TTreeView; aPath: String): TTreeNode;
Var Path: Array of String; i: Integer; Begin Result := nil; if aPath='' then exit; //Path := Explode('\', ExcludeTrailingBackslash(aPath)); if aPath[Length(aPath)] <> '\' then aPath := aPath +'\'; while aPath <> '' do begin i := Length(Path); SetLength(Path,i+1); Path[i] := Copy(aPath,1,Pos('\',aPath)-1); Delete(aPath,1,Pos('\',aPath)); end; If Path = nil Then Exit; Result := aTreeView.Items.GetFirstNode; i := 0; While Assigned(Result) do Begin If Result.Text = Path[i] Then Begin If i < High(Path) Then Begin Inc(i); Result := Result.getFirstChild; End Else Exit; End Else Result := Result.getNextSibling; End; End; |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
Delphi-Quellcode:
erstellt durch
type
ArrOfStr = array of string; implementation function explode(sPart, sInput: string): ArrOfStr; begin while Pos(sPart, sInput) <> 0 do begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1); Delete(sInput, 1,Pos(sPart, sInput)); end; SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := sInput; end; ![]() Das ist die Funktion, die himitsu meinte. Gibt es bei den ![]() ![]() |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
nur 200? :shock:
selbst wenn .getFirstChild und .getNextSibling nicht optimal implementiert sind, hätt ich schon mehr erwartet Nja, die TTreeView ist auch nicht unbedingt der Schnellste. kennst du die VirtualTreeView? |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
@RWarnecke
Danke Dir. Den Code hab' ich in meine Tools-Unit übernommen. Auch wenn ich es ähnlich hinbekommen hatte, aber immer gut zu haben. Zitat:
TreeView ist wirklich lahm. Aber wirklich peinlich waren meine ersten Versuche mit TreeView (vor Jahren). Da musste ich Kaffee trinken gehen, wenn ich einen Baum aufgebaut habe. (BeginUpdate/EndUpdate kannte ich nicht) Immerhin ist die Wartezeit jetzt von fast 31 Sekunden auf unter 10 Sekunden gefallen. Aus der alten Datenbank müssen ein paar Informationen gezogen werden, leider vergesse ich das Startproblem immer und beende das Programm (um es kurz danach wieder zu starten). Mit ZEOS/Firebird mache ich sehr gute Fortschritte, je mehr man weis, desto einfacher wird es. Dann portiere ich die Datenbank nach SQL und kann RWarnecke Ideen/Code aus Code-Orakel zur Optimierung verwenden. PS: @himistu Der Fairness wegen muss noch erwähnt werden: Deine Version ist übrigens 1400ms schneller, nicht nur 200ms. Zuvor hatte ich bei meiner noch den "StringList-Cheat" aktiv. |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
Hallo Satty67,
hattest Du es mal mit meiner Variante ausprobiert ? Wäre mal interessant, wie schnell meine Variante ist, vielleicht kann man da ja noch etwas optimieren. |
Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)
Hallo Satty67,
vielleicht bringt es noch was den Text-Vergleich mit:
Delphi-Quellcode:
durchzuführen.
CompareText
Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 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