Загрузить новую сцену в 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 лет интенсивного использования, поэтому не стесняйтесь его использовать.