Dado que no está indentado, se me hace realmente dificil leer el código, y no lo he hecho (seguí la recomendación de Andres al respecto). Sin embargo me parece que, dado que se trata de un evento OnCalcFields, seguramente estas haciendo una asignación a un campo no calculado dentro del evento, con lo que éste se dispara nuevamente... provocando una recursividad indirecta, e infinita (ya que no hay condición que pare esta recursividad).
Esto lo podes comprobar fácilmente poniendo un breakpoint al inicio del método, siguiendolo paso a paso, y viendo como, al hacer alguna asignación (o probablemente la llamada a otra rutina que hace una asignación) el evento se dispara nuevamente (pasando por el breakpoint).
Yo elimino normalmente este efecto teniendo un flag en el formulario o módulo de datos, digamos FCalculando... que inicializas a false, y luego hago algo como esto en el evento:
Código:
Procedure Form1Table1CalcFields(parametros);
Begin
if not FCalculando Then
Begin
FCalculando := True;
// se enciende el flag, para evitar la recursividad indirecta.
try
CodigoNormalDelEvento;
finally
FCalculando := False; // esto siempre se ejecuta, aunque el evento se aborte
// por una condición de error.
End;
End;
// de esta forma, no se ejecuta ni una sola línea si ya se ha entrado al evento
// una vez
End;
Hasta luego.
