Ответ 1
Я достигаю этого с помощью помощника (разделяется здесь на нужный), что позволяет вызывать защищенные методы без каких-либо взломов. Обязательно проверяйте 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
. Хотя это не обязательно, поскольку расчетные поля пересчитываются всякий раз, когда изменяется любое другое поле данных.