Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2008
Mialom Mialom is offline
Registrado
 
Registrado: feb 2008
Ubicación: España
Posts: 5
Poder: 0
Mialom Va por buen camino
Stack OverFlow al pasar parametro en el constructor de un Form

Buenos dias, y muchas gracias de antemano

estoy teniendo un problema cuando le paso un parámetro adicional a un form en el constructor, porque necesito dicho parametro para la funcionalidad propia que le voy a dar al form nuevo. Pero al crearlo, se embucla y al final me da un mensaje de desbordamiento de pila (Stack Overflow).

Muchas gracias.

Última edición por Mialom fecha: 06-02-2008 a las 16:00:09.
Responder Con Cita
  #2  
Antiguo 06-02-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Bienvenido al Club, te recomiendo le des un vistazo a la Guía de Estilo de los foros...

Sobre tu problema... cual es el parámetro adicional que pasas?

Podemos ver el fragmento de código que te produce el Stack Overflow?



Saludos...
Responder Con Cita
  #3  
Antiguo 06-02-2008
Mialom Mialom is offline
Registrado
 
Registrado: feb 2008
Ubicación: España
Posts: 5
Poder: 0
Mialom Va por buen camino
Buenas tardes de nuevo,

El código es muy sencillo:
//-------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner, int x) // <-- Aqui pasa al constructor de la clase base
:TForm(Owner) // <-- Aqui entra y vuelve a mi constructor
{
...
}
//-------------------------------------------------------

Pasa de un constructor a otro hasta que se desborda la pila.

Su definición en el cabecero es:

__fastcall TForm1(TComponent* Owner, int x);

Y la llamada desde el otro fomulario es:

TForm *Form1 = new TForm(this, entero);
Form1->ShowModal();
delete Form1;

Muchas gracias, espero que esto explique mejor mi problema.
Un saludo.

Responder Con Cita
  #4  
Antiguo 06-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 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
  #5  
Antiguo 06-02-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

No se bien como se llama un método heredado en C++ Builder, pero creo que ahí está tu problema...

En Delphi se haría así:

Código Delphi [-]
constructor Create(AOwner: TComponent; X: Integer);
begin
  inherited Create(AOwner); // Si te fijas, usamos la palabra reservada inherited
  // Demás código de construcción...
end;


Saludos...
Responder Con Cita
  #6  
Antiguo 07-02-2008
Mialom Mialom is offline
Registrado
 
Registrado: feb 2008
Ubicación: España
Posts: 5
Poder: 0
Mialom Va por buen camino
Solución a medias

Buenos dias,

ya he encontrado una solución para pasar los parámetros al constructor del formulario, la cuestion es que el constructor se embucla hasta que se desborda la pila (Stack Overflow) debido a que el parámetro que le paso es de tipo Entero, he probado a pasarle parámetros de otro tipo de datos como AnsiString, String, TDateTime y Float y funciona perfectamente. De momento le pasaré el parametro como cadena de texto y ya dentro del formulario nuevo le haré un cast a entero, pero no he conseguido averiguar el porque de que no admita parámetros de valor entero.

Muchas gracias por vuestra ayuda, y si averiguo el porque ya os lo contaré.
Un saludo
Responder Con Cita
  #7  
Antiguo 15-02-2008
Antonioveneroso Antonioveneroso is offline
Miembro
 
Registrado: feb 2008
Posts: 30
Poder: 0
Antonioveneroso Va por buen camino
Creo que en una ocasión hice algo así, pero en lugar de pasarle un int le pasaba un short... necesariamente debe ser int?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Stack overflow al reabrir una tabla jzginez Conexión con bases de datos 1 24-04-2007 16:52:53
Stack Overflow agonzalez Varios 5 08-12-2006 22:26:46
Stack Overflow Mariana Varios 14 30-10-2003 11:37:47
Pasar un parametro en la llamada a un form apicito OOP 17 13-08-2003 12:30:45


La franja horaria es GMT +2. Ahora son las 15:33:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi