Ver Mensaje Individual
  #2  
Antiguo 25-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Reputación: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Una causa muy común de esa excepción es cuando el programa entra en recursión infinita.

Una proceso recursivo es aquel que resulta en la ejecución de una rutina (procedimiento, función, método, evento) antes de haber terminado una ejecución anterior de esa misma rutina. En muchas situaciones es útil emplear procesos recursivos, pero cuando esto sucede de forma no controlada el resultado puede ser el agotamiento de la memoria, por no darse ninguna condición que evite alguna de las llamadas que el código realiza, repitiéndose el ciclo de llamadas indefinidamente.

Cuando se da esta recursión "infinita", el espacio de memoria donde el programa guarda variables y otros datos por cada llamada a alguna rutina llega al punto de "desbordamiento" (stack overflow). Así sucede, por ejemplo, en este caso:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Click;
end;

Si tras ocurrir la excepción, presionas en el editor de Delphi la combinación de teclas Ctrl+Alt+S, aparecerá una de las muchas ventanas informativas del depurador, conocida como pila de llamadas (call stack). En ella podrás observar cuál fue el camino que siguió el programa hasta el punto donde ocurrió la excepción y con ello descubrir si estás haciendo mal uso de algún evento u otro elemento del programa, o en sí las rutinas que se están repitiendo una y otra vez y qué origina esa repetición.

Aunque también podría ser otra la causa, como bien lo dice la propia ayuda de Delphi:
Cita:
EStackOverflow is raised when the system is unable to allocate necessary stack space. This can happen because of [1] extremely large local variables, [2] deeply recursive routines, or [3] invalid machine-language code.
Lo primero que suelo hacer ante esa excepción es presionar Ctrl+Alt+S para ver si es debida a la segunda de esas tres causas.

Otra tarea de depuración sería colocar un punto de ruptura (tecla F5) en tu instrucción Open, y desde ese punto ejecutar el programa sentencia por sentencia (tecla F8). Esto para saber cuál de ellas es la rama que deriva en el error que aparece en pantalla.

Espero haber orientado. No dejes de comentarnos las novedades que hayas encontrado.

Al González.
Responder Con Cita