2014-01-12 122 views
2

在我的框架中,我有一个DataSource1实例,它在设计时被放在窗体上。
在运行时,我需要将它“转换”为另一个DataSource2(在数据模块上)的引用。将对象实例转换为另一个实例的引用?

,就是设定:

DataSource1 := DataSource2; 

足以让DataSource1 DataSource2的参考?看起来DataSource1在这一点上并未被销毁 - 当DataSource2的所有者被销毁时它被销毁,并且实际上有两个TDataSource实例。

或者我需要首先显式释放DataSource1?

DataSource1.Free; 
DataSource1 := DataSource2; 

什么是正确的方法? (除了首先声明DataSource1作为参考)

+1

首先可能有用的是知道这是什么目的。你在做这个吗?因为你有一些“背景”数据集正在工作,并且在其工作完成后,通过这种方式“重新连接”数据源来填充数据?如果是这样,那么我宁愿重新分配数据源的数据集。 – TLama

+0

@TLama,我明白了什么意思。这个问题与DB设计没有多大关系。其目的有点复杂:我们有一个基类窗体,它将集中的TDataSource暴露给它的底层db-aware控件。 (它默认是持久的),但有时它应该被引用到另一个DataSource。我知道我可以在那个持久的DataSource中设置/更改DataSet(并且这是正确的方式),但我只是想了解该实例引用。 – ZigiZ

回答

4

当您将变量声明为从TObject继承的类型时,实际上是在声明一个指针。

当您调用构造函数时,您正在创建一个实例。构造函数返回一个指向该实例的指针。你通常是指针分配给这样的变量:

Obj1 := TMyClass.Create; 

,您可以拨打第二个变量点,或参考的实例与简单的赋值:

Obj2 := Obj1; 

目的是通过调用销毁免费:

Obj1.Free; 

此时Obj2指的是一个不再存在的对象。我们说Obj2是一个陈旧的参考。

在你的情况下,你需要释放第一个对象:

+0

但是当持久化DataSource1实例被引用为'DataSource1:= DataSource2'时会发生什么?这我不完全明白。 – ZigiZ

+2

@Zig - 你所说的“持久化DataSource1”只是某个数据模块的指针变量。在'DataSource1:= DataSource2'之后,不再有对左侧变量/指针引用的对象的引用。因此,在您放弃参考之前,您必须先释放它,或将其留给框架。 –

+1

'DataSource1'不是一个实例。它是一个指向实例的指针。当你编写'DataSource1:= ...'时,你不会对'DataSource1'最初引用的实例做任何事情。问题是我想,你知道指针如何工作吗? –

相关问题