AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView durchsuchen und löschen

Ein Thema von Thorben_Ko · begonnen am 30. Okt 2007 · letzter Beitrag vom 30. Okt 2007
Antwort Antwort
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#1

TreeView durchsuchen und löschen

  Alt 30. Okt 2007, 18:15
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:


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

SIeht jemand meinen Fehler? Oder hat jemand ne bessere Idee?

Danke schon mal,

Gruss Thorben
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TreeView durchsuchen und löschen

  Alt 30. Okt 2007, 20:10
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:
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;
Es wird der Knoten gelöscht der mit dem Text in StrKnoten übereinstimmt.

Aufrufen kann man das ganze dann so:

Delphi-Quellcode:
SuchString:= Edit2.Text;
SuchenUndLoeschen (TreeView1.Items, SuchString);
In Edit2, wird in diesem Beispiel der gesuchte Begriff eingegeben und anschließend im TreeView gelöscht.
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
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
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#4

Re: TreeView durchsuchen und löschen

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz