同时在多个控件之间共享TDataSource是否安全?

时间:2019-01-04 00:26:23

标签: delphi

我已将所有<​​em> lookup 表/查询移至应用程序的主DataModule中。现在,我想知道是否也可以将关联的TDataSource移至数据模块。

例如,如果我有两个TLookupCombobox,它们以两种不同的形式(甚至是相同的形式)使用相同的TDataSource,会产生影响吗?就像我在 combobox1 中选择一个项目时,它会移到 combobox2 中的相同项目吗?

我只想只读使用这些TDataSources

2 个答案:

答案 0 :(得分:3)

是的,可以将TDataSource放置在TDataModule中,并用作许多形式上的db感知组件的数据源。但是,通常这不是一个好主意,您可能会后悔。这样做会给您自己造成一个维护问题,因为对其属性进行一些更改非常容易,这会影响db-ware组件的行为并忽略各种形式的连锁继承(对于TDataSet后代而言,情况确实如此,当然)。

如果同时存在表单实例,则跨表单共享数据源可能会影响性能,尤其是如果您执行一些过程来迭代数据集中的记录(除非您用TDataSet.DisableControls和.EnableControls。

因此,imo尽管将数据集放置在许多表单使用的数据模块中是有好处的,但最好将数据源放置在包含连接的数据库感知组件的表单上。

就涉及数据库感知的复合控件(如TDBComboBox,TDBListBox等)而言,这些始终始终显示相关数据集中当前记录的值。没有大量的编码将允许这些组件以不同的形式同时显示不同的字段值:如果它们是由来自相同记录字段的相同数据源提供的,则它们将显示相同的值(当然,控件(如DBComboBox的下拉列表中所示)之间可能会有所不同)。这是由TDataSets的设计操作方式引起的:它们都实现了一个数据集“游标”,该游标使所有数据读取和写入操作都对数据集的单个“当前”记录以及数据集字段的值进行操作。 db-aware组件显示的是光标所在的记录中的值。

答案 1 :(得分:1)

您在这里问两个问题。 - 没问题。 关于数据源的使用,绝对如此。我将所有TTable,TQuery和DatSources都放在一个DataModule中,并从具有多个组件的多个Forms中引用它们。 在combobox1 v combobox2交互上,这将取决于它们背后的代码。通常在OnChange事件中。 伊恩