我已经定义了一个带有计算字段的 Delphi TTable 对象,它用于表单的网格中。我想制作 TTable 对象的副本,包括计算字段,打开该副本,使用副本对数据进行一些更改,关闭副本,然后刷新原始副本,从而刷新网格视图。有没有一种简单的方法来获取 TTable 对象的副本以这种方式使用?
理想的答案将是尽可能一般地解决问题的答案,即一种获得如下内容的方法:
newTable:=getACopyOf(existingTable);
我已经定义了一个带有计算字段的 Delphi TTable 对象,它用于表单的网格中。我想制作 TTable 对象的副本,包括计算字段,打开该副本,使用副本对数据进行一些更改,关闭副本,然后刷新原始副本,从而刷新网格视图。有没有一种简单的方法来获取 TTable 对象的副本以这种方式使用?
理想的答案将是尽可能一般地解决问题的答案,即一种获得如下内容的方法:
newTable:=getACopyOf(existingTable);
您可以使用TBatchMove组件来复制表及其结构。
设置 Mode 属性以指定所需的操作。Source 和 Destination 属性指示添加、删除或复制其记录的数据集。联机帮助包含更多详细信息。
(尽管我认为您应该研究 TClientDataSet 方法 - 它肯定更具可扩展性和更快)。
让我提出几件事:
让我们假设您想以编程方式进行更改。然后,您可以使用 TTable 的 DisableControls 和 EnableControls 方法在此期间禁止屏幕更新。
如果你想拥有两个具有相同数据的屏幕(fe 用于在在线更改期间比较数据),你实际上可以创建两次相同的屏幕,TTable 对象位于屏幕本身上。它将具有完全相同的配置(但不会继承先前在第一个屏幕上所做的更改,而是从数据库中读取数据)。在一个屏幕上所做的更改不会在另一个屏幕上自动刷新。
另一种方法:尝试使用 TDataSetProvider 和 TTable 作为数据集(源)提供 TClientDataSet。ApplyUpdates 会将更改反馈到 TTable。由于计算字段是只读的,因此它们不受影响。(未经测试,但应该可以)
您应该能够选择表单上的表格,使用Ctrl-将其复制C,然后将其粘贴到任何文本编辑器中。您将获得对象属性的文本版本,然后可以根据需要对其进行编辑。完成后,再次选择所有文本,您可以将其复制到剪贴板并将其粘贴回表单。
我相信第二种方法(TClientDataset)可能是在这种情况下使用的最佳方法。另一种方法是使用内存表(例如kbmMemTable)。无论哪种方式,您都将克隆您的原始表,然后在进行更改后循环通过数据集的内存版本并更新您的原始表。