Einzelnen Beitrag anzeigen

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, 19: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