Загрузить новую сцену в GLScene

Я пытаюсь удалить все объекты сцены в контейнере GLScene, и я использую следующий фрагмент кода, чтобы сделать это, но по некоторым неизвестным причинам происходит сбой, который вызывает ошибку сегментации, когда я пытаюсь освободить объект.

Я попытался отладить построчно, и это показало, что как-то контейнерный класс Glscene1.Objects[i] содержит некоторые необъяснимые классы с именем класса "#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 ответ

Самая частая ошибка - попытка удалить GlFreeForm, когда еще есть GLProxyObject, который ссылается на родительский GlFreeForm. Таким образом, наилучшее решение для очистки сцены - сначала установить для параметра MasterObject всех GLProxyObject значение 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;

У меня никогда не было проблем с этим кодом в течение долгих 4 лет интенсивного использования, поэтому не стесняйтесь его использовать.

Другие вопросы по тегам