我有ClientDatSet
几个fkInternalCalc
字段。CDS 未链接到任何提供商;相反,它是即时填充的。如何强制 CDS 重新计算所有“可计算”字段?我不能打电话Refresh()
,因为没有提供者可以从中刷新数据。到目前为止,我使用的唯一方法是浏览所有记录,这不是最好的方法。
问问题
4175 次
2 回答
8
我通过一个帮助器实现了这一点(这里去掉了必要的部分),它允许在没有任何黑客攻击的情况下调用受保护的方法。确保DataSet.State = dsInternalCalc
在 OnCalcFields 内部检查 fkInternalCalc 字段。
type
TClientDataSetHelper = class helper for TClientDataSet
public
function AssureEditing: Boolean;
procedure InternalCalc;
end;
function TClientDataSetHelper.AssureEditing: Boolean;
begin
result := not (State in [dsEdit, dsInsert]);
if result then
Edit;
end;
procedure TClientDataSetHelper.InternalCalc;
var
needsPost: Boolean;
saveState: TDataSetState;
begin
needsPost := AssureEditing;
saveState := setTempState(dsInternalCalc);
try
RefreshInternalCalcFields(ActiveBuffer);
finally
RestoreState(saveState);
end;
if needsPost then
Post;
end;
这可以很容易地扩展为使用CalculateFields
. 尽管这不是必需的,因为只要任何其他数据字段发生更改,就会重新计算计算字段。
于 2013-07-28T13:18:37.817 回答
-1
这有点骇人听闻,但它确实有效!
DBGrid.Height := 30;
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
于 2017-09-17T11:03:33.580 回答