Hallo Thorben,
du sammelst zuerst alle zu löschenden Knoten ein. Kann es denn nie passieren, dass du später einen Knoten in deinem Array löschen willst, dessen Parent du bereits zuvor gelöscht hast?
Ich möchte dir noch einen anderen Ansatz vorstellen, der ohne das Einsammeln auskommt:
Delphi-Quellcode:
procedure DeleteChildNodes(parentNode: TTreeNode; s: TStrings);
var
i: Integer;
node: TTreeNode;
begin
with parentNode do
for i := Pred(Count) downto 0 do
begin
node := Item[i];
if s.IndexOf(node.Text) >= 0 then
node.Delete else
if node.HasChildren then
DeleteChildNodes(node, s);
end;
end;
procedure DeleteRootNodes(nodes: TTreeNodes; s: TStrings);
var
i: Integer;
node: TTreeNode;
begin
with nodes do
for i := Pred(Count) downto 0 do
begin
node := Item[i];
if s.IndexOf(node.Text) >= 0 then
node.Delete else
if node.HasChildren then
DeleteChildNodes(node, s);
end;
end;
procedure TDemoForm.RemoveButtonClick(Sender: TObject);
begin
DeleteRootNodes(TreeView.Items, Memo.Lines);
end;
Das Memo enthält deine Knotentexte, die zur Löschung führen sollen. Aus deinem Code entnehme ich, dass dein Löschen eine Art von Ausblenden realisieren soll - eventuell reicht dir da ja schon das Verstecken mittels der Knoteneigenschaft Visible? Statt einer StringList für deine Knotenbeschriftungen kannst du auch mit der Funktion AnsiIndexText() und einem Array arbeiten.
Gute Nacht