作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以用另一个引用克隆一个对象?
这是我想做的一个例子:我有一个 TLabel
命名Label1
。现在我想创建一个 Label2
,等于Label1
,能够在不互相反射(reflect)的情况下进行更改。
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 后代编写 Clone 函数:
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
保存一些数据。整数、 float 、字符串、枚举和集合都可以很好地克隆,但引用可能会出现问题:流系统设计用于保存到文件并从那里读取,因此不会传输内存地址,而是执行相当复杂的操作来转换它们到字符串路径中,包括组件所有者和名称。通常您需要流式传输所有结构,然后才会保存一些内部关系。
如果您是应该克隆的类的设计者,那么重写分配方法似乎是更强大的解决方案。
这个 TComponent 流解决方案的好处是:您可以克隆某个任意组件,而无需提前知道它是什么类。例如,列出各种组件或一些更复杂的结构,然后获取每个组件的完整副本。
关于德尔福。克隆一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46018158/
我是一名优秀的程序员,十分优秀!