10

我有ClientDatSet几个fkInternalCalc字段。CDS 未链接到任何提供商;相反,它是即时填充的。如何强制 CDS 重新计算所有“可计算”字段?我不能打电话Refresh(),因为没有提供者可以从中刷新数据。到目前为止,我使用的唯一方法是浏览所有记录,这不是最好的方法。

PS:我已经阅读了这个问题这篇文章,但我希望有一种更优雅的方式。

4

2 回答 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 回答