Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: TreeView durchsuchen und löschen

  Alt 30. Okt 2007, 20:14
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
  Mit Zitat antworten Zitat