如何手动执行“ OnCalcFields”事件?

问题描述

| 假设我暂时想在TClientDataSet上的耗时操作期间禁用
OnCalcFields
事件(例如,通过设置
cdsCalcFields := nil
)。重新附加“ 0”方法时,如何告诉TClientDataSet对计算的字段执行重新计算? 可能需要手动重新计算的另一种情况是某些计算字段依赖于其他数据集的情况(例如,使用计算字段临时保存来自其他数据集的某些聚合值)。在大多数情况下,这样做会很好,因为经常执行“ 0”事件以从其他数据集中获取正确的值。但是在某些情况下,必须重新计算才能从其他数据集中获得正确的值。 将
AutoCalcFields
属性设置为
False
也可能会使您陷入需要手动重新计算的情况。 我已经看到了有关如何减少
OnCalcFields
事件的执行的几种解释,但是我找不到简单的方法来执行重新计算... 有什么建议么?     

解决方法

从数据库中检索记录时将计算计算出的字段,因此在数据集上调用
Refresh
(或“关闭”->“打开”)以强制重新计算。 (关于问题的评论),要仅对一条记录进行重新计算,可以在数据集中调用
RefreshRecord
。如果特定的数据集后代未实现该方法,则在调用“ 9”后再调用“ 10”将达到相同的目的。     ,调用Refresh或Close->可能导致整个表从数据库中重新加载。如果这不是您想要的,则可以仅通过自己的CDS调用OnCalc方法。尽管您可能必须手动滑动光标。
with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;
假设DisplayAcctListCDS是包含计算字段的TClientDataSet,而DisplayAcctListCDSCalcFields是OnCalcFields的生成事件方法。     ,这有点骇人听闻,但对我来说,此问题的答案是100%!
DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...