0

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;
4

1 に答える 1

0

最もよくある間違いは、親 GlFreeForm を参照する GLProxyObject がまだあるときに 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;

私はそのコードで 4 年間の長い使用頻度で問題が発生したことは一度もありませんので、気軽に使用してください。

于 2015-06-09T01:41:47.007 に答える