AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi GLScene.Objects in TTreeview
Thema durchsuchen
Ansicht
Themen-Optionen

GLScene.Objects in TTreeview

Ein Thema von arbu man · begonnen am 27. Dez 2005 · letzter Beitrag vom 27. Dez 2005
Antwort Antwort
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#1

GLScene.Objects in TTreeview

  Alt 27. Dez 2005, 19:43
Hi,

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

thx für eure Hilfe
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: GLScene.Objects in TTreeview

  Alt 27. Dez 2005, 22:29
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
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#3

Re: GLScene.Objects in TTreeview

  Alt 27. Dez 2005, 23:12
Hey Danke es funktioniert
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  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:02 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