AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TreeView-Nodes anhand Pfad-String finden (zu langsam)
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView-Nodes anhand Pfad-String finden (zu langsam)

Ein Thema von Satty67 · begonnen am 5. Mär 2009 · letzter Beitrag vom 6. Mär 2009
Antwort Antwort
Seite 2 von 3     12 3      
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#11

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:09
^- 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:
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;
Das ganze muss ich jetzt noch feintunen...
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#12

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:15
Path := Explode('\', ExcludeTrailingBackslash(aPath)); Explode/ExcludeTrailingBackslash kennt D5 nicht,
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#13

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:22
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]

ExplodeExplode zerlegt einfach nur den String anhand von eines Trennzeichens in Einzelstrings.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#14

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:28
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?
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#15

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:38
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;
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#16

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:49
Delphi-Quellcode:
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;
erstellt durch Code-Orakel und dem BBCode-Plugin.
Das ist die Funktion, die himitsu meinte. Gibt es bei den Schweizern oder auch hier in der Code-Library.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#17

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 18:55
nur 200?

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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#18

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 5. Mär 2009, 19:06
@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 von himitsu:
kennst du die VirtualTreeView?
Ja, darauf hoffe ich wenn ich auf Delphi 200x upgedated hab'. Leider ist VirtualTreeView erst ab D6. Hatte mal versucht den Code anzupassen, aber das war zuviel des guten. Auch mit ein Grund, warum das wirklich treue D5 doch langsam 2te Geige spielen muss.

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.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#19

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 6. Mär 2009, 07:15
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: TreeView-Nodes anhand Pfad-String finden (zu langsam)

  Alt 6. Mär 2009, 08:14
Hallo Satty67,

vielleicht bringt es noch was den Text-Vergleich mit:

CompareText durchzuführen.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz