我试图删除GLScene容器中的所有场景对象,并使用以下代码片段来执行此操作,但由于某些未知原因,当我尝试释放对象时,崩溃会引发分段错误。 / p>
我尝试逐行调试,并且它揭示了Glscene1.Objects[i]
的某种容器类包含了一些无法解释的类,其中包含了#2;#2;'班级名称。我试图通过调用Free方法运行完全相同的代码片段然后没有发生任何异常,对象不会被删除但是对象类名称是一致的。
for i := 0 to GLScene1.Objects.Count - 1 do
begin
if (not GLScene1.Objects[i].ClassNameIs('TGLCamera')) and
(not GLScene1.Objects[i].ClassNameIs('TGLLightSource')) and
(not GLScene1.Objects[i].ClassNameIs('TGLDummyCube')) and
(not GLScene1.Objects[i].ClassNameIs('TGLXYZGrid')) and
(not GLScene1.Objects[i].ClassNameIs('TGLSceneRootObject')) then
begin
// if GLScene1.Objects[i].Count > 0 then
// GLScene1.Objects[i].DeleteChildren;
GLScene1.Objects.Remove(GLScene1.Objects[i],false);
if GLScene1.Objects[i] <> nil then // I comment out these lines
GLScene1.Objects[i].free; // I comment out these lines
end;
end;
答案 0 :(得分:0)
最常犯的错误是当仍有GLProxyObject向父GlFreeForm提供时,尝试删除GlFreeForm。因此,清除场景的最佳解决方案是首先将所有GLProxyObject的MasterObject参数设置为nil。为避免阻塞对象,建议使用单个GLDummyCube(本例中为GLDummyCube1)作为所有其他场景对象的根对象:
if Form1.GLDummyCube1.Count>0 then
begin
for I := (Form1.GLDummyCube1.Count-1) downto 0 do
begin
if (Form1.GLDummyCube1.Children[I].ClassNameIs('TGLProxyObject')) then
begin
TGLProxyObject(Form1.GLDummyCube1.Children[I]).MasterObject := nil;
end;
end;
while (Form1.GLDummyCube1.Count>0) do
begin
try
Form1.GLScene1.FindSceneObject(Form1.GLDummyCube1.Children[0].Name).Destroy;
except
//inform error, but I never had one
end;
end;
end;
我长时间使用该代码时从未遇到任何问题,所以请随意使用。