【发布时间】:2014-05-18 12:39:47
【问题描述】:
我正在尝试编写一个从 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;
结果很奇怪。 如果我按下button2结果是:TMyGameObject(TCube(),TCube())
当我按下 button1 之后按下 button2 结果是: TMyGameObject(TCube(),TSphere())
为什么我的对象中有两个 TCustomMesh 作为子对象? (TCube和TSphere是从TCustomMesh派生的) 我该如何解决这个问题?
我还进行了另一项测试。如果我不在设计时创建对象,它会正常工作。如果我将 TMyGameObject 的实例放在设计时中,就会出现问题。
【问题讨论】:
标签: delphi firemonkey custom-component delphi-xe5