AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi ttreeview ab einem Unterknoten alles auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

ttreeview ab einem Unterknoten alles auslesen

Ein Thema von wwild0473 · begonnen am 7. Aug 2006 · letzter Beitrag vom 28. Mär 2010
Antwort Antwort
wwild0473

Registriert seit: 28. Jun 2006
6 Beiträge
 
#1

ttreeview ab einem Unterknoten alles auslesen

  Alt 7. Aug 2006, 16:15
Hallo,

ich habe folgendes Problem. Ich habe einen treeview. Der hat auf level 0 genau 1 Knoten.
Darunter kann, oder auch nicht ein oder mehrere Unterknoten sein. Ab diesen Unterknoten muß ich jeweils alle Daten des Knoten auslesen. (Die Daten sind eine Klasse "tdlnode" mit einem Datenrecord ".daten".
Alles, was also JEWEILS unter Knotenlevel 1 ist, muß erfaßt werden.
Der entsprechende Knoten auf Level 1 dient mir dabei zum zusammenstellen eines Dateinamens, in die ich allse Daten des Unterknotens reinschreibe.
Ich schaffe es irgendwie nicht, mit den methoden getnext, gentnextsibling etc eine Routine zu bauen, die ab Level 1 alles nach unten durchläuft, und danach wieder bei dem nächsten Knoten auf level 1 wieder anfängt.

Hat jemand eine Idee? Ich habe hier schon unter dem Stichwort ttreenode gesucht, aber nix gefunden.
Und um jetzt auf Virtual Treeview umzusteigen, ist das Programm schon zu weit fortgeschritten.

Danke vielmals
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ttreeview ab einem Unterknoten alles auslesen

  Alt 7. Aug 2006, 16:27
Rekursion! Das Wort heißt Rekursion!

Delphi-Quellcode:
procedure Grab(tns: TTreeNodes);
var node: TTreeNode;
s: string;
begin
  n := tns.getFirstChildNode;
  while Assigned(n) do
    begin
      s := n.Value //mit s kannst du jetzt machen was du willst
      Grab(s.ChildNodes); //hier wird rekursiert!
      n := tns.GetNextSibling(n);
    end;
end;
Das ist jetzt so schnell aus dem Gedächtnis getippt, die code completion sollte dir helfen, da die richtigen Bezeichner reinzutun.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
wwild0473

Registriert seit: 28. Jun 2006
6 Beiträge
 
#3

Re: ttreeview ab einem Unterknoten alles auslesen

  Alt 8. Aug 2006, 09:09
Hallo Luke,

erstmal danke für den Tip. Leider komme ich nicht weiter. Rekursion ist mir jetzt nicht ganz fremd :-)
Ich zeige kurz, wie weit ich bin:
Delphi-Quellcode:
procedure tdlnode.exportdltreetofile;
var
      i:integer;
      DL:textfile;
      zeile,zeile2,dlfile,myenv:string;
      Result:Boolean;
      startp:ttreenode;
      dldata:dlrecord;
begin
  dlfile:=toemnode(selectednode.data).daten.CATTEMP + '\'+toemnode(selectednode.Data).daten.name+'.dls';
  startp := form1.dlview.TopItem.getFirstChild;
  while startp <> nil do
  begin
  showmessage(startp.Text);
  grab(startp);
  startp:=startp.getNextSibling;

  end;


end;

procedure tdlnode.Grab(tns: TTreeNode);
var node: TTreeNode;

begin
  if tns <> nil then
  begin
  node := tns.getFirstChild;
  while Assigned(node) do
    begin
      
      showmessage(node.Text);
      Grab(s.GetNextChild(node)); //hier wird rekursiert!
      node:= tns.GetNextSibling;
    end;
    end;
