如何手动执行"OnCalcFields"事件?

Jør*_*eit 4 delphi tclientdataset

假设我暂时想要在TClientDataSet上执行耗时的操作期间禁用OnCalcFields事件(例如,通过设置cdsCalcFields := nil).当我重新附加OnCalcFields方法时,如何告诉TClientDataSet重新计算计算字段?

可能需要手动重新计算的另一种情况是某些计算字段取决于其他数据集的情况(例如,计算字段用于临时保存来自其他数据集的某些聚合值).这在大多数情况下都可以正常工作,因为OnCalcFields事件的执行频率足以从其他数据集中获取正确的值.但在某些情况下,需要重新计算才能从其他数据集中获取正确的值.

AutoCalcFields属性设置为False也可能会使您进入需要手动重新计算的某些情况.

我已经看到了关于如何减少OnCalcFields事件执行的几个解释,但我找不到一个简单的方法来执行重新计算......

有什么建议?

Ser*_*yuz 6

从数据库中检索记录时计算计算字段,因此Refresh对数据集调用(或关闭 - >打开)以强制重新计算.

(关于对问题的评论),强制重新计算只能RefreshRecord在数据集上调用的一条记录.如果特定数据集后代未实现该方法,则Edit后跟Cancel调用将实现相同.

  • @Jorn - "Cancel"方法与数据库同步,因此它涉及重新读取.唯一可能的解决方案是不涉及我能想到的数据检索,涉及对受保护方法的调用:`THackCDS(cd​​s).GetCalcFields(cds.ActiveBuffer);`其中`THackCDS = class(TClientDataSet)`.因为我没有做足够的测试,所以我没有把它放到答案中. (2认同)