2014-01-12 118 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'最初引用的實例做任何事情。問題是我想,你知道指針如何工作嗎? –

相關問題