2014-04-04 1 views
0

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; 
+0

안녕하세요. Sonya. for, 즉 i : = GlScene1.Objects.Count-1 downto 0 do ...을 반대로하는 것이 좋습니다. 그렇지 않으면 삭제하려는 개체 인덱스가 이미 범위를 벗어 났을 수 있습니다. –

+0

Google 직원의 경우 다운 카운팅은 장면의 오브젝트를 지우는 데 좋은 전략이지만 의도 한 클래스 유형을 제외하는 대신 의도 한 클래스 유형 만 지우려고 시도합니다. GLFreeForm, GLLines 등등. 알 수없는 몇 가지 이유로 GLScene 루트 개체 컨테이너 클래스에 일부 참조 또는 차단 개체가있는 모든 이들도 삭제, 이것은 임시적으로 배웠습니다. –

답변

0

가장 자주 실수를 한 것은 GlFreeForm이 부모 GlFreeForm을 참조하는 GLProxyObject가있는 경우 GlFreeForm을 삭제하려고 시도하는 것입니다. 그러므로 장면을 지우는 가장 좋은 해결책은 먼저 모든 GLProxyObject의 MasterObject 매개 변수를 nil로 설정하는 것입니다. 나는 무거운 사용의 긴 사년 동안 그 코드에 문제가 없었

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; 

: 다른 모든 장면 객체의 루트 객체로서가 (이 예에서는 GLDummyCube1) 단일 GLDummyCube를 사용하는 것이 좋습니다 객체를 막지 않도록하려면 , 그래서 그것을 자유롭게 사용하십시오.