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
 
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
 


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:11 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