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