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