Delphi 如何防止Firemonkey复合组件中的子组件重复?
我正在尝试编写一个从TDummy派生的复合组件。组件源为: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
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对它们进行流式传输