Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ausgeklappte Treeviewknoten merken und wieder öffnen (https://www.delphipraxis.net/35074-ausgeklappte-treeviewknoten-merken-und-wieder-oeffnen.html)

Mysterious Spirit 2. Dez 2004 09:42


Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Hallo zusammen.
Ich erstelle in meinem Delphiprogramm mit daten aus eienr Datei eine Treeviews Struktur und diese Struktur erstellt sich jedesmal neu wenn sich Daten ändern, nun möchte ich aber, dass wenn sich dieser Baum neu ertsellt, sich die vorher geöffneten Knoten, wenn sie noch exisiteren, wieder öffnen.
Dazu hatte ich überlegt den Status mithifle von expand abzufragen und in einbem array zu speichern nur irgendwie weiß ich nciht genau wie ich das hinbekommen soll :\ Ich hoffe mir kann wer weiterhelfen.

Orbmu2k 2. Dez 2004 09:51

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Zitat:

Zitat von Mysterious Spirit
Hallo zusammen.
die vorher geöffneten Knoten, wenn sie noch exisiteren, wieder öffnen.

Am besten du speicherst dir den Index, den Text und den Expand Status von dem Knoten.

Dann nach dem einlesen Prüfst du ob Text und Index noch gleich sind und setzt den ensprechenden Expand Status

Mysterious Spirit 2. Dez 2004 09:56

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Wie könnte ich das den speichern, bräuchte ich da nicht ein Mehrdimensionales array? Ich muss ja dann mehr als eine Sache speichern.

shmia 2. Dez 2004 09:58

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Zitat:

Zitat von Mysterious Spirit
Ich erstelle in meinem Delphiprogramm mit daten aus eienr Datei eine Treeviews Struktur und diese Struktur erstellt sich jedesmal neu wenn sich Daten ändern, nun möchte ich aber, dass wenn sich dieser Baum neu ertsellt, sich die vorher geöffneten Knoten, wenn sie noch exisiteren, wieder öffnen.
Dazu hatte ich überlegt den Status mithifle von expand abzufragen und in einbem array zu speichern nur irgendwie weiß ich nciht genau wie ich das hinbekommen soll :\ Ich hoffe mir kann wer weiterhelfen.

Tja, nicht so einfach.
Aber hast du schon die Eigenschaft AutoExpand von TTreeView ausgenützt?
Einfach eine CheckBox aufs Formular mit folgendem OnClick-Handler:
Delphi-Quellcode:
procedure TForm1.CboAutoExpandClick(Sender: TObject);
begin
   TreeView1.AutoExpand := (Sender as TCheckBox).Checked;
end;
Ausserdem sollte TTreeview.FullExpand & .FullCollapse über ein Kontextmenue erreichbar sein.

Orbmu2k 2. Dez 2004 10:00

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
z.B. mit TList und einem Record aus den 3 Eigenschafften

ibp 2. Dez 2004 10:04

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
wie sieht denn die baumstruktur aus, wieviele levels gibt es oder kann es geben?..

Jens Schumann 2. Dez 2004 10:23

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Hallo,
das funktioniert eigentlich nur über den NodeText.
Merke Dir den NodeText und suche nach dem sich der
Baum neu aufgebaut hat den Node mit dem Text im Baum.
Dann kannst Du
Delphi-Quellcode:
TTreeView.Selected:=Node;
aufrufen.
Index merken oder das TTreeNode merken macht keinen Sinn.
Denn -> Wenn sich der Baum neu aufgebaut hat ist der Index ungültig
(oder rein zufällig passt der Index). Der TTreeNode ist auf jeden
Fall verschwunden. Wird ja freigegeben bevor sich der Baum neu
aufbaut.

Mysterious Spirit 2. Dez 2004 11:51

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Vielen Dank für eure Hilfe, habe es nun hinbekommen teilweise mit einem Artikel aus eienr Tippsammlung und den Rest selbst zusammengefummelt, habe es wie folgt gelöst:


Vorab:
TWTitelbaum bezeichnet meine TTreeviewkomponente
offene ist ein dynamisches Arry vom Typ String


Als erstes speichere ich alle offenen Knoten bzw. deren namen in dem Array offene
Delphi-Quellcode:
procedure TForm1.Titelbaumoeffnungmerken;
var
i,j,k:Integer;
Anzahloffener:Integer;
begin
  k:=0;
  for i := 0 to TWTitelbaum.Items.Count - 1 do
  begin
    If TWTitelbaum.Items[i].Expanded = True then
    begin
      Anzahloffener := Anzahloffener + 1;
    end;
  end;
  SetLength(offene, Anzahloffener);
  for j := 0 to TWTitelbaum.Items.Count - 1 do
  begin
    If TWTitelbaum.Items[j].Expanded = True then
    begin
      offene[k] := TWTitelbaum.Items[j].Text;
      k := k + 1;
    end;
  end;
end;

Danach habe ich im Netz eine Suchfunktion gefunden wie man nach dem text von Knoten sucht (swissdelphicenter.ch)
Delphi-Quellcode:
function TForm1.ItemSuche(TV: TTreeView; SucheItem: string): TTreeNode;
var
  i: Integer;
  iItem: string;
begin
  if (TV = nil) or (SucheItem = '') then Exit;
  for i := 0 to TV.Items.Count - 1 do
  begin
    iItem := TV.Items[i].Text;
    if SucheItem = iItem then
    begin
      Result := TV.Items[i];
      Exit;
    end
    else
    begin
      Result := nil;
    end;
  end;
end;

Und als letztes eine Funktion die alle gespeicherten Knoten sucht und wenn sie geufnden sind, diese öffnet
Delphi-Quellcode:
procedure Tform1.Titelbaumoeffnungherstellen;
var
  i:Integer;
begin
   for i := 0 to high(offene) do
   begin
    If Itemsuche(TWTitelbaum,offene[i]) <> nil then //*Update* Fehler abfangen falls der Knoten nciht mehr existiert
    Itemsuche(TWTitelbaum,offene[i]).Expand(False);
   end;
end;
Wenn jemand zu der Lösung noch fragen hat ruhig fragen *g* ;)
Vielen Dank für eure Hilfe!

Orbmu2k 2. Dez 2004 11:58

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Also sicher ist das noch nicht da jetzt bei Gleichem Text vieleicht auch Nodes ausgeklappt werden die gar nicth sollen...

Habe mir aber überlegt (weil sich der index doch zu häufig ändert) wenn du dir noch den Text vom ParentNode und das Level des Nodes mit sicherst hast du ne höhere wahrscheinlichkeit das es nur die richtigen trifft.

Mysterious Spirit 2. Dez 2004 12:01

Re: Ausgeklappte Treeviewknoten merken und wieder öffnen
 
Das sist richtig, ahbe daran nciht gedacht weil bei meinem Proggie dass nciht vorkommen kann, dass 2 Knoten denselben text bekommen. Müsste dann jemand der das benötgit sich noch den Code erweitern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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