我将面板及其内容(图像和复选框)克隆20次。
正在克隆的小组样本:
这是用于克隆整个面板的过程:
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函数?
感谢您的帮助:)
答案 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';