2014-04-04 85 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

對於谷歌來說,減計數也是擦除場景中物體的好策略,但除此之外,不是排除預期的分類類型,而是嘗試僅擦除預期的類類型,例如GLFreeForm,GLLines等等。由於某些未知的原因,GLScene根目錄在Object容器類中有一些引用或阻止對象,您也可以刪除它們,這是我暫時學到的。 –

回答

0

最常犯的錯誤是嘗試刪除GlFreeForm,當GLProxyObject存在父級GlFreeForm。因此,清除場景的最佳解決方案是首先將所有GLProxyObject的MasterObject參數設置爲零。爲了避免阻塞,建議(在這個例子中GLDummyCube1)使用單一GLDummyCube對象作爲根對象爲所有其他場景中的物體:

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年大量使用的,所以請隨時使用它。