为什么最初创建TDataSource?

时间:2009-10-23 01:09:02

标签: delphi oop dataset datasource

创建TDataSource作为数据绑定组件和实际底层TDataSets之间的中介的原因是什么(或将会是什么),而不是让组件直接连接到TDataSets本身?

这看起来像是一个愚蠢的问题,但我正在研究一套广泛的“数据查看器”组件,它们链接到一个通用的“数据连接器”组件等;在设计这组组件时,我发现自己引用了经典Delphi“TDataSet - > TDataSource - >数据绑定组件”设置的结构作为指导。但是,在 my 组件集中,我一直希望将“TDataSource”和“TDataSet”等价物的功能基本合并到一个类中。它让我想知道首先将它们分开的理由是什么。

5 个答案:

答案 0 :(得分:12)

全部是关于decouplingindirection

使用TDataSource有两种类型:

  • 解耦主细节关系(TDataSource与绑定的TDataSets在同一模块中;细节TDataSet通过将其'MasterSource属性指向指向主TDataSet的TDataSource来引用主TDataSet)
  • 将UI与业务层分离(TDataSets位于DataModule中; TDataSource位于包含UI控件的Form / Frame上,UI控件引用其DataSource属性)。

由于许多组件可以指向同一个DataSource,因此只需翻转一个TDataSource.DataSet属性即可快速切换它们使用的底层TDataSet。

答案 1 :(得分:11)

我认为数据感知控件可以附加到不同的数据集,只需更改其关联数据源指向的数据集,而不必更改每个控件的数据集。

因此,您可以通过更改单个数据源而不是TDBEdits,TDBGrids等的负载来更改您正在使用的数据库。

答案 2 :(得分:5)

  • TDataSet是关于访问数据库的。
  • TDataSource是关于用户界面:禁用/启用,同步,数据流等。

如果将这两者结合使用,则数据库组件将依赖于您正在使用的特定用户界面基础结构。这些依赖项在您自己的程序中可以正常,但在分发给许多开发人员的API中不行。

答案 3 :(得分:3)

您可以将其视为某种模型 - 视图 - 控制器模式。

数据位于DataSet(模型)中,该数据集不知道谁在使用它们以及用于什么。
DB感知组件为用户提供不同的接口(视图),以便在不知道谁持有这些数据的情况下与这些数据进行交互 DataSource是介于(控制器)之间的过程,它提供链接并将任何数据更改或命令分派给模型或视图。

这样可以轻松绑定到不同的数据集,而无需触及视图,也无需更改或添加新视图,而数据集无需关心它们。

答案 4 :(得分:1)

我不知道这是否正是开发团队的想法,但可能有用的一种方法是更改​​数据集。假设您拥有一大堆数据感知控件,并且它们都绑定到一个数据集,然后您想要切换到另一个数据集。如果它们都通过中介绑定,那么您所要做的就是更改数据源的.Dataset属性,而不是迭代所有控件并更改其属性。

(尽管您可能仍需要更改一堆字段名称,具体取决于设置方式,因此这可能不是最好的示例。)