Aquí yo primero me cuestionaría el porqué guardar un campo calculado en la base de datos. Es decir, si el valor de un campo puede ser calculado a partir de otros campos, entonces ¿para qué guardarlo si siempre se puede recalcular?
Delphi ofrece soporte para campos calculados que puedes añadir a un dataset y en los cuales haces el cálculo correspondiente, mismo que se muestra como cualquier otro campo aunque realmente no exista en la tabla física.
Vamos a ejemplificar suponiendo que tienes campos campo1 y campo2 de tipo entero en tu tabla y que quieres mostrar un campo resultado con la suma de ambos campos, pero que tal campo no existe en tu tabla.
En el editor de campos del dataset añades todos los campos y luego escoges la opción New field:
En las propiedades del nuevo campo escribes el nombre que desees darle y dejas seleccionada la opción Calculated:
Finalmente, en el evento OnCalcFields del dataset pones:
Código Delphi
[-]
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('Resultado').AsInteger :=
DataSet.FieldByName('campo1').AsInteger +
DataSet.FieldByName('campo2').AsInteger;
end;
Con esto, tu dbgrid mostrará el campo Resultado como si fuera otro campo de tu tabla y su valor se calculará en automático conforme coloques valores a los otros dos campos.
-----------------------------------
Ahora bien; si por cualquier razón debes guardar el campo como parte de tu tabla, entonces tienes que hacer los cálculos tú mismo.
Para empezar, no pongas el campo Resultado como ReadOnly porque entonces no te dejará modificarlo de ninguna manera. Usa mejor la columna del dbgrid para hacerlo de sólo lectura.
Asigna un mismo evento OnChange a los otros campos y coloca ahí el código
de la fórmula (suma en este ejemplo):
Código Delphi
[-]
procedure TForm1.CampoChanged(Sender: TField);
begin
Table1.FieldByName('resultado').AsInteger :=
Table1.FieldByName('campo1').AsInteger +
Table1.FieldByName('campo2').AsInteger;
end;
// Saludos