我想澄清一个疑问。在我当前的项目中,我发现有两个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;发布于 2014-07-22 12:24:40
Delphi类是引用类型。这意味着,当定义类型为类的变量时,实际拥有的是对对象的引用或指针。这使得赋值运算符:=的意义成为引用赋值,而不是值赋值。
假设您有以下声明:
var
o1, o2: TObject;
....
o1 := TObject.Create;
o2 := o1;此时,您已经创建了一个对象,o1和o2都引用或指向同一个对象。通过o1引用所做的任何更改也可以通过o2引用看到,因为只有一个对象或实例。
因此,在您的场景中,您有cds1和cds2,它们可能引用不同的实例。这意味着
cds2.CommandText := cds1.CommandText;将cds1.CommandText的值复制到cds2.CommandText。
这完全不同于
cds2 := cds1;它复制引用,并导致您失去cds2引用的单独对象的跟踪。
在这里可以找到更多关于引用类型和值类型的讨论:Why should we use classes rather than records, or vice versa?。
总之,您提出的两个选项所做的事情非常不同。您当前使用的代码(复制属性值)可能有效。在这种情况下,您建议的复制引用的更改肯定不会做您想做的事情。
发布于 2014-07-22 13:02:08
首先:所有组件事件实际上只是引用事件方法的属性,然后这些方法被用作事件处理程序。所以当你把一个事件作为
cds2.AfterApplyUpdates := cds1.AfterApplyUpdates;您只分配对同一方法的引用。对于事件,这是非常常用的,以避免多次编写相同的代码。
第二,当您将一个对象变量分配给另一个对象变量时,大卫已经很难过了。
cds2 := cds1;您只将对对象实例的相同引用分配给另一个变量。您没有复制对象的任何实际数据。
第三,即使你的要求会奏效,我也怀疑你是否愿意使用它。为什么?因为这样做,您将得到两个TClientDataSets,将访问相同的数据库。拥有这些只是很有意义的。
https://stackoverflow.com/questions/24887218
复制相似问题