![]() |
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, |
Re: Alle Objekte in einer GLScene löschen?
Tag
Normales OpenGL benutzen, da geht das viel einfacher :) Gruß |
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:
nicht.
for x:=0 to Form9.ComponentCount-1 do
if Form9.Components[x] is TGLCube then TGLCube(Form9.Components[x]).Free; |
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.
|
Re: Alle Objekte in einer GLScene löschen?
Zitat:
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 |
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:
Doch dann werden die auch nicht removed
for x:=0 to GLScene1.Objects.Count-1 do
if GLScene1.Objects[x] is TGLCube then GLScene1.Objects[x].DeleteChildren; €dit: ohne die überprüfung
Delphi-Quellcode:
werden offenbar alle Objekte gelöscht, allerdings auch die Camera. wie kann ich das verhindern?
if GLScene1.Objects[x] is TGLCube then
|
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:
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.
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; |
Re: Alle Objekte in einer GLScene löschen?
"Invalide Pointer Operation"
Tut mir leid, aber so gehts nicht? |
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; |
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 12:09 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