Delphi 如何防止Firemonkey复合组件中的子组件重复?

Delphi 如何防止Firemonkey复合组件中的子组件重复?,delphi,firemonkey,custom-component,delphi-xe5,Delphi,Firemonkey,Custom Component,Delphi Xe5,我正在尝试编写一个从TDummy派生的复合组件。组件源为: TMyObjectType=(otCube,otSphere); TMyGameObject=class(TDummy) private FObj:TCustomMesh; FMyObjectType: TMyObjectType; procedure SetMyObjectType(const Value: TMyObjectType); public constructor Creat

我正在尝试编写一个从TDummy派生的复合组件。组件源为:

  TMyObjectType=(otCube,otSphere);
  TMyGameObject=class(TDummy)
  private
    FObj:TCustomMesh;
    FMyObjectType: TMyObjectType;
    procedure SetMyObjectType(const Value: TMyObjectType);
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
    property MyObjectType:TMyObjectType read FMyObjectType write SetMyObjectType;
  end;

{ TMyGameObject }

constructor TMyGameObject.Create(AOwner: TComponent);
begin
  inherited;
  MyObjectType:=otCube;
end;

destructor TMyGameObject.Destroy;
begin
  FObj.Parent.RemoveObject(FObj);
  FreeAndNil(FObj);
  inherited;
end;

procedure TMyGameObject.SetMyObjectType(const Value: TMyObjectType);
begin
  FMyObjectType := Value;
  if(Assigned(FObj))then begin
    FObj.Parent.RemoveObject(FObj);
    FreeAndNil(FObj);
  end;
  case FMyObjectType of
    otCube: FObj:=TCube.Create(Self);
    otSphere: FObj:=TSphere.Create(Self);
  end;
  FObj.SetSubComponent(True);
  FObj.Parent:=Self;
end;
在我注册组件并将TViewport3D上的一个实例放在Tbutton代码中之后,我尝试将MyObjectType更改为otSphere

MyGameObject1.MyObjectType:=otSphere;
但似乎什么也没有发生。所以我写了一段代码作为休闲

procedure MyParseObj(obj:TFmxObject;var s:string);
var
  i: Integer;
  a:string;
begin
  s:=s+obj.ClassName+'(';
  a:='';
  for i := 0 to obj.ChildrenCount-1 do begin
    s:=s+a;
    MyParseObj(obj.Children.Items[i],s);
    a:=',';
  end;
  s:=s+')'
end;
再按另一个按钮

procedure TForm1.Button2Click(Sender: TObject);
var s:string;
begin
  s:='';
  MyParseObj(myGameObject1,s);
  ShowMessage(s);
end;
结果很奇怪。 如果我按下按钮2,结果是:TMyGameObject(TCube(),TCube())

当我按下按钮1,然后按下按钮2,结果是:TMyGameObject(TCube(),TSphere())

为什么在我的对象中有两个TCustomMesh作为孩子?(TCube和TSphere源自TCustomMesh) 我怎样才能解决这个问题

我还做了另一个测试。如果我不是在设计时创建对象,它会正常工作。当您保存表单(从IDE)时,如果我将TMyGameObject的实例放入设计时

中,则会出现问题。所有控件及其子控件都会被保存。如果控件创建了自己的子控件,则需要将Stored=False设置为防止IDE对它们进行流式传输