我想澄清一个疑问.在我当前的项目中,我发现有两个TClientDataSet组件.并将一个客户端数据集的属性和事件处理程序分配给另一个客户端数据集,如下所示:
cds2.AfterApplyUpdates := cds1.AfterApplyUpdates; cds2.AfterCancel := cds1.AfterCancel; cds2.AfterClose := cds1.AfterClose;
和
cds2.CommandText := cds1.CommandText; cds2.AutoCalcFields := cds1.AutoCalcFields; cds2.DisableStringTrim := cds1.DisableStringTrim;
是否需要上述事件处理程序和属性的分配?
如果我们只是将一个客户端数据集分配给另一个,如下所示,这还不够吗?
cds2 := cds1;
解决方法
Delphi类是引用类型.这意味着当您定义一个类型为类的变量时,您实际拥有的是对象的引用或指针.这使得赋值运算符的含义:=是引用赋值而不是值赋值.
假设您有以下声明:
var o1,o2: TObject; .... o1 := TObject.Create; o2 := o1;
此时,您创建了一个对象,o1和o2都引用或指向同一个对象.由于只有一个对象或实例,因此通过o2引用也可以看到通过o1引用所做的任何更改.
因此,在您的场景中,您有cds1和cds2,可能是指不同的实例.这意味着
cds2.CommandText := cds1.CommandText;
将cds1.CommandText的值复制到cds2.CommandText.
这完全不同于
cds2 := cds1;
它会复制引用,并导致您失去对cds2引用的单独对象的跟踪.
在此处查找有关引用类型和值类型的更多讨论:Why should we use classes rather than records,or vice versa?.
总之,您提供的两个选项会做很多不同的事情.您当前使用的代码复制属性值,可能会起作用.在这种情况下,您建议的复制引用更改肯定不会达到您想要的效果.