如何调用克隆的对象

时间:2014-06-23 16:26:51

标签: delphi delphi-7 cloning

我将面板及其内容(图像和复选框)克隆20次。

正在克隆的小组样本:

enter image description here

这是用于克隆整个面板的过程:

procedure TForm1.ClonePanel(pObjectName: Tpanel);
var   apanel : Tpanel;
  Ctrl, Ctrl_: TComponent;
  i: integer;
 begin
  //handle the Control itself first
   TComponent(apanel) := CloneComponent(pObjectName);
    with apanel do
    begin
     Left := 24;
     Top :=64;
    end;

  //now handle the childcontrols
  for i:= 0 to pObjectName.ControlCount-1 do
   begin
    Ctrl := TComponent(pObjectName.Controls[i]);
    Ctrl_ := CloneComponent(Ctrl);
    TControl(Ctrl_).Parent := apanel;
    TControl(Ctrl_).Left := TControl(Ctrl).Left;
    TControl(Ctrl_).top := TControl(Ctrl).top;
  end;

end;

以下是物理上进行克隆的代码(上面称为):

function TForm1.CloneComponent(AAncestor: TComponent): TComponent;
var
    XMemoryStream: TMemoryStream;
    XTempName: string;
  begin
    Result:=nil;
    if not Assigned(AAncestor) then
      exit;
    XMemoryStream:=TMemoryStream.Create;
    try
      XTempName:= AAncestor.Name;
      AAncestor.Name:='clone_' + XTempName + inttostr(panels);
      inc(panels);
      XMemoryStream.WriteComponent(AAncestor);
      AAncestor.Name:=XTempName;
      XMemoryStream.Position:=0;
      Result:=TComponentClass(AAncestor.ClassType).Create(AAncestor.Owner);
      if AAncestor is TControl then TControl(Result).Parent:=TControl(AAncestor).Parent;
      XMemoryStream.ReadComponent(Result);
    finally
      XMemoryStream.Free;
    end;
end;

所以现在我想使用克隆的对象但是如何在我的代码中调用它们?  例如,如何调用其中一个克隆复选框的checked函数?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

其他人是正确的,最好使用框架,但如果我们只想使用你的代码,我们必须先修复它。您的代码中存在问题,即Inc(panles);位置。您必须在 ClonePanle 过程中的for i:= 0 to pObjectName.ControlCount-1 do循环之后放置此行,而不是在 CloneComponent 函数中。

如果您解决了这个问题,那么您可以使用 FindComponent 功能来访问Marko Paunovic所说的组件。

例如,您在第一个Panel上放置的组件的名称是您定义为克隆其他克隆面板的第一个实例,即 TestCheckBox 。如果你克隆了我们谈过的小组20次;你可以像这样访问第16个Cloned obejct的TCheckBox并将它的标题更改为你想要的任何内容: (我想当程序启动时,panel变量为0。)

TCheckBox(FindComponent('clone_TestCheckBox15')).Caption:='aaaaa';