end;
exportdltreetofile ist ok, ohne den aufruf von Grab(xy). Das mache ich extra so, da ich in einem zweiten Tree eine gleiche node gleichen Namens habe, die Informationen enthält, die ich für die Unterknoten von level 1 brauche (den Dateinamen).
Ich verstehe die funktion GETNEXTCHILD(parameter) nicht ganz. Ich würde sie als "nächste Node:= tns.getnextchild(tns)" verstehen. Aber das kommt mir schon etwas seltsam vor.
Leider habe ich (wie wohl in vielen "Nicht Entwicklerfirmen" üblich) keinerlei Doku, aber ne riesen Erwartungshaltung anderer. Schlage mich mit 2005 Personal rum.
  Mit Zitat antworten Zitat
wwild0473

Registriert seit: 28. Jun 2006
6 Beiträge
 
#4

Re: ttreeview ab einem Unterknoten alles auslesen

  Alt 8. Aug 2006, 11:34
Hallo nochmal,

nach etwas Granufink im Tee hat sich die procedure geklärt. Hier der funktionierende Quellcode für die Funktion, damit andere mit dem gleichen Problem Abhilfe finden :-)

Delphi-Quellcode:
procedure tdlnode.Grab(node: TTreeNode);
var
  TmpNode : TTreeNode;
begin
  If Node <> Nil then

  TmpNode:=Node.getFirstChild;
  While (TmpNode<>Nil) do
    begin
      showmessage(tmpnode.Text);
     grab(TmpNode);
     TmpNode:=Node.getNextChild(TmpNode);
    end;

end;
Anmerkung: Der Parameter "node" ist der Startpunkt.

Danke nochmal für den Hinweis!
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#5

Re: ttreeview ab einem Unterknoten alles auslesen

  Alt 28. Mär 2010, 13:15
hier meine Lösung, kommt ohne zusätzliche Variable aus...

Delphi-Quellcode:
procedure GetSubNodes(const Node:TTreeNode);
begin
  if assigned(Node) then
  begin
    ShowMessage(Node.Text);

    GetSubNodes(Node.getFirstChild,Check); // recurse next level, first child
    GetSubNodes(Node.getNextSibling,Check); // recurse actual level, next node
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#6

Re: ttreeview ab einem Unterknoten alles auslesen

  Alt 28. Mär 2010, 13:30
Zitat von ibp:
hier meine Lösung, kommt ohne zusätzliche Variable aus...
Nicht wirklich ... jedenfalls nicht, wenn man die Rücksprungadresse und den eventuellen Stackframe für den rekursiven Aufruf und sonstige Variablen mitzählt.

Iterativ und mit wirklich nur einer Variable:
Delphi-Quellcode:
procedure Grab(Node: TTreeNode);
var
  TmpNode : TTreeNode;
begin
  TmpNode := Node.getFirstChild;
  while Assigned(TmpNode) do
  begin
    showmessage(TmpNode.Text);
    TmpNode := TmpNode.GetNext;
  end;
end;
gut, sowas wäre auch noch möglich
Delphi-Quellcode:
procedure Grab(Node: TTreeNode);
begin
  Node := Node.getFirstChild;
  while Assigned(Node) do
  begin
    showmessage(Node.Text);
    Node := Node.GetNext;
  end;
end;
Dieses sollte für den Stack und auch sonst speichertechnisch die sparsamste Variante darstellen.


[add]
Zitat:
ttreeview ab einem Unterknoten alles auslesen
Willst du jetzt alles auslesen oder nur alle Unterknoten eines bestimmten Knotens?

Wenn nur alle Unterknoten dann müßte man noch prüfen, ob TmpNode unterhalb von Node liegt oder man verwende doch eine rekursive Methode.

z.B.:
Delphi-Quellcode:
procedure Grab(Node: TTreeNode);
var
  EndNode : TTreeNode;
begin
  EndNode := Node.GetLastChild;
  Node := Node.GetFirstChild;
  if Assigned(Node) then
    repeat
      showmessage(Node.Text);
      Node := Node.GetNext;
    until EndNode = Node;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 22:22 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