【问题标题】:How can I prevent duplication of sub components in Firemonkey compound component?如何防止 Firemonkey 复合组件中的子组件重复?
【发布时间】: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


    【解决方案1】:

    当您(从 IDE)保存表单时,所有控件及其所有子项都会被保存。如果您的控件创建了自己的子控件,则需要设置 Stored = False 以防止它们被 IDE 流式传输。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2020-01-24
      • 2020-03-09
      • 2011-06-27
      • 2017-07-10
      • 2016-12-11
      相关资源
      最近更新 更多