在GLScene中加载新场景

时间:2014-04-04 08:14:38

标签: freepascal lazarus glscene

我试图删除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;

1 个答案:

答案 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;

我长时间使用该代码时从未遇到任何问题,所以请随意使用。