Search code examples
delphidelphi-7cloning

How to call objects that were cloned


I clone a panel and its contents(A image and a checkbox) 20 times.

Sample of the panel being cloned:

enter image description here

This is the procedure used to clone a whole panel:

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;

The following is the the code that physically does the cloning(called above):

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;

So now I want to use the cloned objects but how do I call them in my code? For example how can I call the checked function of one of the cloned check boxes?

Thanks for your help :)


Solution

  • Others are right and it is better to use frame but if we want just use your code we must fix it first. there is a problem in your code and that is the Inc(panles); position. you must put this line after loop of for i:= 0 to pObjectName.ControlCount-1 do in the ClonePanle procedure, not in the CloneComponent function.

    If you fix that, then you can use FindComponent function to access the components that you want as Marko Paunovic said.

    For example the name of the component that you put on the first Panel that you defined as the first instance which other cloned panels are cloned from that is TestCheckBox. If you cloned 20 times the Panel that we talked about; you can access the TCheckBox of the 16th Cloned obejct like this and changing it's caption to whatever you want: (I suppose that the panels variable was 0, when the program started.)

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