![]() |
GLScene.Objects in TTreeview
Hi,
:duck: *hoffe das ist die richtige kategorie, sonst verschiebst halt einfach* Ich möchte alle Objekte von GLScene.Objects in einen TTreeview auflisten, mein problem ist nur wie mache ich das das auch die UnterObjekte angezeigt werden ? zu GLScene.Objects: Da gibt es einmal die eigenschaft count die anzeigt wieviele Okjekt da drin sind und die eigenschaft Children[i] bit der ich auf die unterobjekte zu greifen kann. Nur leider kann das ganze auch so aussehen:
Delphi-Quellcode:
Wie liste ich nun diese Objekt in eine TTreeview?
Objects.Children[0].Children[0].Children[0]. ...
thx für eure Hilfe |
Re: GLScene.Objects in TTreeview
Hi,
Was genau möchtest du denn anzeigen lassen? Den Namen der jeweiligen Komponente? Also jetzt etwas abstrakt gibt es zwei Möglichkeiten. Der unschönere aber leichter zu programmierende wäre es das ganze einfach rekursiv zu machen. Du übergibst immer den aktuellen Vaterknoten in deiner Listview und das aktuelle GLObject. Dann trägst du dort das Kind ein und der dort entstandene Knoten durchläuft rekursiv die gleiche Methode. Sehr grob modelliert (muss hier nicht richtig sein!)
Delphi-Quellcode:
Ja, wie gesagt nicht gerade ein schöner Weg, dein Stack wird sich wenig dankbar zeigen.
var Tree : TTreeView;
procedure toTree(ParentNode : TTreeNode; Obj : TGLBaseSceneObject); var buffer : TTreeNode; i : Integer; begin if assigned(Obj) then begin buffer := Tree.AddChild(ParentNode, Obj.Name); if Obj.Count > 0 then begin for i := 0 to Obj.Count - 1 do begin toTree(buffer, Obj.Children[i]); end; // for i := 0 to Obj.Count - 1 end; // if Obj.Count > 0 end; // if assigned(Obj) end; // Aufruf: procedure SceneToTree; var i : Integer; begin if GLScene.Objects.Count > 0 then begin for i := 0 to GLScene.Objects.Count - 1 do begin toTree(nil, GLScene.Objects.Children[i]); end; // for i := 0 to GLScene.Objects.Count - 1 end; // if GLScene.Objects.Count > 0 end; Versuch es lieber iterativ. Mir würde hier natürlich sofort Breitensuche einfallen. Du verwaltest einfach eine Liste, mit Elementen die du noch betrachten willst (kannst du natürlich auch mittels Tiefensuche realisieren). Also du hast eine Liste und packst dort immer alle Elemente der ersten Ebene rein. Diese betrachtest du nacheinander. Findest du in einem dieser Elemente Kinder, hängst du die einfach hintern ran (und merkst dir den Vater). Dann arbeitest du so einfach nur die Liste ab.
Delphi-Quellcode:
Sorry, ist sicher kein sauberer Code (gerade Kommentare fehlen) und es gibt sicher auch schönere Lösungen, aber vielleicht dient es dir ja schon als Basis.
type
TElement = class(TObject) Node : TTreeNode; Obj : TGLBaseSceneObject; constructor create(Node : TTreeNode; Obj : TGLBaseSceneObject); end; constructor TElement.create(Node : TTreeNode; Obj : TGLBaseSceneObject); begin self.Node := Node; self.Obj := Obj; end; procedure TForm1.toTree; var i : Integer; List : TObjectList; element : TElement; buffer : TTreeNode; begin List := TObjectList.Create; if GLScene.Objects.Count > 0 then begin for i := 0 to GLScene.Objects.Count - 1 do begin List.Add(TElement.Create(nil, GLScene.Objects.Children[i])); end; // for i := 0 to GLScene.Objects.Count - 1 end; // if GLScene.Objects.Count > 0 while List.Count > 0 do begin element := TElement(List.Extract(List.First)); buffer := TreeView.Items.AddChild(element.Node, element.Obj.Name); if element.Obj.Count > 0 then begin for i := 0 to element.Obj.Count - 1 do begin List.Add(TElement.Create(buffer, element.Obj.Children[i])); end; // for i := 0 to element.Obj.Count - 1 end; // if element.Obj.Count > 0 element.Free; end; // while List.Count > 0 end; Gruß Der Unwissende |
Re: GLScene.Objects in TTreeview
Hey Danke es funktioniert :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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