如何强制客户端数据集重新计算计算和内部计算字段?

iMa*_*ari 10 delphi tclientdataset delphi-xe2

我有ClientDatSet一些fkInternalCalc领域.CDS与任何提供商均无关联; 而是它在飞行中填充.如何强制CDS重新计算所有"可计算"字段?我无法打电话,Refresh()因为没有提供商来刷新数据.我到目前为止唯一的方法是浏览所有记录,这不是最好的方法.

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

Uwe*_*abe 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;
Run Code Online (Sandbox Code Playgroud)

使用可以很容易地扩展到正常的计算字段CalculateFields.虽然这不是必需的,因为只要任何其他数据字段发生变化,就会重新计算计算字段.