Ver Mensaje Individual
  #4  
Antiguo 06-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
Creo que una forma sencilla de romper un bucle infinito es poner un punto de ruptura dentro de alguno de los métodos que se ejecutan como parte del bucle, examinar y recorrer la pila de llamadas durante 2 o 3 iteraciones.

Las causas típicas por las que ocurre este tipo de problema son:
  • Error en la condición que rompe con la recursividad, en una función o serie de funciones realmente recursivas.
  • Que se está llamando a un método por error, por ejemplo porque se pretende llamar a un método con el mismo nombre de otro objeto o porque se pretende llamar a un método con el mismo nombre de una clase ancestro.
  • Recursividad indirecta provocada por desconocimiento de la VCL, por ejemplo porque la modificación de alguna propiedad de un objeto dispara un evento cuyo manejador termina llamando nuevamente al método que modifica el valor. Caso típico de modificar un valor de un campo dentro de su propio evento OnChange:
    Código Delphi [-]
    procedure TForm1.Tabla1Campo1Change(Parametros);
    begin
      Tabla1Campo1.AsInteger := Tabla1Campo1.AsInteger + 1;
    end;

    Para evitar esto último, en ocasiones donde no veo otra solución, suelo valerme de una bandera que evite la llamada recursiva:

    Código Delphi [-]
    procedure TForm1.Tabla1Campo1Change(Parametros);
    begin
      if not YaModificandoCampo1 then
      begin
        YaModificandoCampo1 := True;
        try
          Tabla1Campo1.AsInteger := Tabla1Campo1.AsInteger + 1;
        finally
          YaModificandoCampo1 := False;
        end;
      end;
    end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita