2009-10-23 16 views
5

創建TDataSource作爲數據綁定組件和實際底層TDataSets之間的中介,而不是讓組件直接連接到TDataSets本身的原因是什麼(或者會是什麼)?爲什麼最初創建TDataSource?

這可能看起來像一個愚蠢的問題,但我正在處理一組廣泛的「數據查看器」組件,它們鏈接到一個常見的「數據連接器」組件等;並且在設計這組組件時,我發現自己引用了經典的Delphi「TDataSet - > TDataSource - >數據綁定組件」的設置以獲得指導。然而,在我的組件集中,我始終想要將「TDataSource」和「TDataSet」等價物的功能合併到一個類中。這讓我想知道首先將他們分開的原因是什麼。

回答

4

這全是關於decouplingindirection

並與的TDataSource有兩種其中:

  • 解耦主詳細關係(的TDataSource是相同的模塊正被結合的TDataSets中;細節TDataSet的通過指向引用主TDataSet的其'MasterSource屬性指向主TDataSet的TDataSource)
  • 將UI與業務層解耦(TDataSets位於DataModule中; TDataSource位於包含UI控件的Form/Frame上,UI控件引用它們的DataSource屬性) 。

由於許多組件可以指向相同的數據源,因此只需翻轉一個TDataSource.DataSet屬性即可快速切換其使用的底層TDataSet。

0

我不知道這是否正是開發團隊的想法,但可能有用的一種方法是更改​​數據集。假設您有一大堆數據感知控件,並且它們都綁定到一個數據集,然後您想要切換到另一個數據集。如果他們都通過中介綁定,則只需更改數據源的.Dataset屬性,而不是迭代所有控件並更改其屬性。

(雖然你仍然可能需要更改一堆字段名,這取決於事情如何設置,所以這可能不是最好的例子。)

9

我認爲,這樣的數據感知控件可以是附加到不同的數據集,只需更改相關數據源指向的數據集而不必更改每個控件的數據集。

所以,你可以只通過改變單一的數據源,而不是TDBEdits的負荷,TDBGrids等

+1

在早期版本中,這幾乎是不可能的部件連接到不同的數據庫。你需要有一個版本供您想使用不同的數據庫中各組分的,這意味着一個新的數據庫有困難時期的到來。通過分離從源鏈接,就可以輕鬆切換。數據庫也可以是僅運行時間的程序源。 – mj2008 2009-10-23 09:20:25

4
  • TDataSet的是有關訪問數據庫的更改所使用的數據庫。
  • 的TDataSource是有關用戶界面:禁用/啓用,同步,數據流等

如果結合這兩種,你的數據庫組件獲得依賴於特定的用戶界面架構,您正在使用。在你自己的程序中,這些類型的依賴關係可以正常工作,但在分發給許多開發人員的API中卻不行。

1

您可以將其視爲某種模型 - 視圖 - 控制器模式。

數據位於DataSet(模型)中,該數據集不知道誰在使用它們和什麼。
數據庫感知組件爲用戶提供了不同的接口(視圖),以便與這些數據進行交互,而無需知道誰持有這些數據。
DataSource是提供鏈接的控制器(控制器),並將任何數據更改或命令分配給模型或視圖。

這樣可以輕鬆綁定到不同的數據集而不需要觸及視圖,或者在數據集不必關心視圖的情況下更改或添加新視圖。