Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Alle Objekte in einer GLScene löschen? (https://www.delphipraxis.net/14536-alle-objekte-einer-glscene-loeschen.html)

Pyr0cracker 11. Jan 2004 02:46


Alle Objekte in einer GLScene löschen?
 
Moin!
Ich möchte gerne alle Objekte in meiner GLScene löschen.
Wie kann ich das machen? hab schon quelltext undhilfen durchgesucht...

Danke schonmal,

moritz 11. Jan 2004 09:53

Re: Alle Objekte in einer GLScene löschen?
 
Tag

Normales OpenGL benutzen, da geht das viel einfacher :)

Gruß

inherited 14. Aug 2006 11:08

Re: Alle Objekte in einer GLScene löschen?
 
Ich möchte das hier nochmal aufleben lassen. Auch ich möchte das versuchen, allerdings scheitere ich. Aus irgend einem Grund geht
Delphi-Quellcode:
  for x:=0 to Form9.ComponentCount-1 do
    if Form9.Components[x] is TGLCube then
      TGLCube(Form9.Components[x]).Free;
nicht.

Khabarakh 14. Aug 2006 11:36

Re: Alle Objekte in einer GLScene löschen?
 
"Geht nicht", toll :roll: . Woran scheitert es denn? Wenn die Würfel gar nicht in der Collection enthalten sind, hast du wohl vergessen, bei deren Erstellung die Form als Owner anzugeben.

Der_Unwissende 14. Aug 2006 12:21

Re: Alle Objekte in einer GLScene löschen?
 
Zitat:

Zitat von inherited
Aus irgend einem Grund geht
Delphi-Quellcode:
  for x:=0 to Form9.ComponentCount-1 do
    if Form9.Components[x] is TGLCube then
      TGLCube(Form9.Components[x]).Free;
nicht.

Hi,
Irgendeiner ist schon etwas ungenau. Es liegt eigentlich nur daran, dass du hier etwas frei geben möchtest, was noch benutzt wird. Damit du etwas in GLScene ohne Probleme freigeben kannst, solltest du erstmal dafür sorgen, dass es aus der Szene entfernt wird. Dazu gab es eine Methode (die ich nicht im Kopf habe). Hab auch gerade kein GLScene da um nach zu schauen (und keine Lust es jetzt zu installieren). Die Methode erklärt sich einfach mal von selbst. Wenn du Objekte erzeugst und anzeigst, dann glaube ich wird das GLScene Objekt mit insertNewChild oder sowas aufgerufen (ist echt lange her), ganz analog gab es sowas wie removeChild. Hier gibt es auch die Methode removeAll... musst du mal schauen. Wenn man jedenfalls erst aus der Szene entfernt kann man die ohne Probleme frei geben!

Gruß Der Unwissende

inherited 14. Aug 2006 12:41

Re: Alle Objekte in einer GLScene löschen?
 
Sorry, es wird nicht removed, die Cubes bleiben.
Hab es jetzt so probiert, da removeall nicht existiert
Delphi-Quellcode:
  for x:=0 to GLScene1.Objects.Count-1 do
    if GLScene1.Objects[x] is TGLCube then
      GLScene1.Objects[x].DeleteChildren;
Doch dann werden die auch nicht removed
€dit: ohne die überprüfung
Delphi-Quellcode:
    if GLScene1.Objects[x] is TGLCube then
werden offenbar alle Objekte gelöscht, allerdings auch die Camera. wie kann ich das verhindern?

Der_Unwissende 14. Aug 2006 13:08

Re: Alle Objekte in einer GLScene löschen?
 
Ah ja, da ist ein kleiner Fehler drin. GLScene.Objects gibt dir immer ein Wurzelelement zurück. Dieses enthält alle BaseSceneObjects (wenn ich mich richtig erinner), die wiederum als Elternteil für weitere BaseSceneObjects dienen können.
Versuch es mal mit etwas wie:
Delphi-Quellcode:
var buffer : TGLBaseSceneObject;
begin
  if GLScene.Objects.Count > 0 then
  begin
    for i := 0 to GLScene.Objects.Count - 1 do
    begin
      if GLScene.Objects.Children[i] is TGLCube then
      begin
        buffer := GLScene.Objects.Children[i];
        GLScene.Objects.Remove(buffer);
        buffer.Free;
      end; // if GLScene.Objects.Children[i] is TGLCube
    end; // for i := 0 to GLScene.Objects.Count - 1
  end; // if GLScene.Objects.Count > 0
end;
Also so ungefähr, irgendwie konnte man glaube ich noch sagen, was mit den Kindern von einem Objekt geschehen soll, wenn dieses entfernt wird. Musst du ggf. anpassen, ist leider ungetestet. Sitze gerade vor einem sehr langsamen Rechner, da würde es wirklich lange dauern Delphi mit GLScene zum laufen zu bekommen.

inherited 14. Aug 2006 13:47

Re: Alle Objekte in einer GLScene löschen?
 
"Invalide Pointer Operation"
Tut mir leid, aber so gehts nicht?

arbu man 14. Aug 2006 13:56

Re: Alle Objekte in einer GLScene löschen?
 
Hier die funktion um alle glscene objekte aufzulisten dannnach noch die liste abarbeiten und die objekte freigeben, am besten mit findchild und einer abfrage auf <>nil.
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;

function scenetolist: tstringlist;
var i : Integer;
    List : TObjectList;
    element : TElement;
    buffer : TTreeNode;
begin
  result:=tstringlist.Create;
  List := TObjectList.Create;
  if root.Count > 0 then
    begin
      for i := 0 to root.Count - 1 do
        begin
              List.Add(TElement.Create(nil, root.Children[i]));
        end;
    end;

  while List.Count > 0 do
    begin
      element := TElement(List.Extract(List.First));
      result.Add(element.Obj.Name);
      if element.Obj.Count > 0 then
        begin
          for i := 0 to element.Obj.Count - 1 do
            begin
                  List.Add(TElement.Create(nil, element.Obj.Children[i]));
            end;
        end;
      element.Free;
    end;
end;

Der_Unwissende 14. Aug 2006 13:57

Re: Alle Objekte in einer GLScene löschen?
 
Hüstel, na ja, ist halt auch ein kluger Fehler, was für Profis so zu sagen. Dreh einfach mal die Schleifenvariable um, also von GLScene.Objects.Count - 1 downto 0 ... da würde ich sagen könnte ein solcher Fehler her kommen, wenn man etwas entfernt verschiebt sich natürlich die Position aller Elemente!

Dann sollte es aber auch klappen, der Rest müsste schon stimmen, denke ich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr.
Seite 1 von 2  1 2      

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