Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi GLScene.Objects in TTreeview (https://www.delphipraxis.net/59721-glscene-objects-ttreeview.html)

arbu man 27. Dez 2005 18:43


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:
Objects.Children[0].Children[0].Children[0]. ...
Wie liste ich nun diese Objekt in eine TTreeview?

thx für eure Hilfe

Der_Unwissende 27. Dez 2005 21:29

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:
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;
Ja, wie gesagt nicht gerade ein schöner Weg, dein Stack wird sich wenig dankbar zeigen.
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:
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;
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.

Gruß Der Unwissende

arbu man 27. Dez 2005 22:12

Re: GLScene.Objects in TTreeview
 
Hey Danke es funktioniert :-D


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