![]() |
TreeView durchsuchen und löschen
Hallo, ich hab ein Formular mit einem TTreeView, ich möchste alle Nodes durchsuchen. Wenn der Node Text und der such text die selben sind soll es geschlöscht werden.
so hab ich es gemacht:
Delphi-Quellcode:
Das geht auch Teilweise... Bis Node Level 4 geht das, aber bei den anderen Notes geht das nicht mehr. Ich hab schon mal versucht ein String zu suchen der NUR in der 5. Ebene zu finden, aber kein Erflog. Als wenn der nach Level 4 keine lust mehr hätte...type DelArray = arrey of TTreeNode; procedure TMainForm.DeleteItems(parent:TTreeNode; var del:TDelArray); var node : TTreeNode; begin if (CompareText('TABLE_CAD_ZUORD', Uppercase(parent.Text)) = 0) or (CompareText('PROTOTYP', Uppercase(parent.Text)) = 0) or (CompareText('NUMBERNODES', Uppercase(parent.Text)) = 0) or (CompareText('TABLE_NUMBERNODES', Uppercase(parent.Text)) = 0) or (CompareText('CARINCAD', Uppercase(parent.Text)) = 0) or (CompareText('1', Uppercase(parent.Text)) = 0) or (CompareText('TABLE_VARINCAD', Uppercase(parent.Text)) = 0) or (CompareText('TABLE_DATEIFILTER', Uppercase(parent.Text)) = 0) or (CompareText('PLANLAUF', Uppercase(parent.Text)) = 0) then begin SetLength(del, Length(del) +1); del[high(del)] := parent; if (CompareText('TABLE_DATEIFILTER', Uppercase(parent.Text)) = 0) then ShowMessage('Hallo, hmm'); Exit; end; if parent.HasChildren then begin node := parent.getFirstChild; while Assigned(Node) do begin DeleteItems(node, del); node := node.getNextSibling; end; end; end; // Alle Überflüssigen Knoten werden wieder gelöscht. procedure TMainForm.BlendeAus(); var anz, i : LongInt; del : TDelArray; node : TTreeNode; begin SetLength(del, 0); node := TreeView.Items.GetFirstNode; while Assigned(Node) do begin DeleteItems(node, del); node := node.getNextSibling; end; for I := Low(del) to High(del) do begin del[i].DeleteChildren; del[i].Delete; end; SetLength(del, 0); end; SIeht jemand meinen Fehler? Oder hat jemand ne bessere Idee? Danke schon mal, Gruss Thorben |
Re: TreeView durchsuchen und löschen
Hallo Thorben_Ko,
wo Du in Deinem Quell – Code nun den Fehler hast kann ich nicht sagen. Aber vielleicht hilft Dir diese Funktion weiter:
Delphi-Quellcode:
Es wird der Knoten gelöscht der mit dem Text in StrKnoten übereinstimmt.
function SuchenUndLoeschen (Baum: TTreeNodes; StrKnoten: String):boolean;
var Knoten: TTreeNode; begin Result:= FALSE; Knoten:= Baum.getFirstNode; while Knoten <> NIL do begin If (CompareText(Knoten.Text, StrKnoten)=0) then begin knoten.Delete; Result:= TRUE; Break; end; Knoten:= knoten.GetNext; end; end; Aufrufen kann man das ganze dann so:
Delphi-Quellcode:
In Edit2, wird in diesem Beispiel der gesuchte Begriff eingegeben und anschließend im TreeView gelöscht.
SuchString:= Edit2.Text;
SuchenUndLoeschen (TreeView1.Items, SuchString); Zu beachten ist das auch die Kinder – Knoten die am Konten hängen mit gelöscht werden. Willst Du den Knoten im Baum mit der Maus markieren und dann löschen, muss man allerdings anders vorgehen. Bis bald Chemiker |
Re: TreeView durchsuchen und löschen
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:
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.
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; Gute Nacht |
Re: TreeView durchsuchen und löschen
Hallo marabu,
nein das kann es nicht, weil ich ein Exit rein haue wenn der einen Knoten gefunden hab. Die Unterknoten eines zu löschenknoten werden gar nicht erst durchsucht. Zumindest sollte das so sein .... Deinen Ansatz werd ich mal testen, leider kann ich dies erst am freitag tun. Danke trotzdem schon mal Thorben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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