加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

德尔福.克隆对象

发布时间:2020-12-15 09:09:54 所属栏目:大数据 来源:网络整理
导读:参见英文答案 How to copy the properties of one class instance to another instance of the same class?????????????????????????????????????3个 是否可以使用其他引用克隆对象? 这是我正在尝试做的一个例子:我有一个名为Label1的TLabel.现在我想创建
参见英文答案 > How to copy the properties of one class instance to another instance of the same class?????????????????????????????????????3个
是否可以使用其他引用克隆对象?

这是我正在尝试做的一个例子:我有一个名为Label1的TLabel.现在我想创建一个Label2,等于Label1,能够在不相互反映的情况下进行更改.

Ps:我使用TLabel作为示例,我想复制另一个实例中的任何对象.

在下面的代码中,我尝试更改名称,但引用仍然相同,当更改其中一个时,另一个也会更改.

var
    cloneOfLabel1: TLabel;
begin
    Label1.Caption := 'label 1';
    cloneOfLabel1 := Label1;
    cloneOfLabel1.Name := 'label2';
    cloneOfLabel1.Caption := 'label 2';
    cloneOfLabel1.Left := 0;
    cloneOfLabel1.Top := Label1.Top+100;

解决方法

可以为TComponent后代编写克隆函数:

function CloneComponent(aSource: TComponent): TComponent;
var mem: TMemoryStream;
begin
  mem := TMemoryStream.Create;
  try
    mem.WriteComponent(aSource);
    mem.Seek(0,soFromBeginning);
    Result := mem.ReadComponent(nil);
  finally
    mem.free;
  end;
end;

请注意,只有以这种方式复制已发布的属性,以及通过DefineProperties保存的某些组件数据.克隆了整数,浮点数,字符串,枚举和集合,但是引用可能存在问题:流系统设计用于保存到文件并从那里读取,因此没有内存地址被转移,而是进行相当复杂的操作来转换它们到字符串路径,包括组件所有者和名称.通常,您需要流式传输所有结构,然后才会保存一些内部关系.

如果您是应该克隆的类的设计者,那么重写Assign方法似乎是更强大的解决方案.

这个TComponent流媒体解决方案的好处是:你能够克服一些任意组件而不知道它是什么类.例如,列出各种组件或一些更复杂的结构,然后获取每个组件的完整副本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读