Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema Stack overflow (https://www.clubdelphi.com/foros/showthread.php?t=90556)

Belen12 10-07-2016 02:47:13

Problema Stack overflow
 
hola Buenas noches, Estoy trabajando con un listado de ventas el cual esta desarrollado en delphi 2010 y mysql-5. El cual cuenta con un formulario principal y un formulario secundario que es el "listado de ventas" en este se encuentra 2 dbgrid uno para el "detalle de ventas", el otro para las "ventas"
los cuales cada uno se encuentran asociado a un TzQuery de los componentes Zeos. La idea es cuando yo selecione una venta en el dbgrid "Ventas" me muestre sus respectivos detalles de venta. Para ello en los TzQuery en la propiedad MasterSourcer y MasterFields de cada TzQuery los tengo relacionado a sus data source y a su clave foranea. es decir

Query de ventas
MasterSourcer: dsDetalleVenta// este seria el datasource del detalle
MasterFields : idventa

Query de Detalle de ventas
MasterSourcer: dsVenta // este seria el datasource del la venta
MasterFields : idventa

Bien al formulario lo llamo de la siguiente forma:
Código Delphi [-]
procedure TfPrincipal.Listado5Click(Sender: TObject);
begin
  fmodulo.qVentas.Active:=true;
  fmodulo.qdetalle.Active:=true;
  tfListadosVentas.Create(self).ShowModal;
end;
y es aqui que me sale el siguiente error "project drugstore.exe raised exception class EStackOverflow with message 'Stack overflow' usando el depurador me marca error en la siguiente linea

Código Delphi [-]
tfListadosVentas.Create(self).ShowModal;

dejo las consulta sql de cada query:
Query venta:
Código SQL [-]
 
SELECT 
  `venta`.`idventa`,
  `venta`.`totalventa`,
  `venta`.`estadoventa`,
  `venta`.`idcliente`,
  `venta`.`fechavent`,
  `venta`.`horavent`
 
FROM
  `venta`
INNER JOIN clientes on (clientes.idcliente=venta.idcliente)

Query Detalle
Código SQL [-]
 
SELECT 
  `detalle_venta`.`idventa`,
  `detalle_venta`.`idproducto`,
  `detalle_venta`.`cantidad_venta`,
  `detalle_venta`.`precio_venta`,
  `detalle_venta`.`estado_detalleventa`
FROM
  `detalle_venta` 
INNER JOIN producto on (producto.idproducto=detalle_venta.idproducto)

espero que puedan ayudarme desde ya muchas gracias

AgustinOrtu 10-07-2016 04:07:41

Si pudiste activar los dos query sin problema, entonces el problema esta en el form

* Puede ser en el constructor
* Puede ser en algun evento OnShow/OnActivate

Me inclino mas por la primera. Pon un punto de ruptura en el constructor

ecfisa 11-07-2016 04:15:55

Hola Belén.

Por el mensaje de error que mencionas, yo revisaría lo siguiente:
  • Eventos que pudieran dispararse entre sí provocando cíclos infinitos.
  • Métodos, funciones o procedimientos recursivos (si los estas usando).
  • El envío de argumentos con datos muy grandes.
  • Métodos muy amplios que se puedan estar llamando respectivamente.
  • El uso desmesurado de variables globales (muchas o muy extensas).
Como primer intento de solución incrementaría el stack desde el archivo .dpr del proyecto:
Código Delphi [-]
{$M 32768, 214748364}  //(16384 * 2 , 2147483647 div 10)
Pero probablemente resulte sólo en parchear el asunto, lo ideal es descubrir la causa que está provocando el desbordamiento de la pila.

Saludos :)

Casimiro Notevi 11-07-2016 09:51:30

Aparentemente es lo dicho antes por los compañeros, un bucle infinito, por ejemplo:
Código Delphi [-]
do while not(eof)
begin
  total := total + q.fieldbyname('suma').asfloat;
  q.next;  //  <- haber olvidado avanzar, por lo que nunca saldrá del bucle
end;

gatosoft 11-07-2016 16:51:46

Cita:

Empezado por AgustinOrtu (Mensaje 506840)
Si pudiste activar los dos query sin problema, entonces el problema esta en el form

* Puede ser en el constructor
* Puede ser en algun evento OnShow/OnActivate

Me inclino mas por la primera. Pon un punto de ruptura en el constructor

De acuerdo con los compañeros. el problema es un bucle infinito y me adhiero al comentario de AgustinOrtu. Muestranos el codigo del constructor y si tienes programado algo en el OnShow/OnActive.


Revisa tambien que tu formulario tfListadosVentas no esté creado automátcamente desde el inicio (por si acaso)

Saludo,

Belen12 13-07-2016 09:37:07

Gracias Por responder
 
Cita:

Empezado por ecfisa (Mensaje 506859)
Hola Belén.

Por el mensaje de error que mencionas, yo revisaría lo siguiente:
  • Eventos que pudieran dispararse entre sí provocando cíclos infinitos.
  • Métodos, funciones o procedimientos recursivos (si los estas usando).
  • El envío de argumentos con datos muy grandes.
  • Métodos muy amplios que se puedan estar llamando respectivamente.
  • El uso desmesurado de variables globales (muchas o muy extensas).
Como primer intento de solución incrementaría el stack desde el archivo .dpr del proyecto:
Código Delphi [-]
{$M 32768, 214748364}  //(16384 * 2 , 2147483647 div 10)
Pero probablemente resulte sólo en parchear el asunto, lo ideal es descubrir la causa que está provocando el desbordamiento de la pila.

Saludos :)

Hola buenas noches. perdon si tarde en responder es por tema del trabajo no pude estar conectada,Bueno intentare explicar lo que tengo en la aplicacion:
*Solo poseo 3 formularios el de venta, el de productos, y finalmente el listado de ventas. Los cuales solo utilizo una variable que es el total para realizar las sumas de los sub totales luego lo demas lo manego con un TstringGrid

* En el Formulario tfListadodeVentas solo tengo los 2 dbGrid y nada mas. Ahora intentado sacar una linea en la llamada por ejemplo
Código Delphi [-]
fmodulo.qdetalle.Active:=true;

no abre directamente el formulario se queda cargando

luego lo que tu me recomiendas perdon no tengo mucho campo en delphi, con esta linea la verdad que no entiendo que hacer

Código Delphi [-]
{$M 32768, 214748364}  //(16384 * 2 , 2147483647 div 10)

Belen12 13-07-2016 09:45:00

Gracias
 
Cita:

Empezado por gatosoft (Mensaje 506876)
De acuerdo con los compañeros. el problema es un bucle infinito y me adhiero al comentario de AgustinOrtu. Muestranos el codigo del constructor y si tienes programado algo en el OnShow/OnActive.


Revisa tambien que tu formulario tfListadosVentas no esté creado automátcamente desde el inicio (por si acaso)

Saludo,


Hola. No tengo nada en esos eventos solo lo unico que toque fue asignarle a cada dbgrid su query. y Realizar la llamada desde el menu principal que el codigo era el siguiente

Código Delphi [-]
procedure TfPrincipal.Listado5Click(Sender: TObject);
begin
  fmodulo.qVentas.Active:=true;
  fmodulo.qdetalle.Active:=true;
  tfListadosVentas.Create(self).ShowModal;
end;

ecfisa 13-07-2016 12:34:03

Hola Belen12.

Lo que te sugerí,
Código Delphi [-]
{$M 32768, 214748364}
incrementa el tamaño del stack. Y apuntaba al caso que hubieras echo un gran consumo de memoria en las declaraciones, pero por lo que comentas no es el caso.

Ahora me quedó una duda: ¿ El programa se queda colgado en,
Código Delphi [-]
fmodulo.qdetalle.Active:=true;
como mencionas en el mensaje #6 o en,
Código Delphi [-]
procedure TfPrincipal.Listado5Click(Sender: TObject);
begin
  fmodulo.qVentas.Active:=true;
  fmodulo.qdetalle.Active:=true;
  tfListadosVentas.Create(self).ShowModal;
end;
como aparece en el mensaje #7 ?

Por otro lado, ¿ Sabes como usar los puntos de interrupción(breakpoint) como te sugirió Agustin en el mensaje #2 ?

Saludos :)

Belen12 13-07-2016 20:18:02

Gracias
 
Hola buenas tardes. si lo de tu sugerencia no lo se hacer perdon lo de incrementar el tamaño del stark
Si exacto el programa se queda congelado en la linea

Código Delphi [-]
fmodulo.qdetalle.Active:=true;

con respeto a la interrupción(breakpoint) la se manejar mas o menos ahora mira lo que me sucede cuando ejecuto y quiero entrar al formulario me sale lo siguiente dejo una imagen para que se pueda apreciar mejor
http://www.subirimagenes.com/otros-delphii-9622519.html

ecfisa 13-07-2016 20:35:55

Hola Belen12.

A ver, empecemos por mirar si fmodulo está creado al momento del llamado agregando una línea a tu código:
Código Delphi [-]
procedure TfPrincipal.Listado5Click(Sender: TObject);
begin
  if not Assigned(fmodulo) then raise Exception.Create('¡ fmodulo no ha sido creado aún !'); // <- esta línea
  fmodulo.qVentas.Active:=true;
  fmodulo.qdetalle.Active:=true;
  tfListadosVentas.Create(self).ShowModal;
end;

Saludos :)

Belen12 14-07-2016 07:03:46

Gracias
 
Cita:

Empezado por ecfisa (Mensaje 506953)
Hola Belen12.

A ver, empecemos por mirar si fmodulo está creado al momento del llamado agregando una línea a tu código:
Código Delphi [-]
procedure TfPrincipal.Listado5Click(Sender: TObject);
begin
  if not Assigned(fmodulo) then raise Exception.Create('¡ fmodulo no ha sido creado aún !'); // <- esta línea
  fmodulo.qVentas.Active:=true;
  fmodulo.qdetalle.Active:=true;
  tfListadosVentas.Create(self).ShowModal;
end;

Saludos :)

Hola buenas noches, no me sigue saliendo el mismo error que presente en la imagen

ecfisa 14-07-2016 14:16:28

Hola.

Bien, paso siguiente revisa que:
  • qVentas y qDetalle existan al momento de citarlos en tu código.
  • Si existe algún código en los eventos OnCreate, OnShow, OnActivate, etc. del TDataModule fmodulo.
  • Si lo hay en BeforeOpen, AfterOpen, BeforeScroll, AfterScroll, etc. de qVentas y qDetalle.
  • Lo mismo con los eventos OnDataChange, OnStateChange, OnUpdateData de los TDataSource asociados con los anteriores.
  • Por último controla los eventos OnCreate, OnShow, OnActivate, etc. de tfListadosVentas.
Si encuentras algo, pública el código por favor.

Saludos :)

Belen12 14-07-2016 17:56:54

Hola
 
Cita:

Empezado por ecfisa (Mensaje 506974)
Hola.

Bien, paso siguiente revisa que:
  • qVentas y qDetalle existan al momento de citarlos en tu código.
  • Si existe algún código en los eventos OnCreate, OnShow, OnActivate, etc. del TDataModule fmodulo.
  • Si lo hay en BeforeOpen, AfterOpen, BeforeScroll, AfterScroll, etc. de qVentas y qDetalle.
  • Lo mismo con los eventos OnDataChange, OnStateChange, OnUpdateData de los TDataSource asociados con los anteriores.
  • Por último controla los eventos OnCreate, OnShow, OnActivate, etc. de tfListadosVentas.
Si encuentras algo, pública el código por favor.

Saludos :)

Hola no existe ningun evento ni en qVentas, ni qDetalle, tampoco en los TDataModule. Y el tfListadosVentas no tengo ningun evento ya que solo cree el form y le agregue los dichos dbgrid

ecfisa 14-07-2016 20:24:55

Hola.

Veo en tu imágen que el error que estas recibiendo es access violation y este se produce generalmente cuando intentas referenciar un objeto que aún no ha sido creado o ya fué liberado.

Dado que has manejado todo de forma visual... Lo único que se me ocurre es que revises en las opciones del proyecto si el TDataModule está en la lista de Auto-create forms. De no ser así, fmodulo no estaría disponible cuando lo llamas y se produciría un error del tipo access violation.

Si fuera el caso, la solución mas rápida es pasarlo de Available forms a Auto-create forms, desde el IDE de Delphi: Project > Options > Forms:



Saludos :)

AgustinOrtu 14-07-2016 23:48:40

Cuando se me presentan este tipo de casos lo que hago es volver a reconstruir todo de a poco hasta que doy con el problema. Estas usando variables globales? Lo digo porque este tipo de cosas me pasaba muy a menudo cuando usaba las variables que me autocreaba el IDE para los form y datamodule, pero se reducio bastante cuando empece a hacerme cargo de los tiempo de vida de los objetos: en general, si en algun momento me equivoco, la excepcion es mas facil de localizar y solucionar

Belen12 15-07-2016 00:44:40

Hola
 
Cita:

Empezado por ecfisa (Mensaje 506984)
Hola.

Veo en tu imágen que el error que estas recibiendo es access violation y este se produce generalmente cuando intentas referenciar un objeto que aún no ha sido creado o ya fué liberado.

Dado que has manejado todo de forma visual... Lo único que se me ocurre es que revises en las opciones del proyecto si el TDataModule está en la lista de Auto-create forms. De no ser así, fmodulo no estaría disponible cuando lo llamas y se produciría un error del tipo access violation.

Si fuera el caso, la solución mas rápida es pasarlo de Available forms a Auto-create forms, desde el IDE de Delphi: Project > Options > Forms:



Saludos :)

Hola en el auto create si tengo el fmodulo y el fprincipal. Luego los otros formularios los tengo al otro lado. Estaba revisando los query y las propiedades y el que da prolema es cuando asocio los master source de cada query. Creo que ahi esta el prolema por que si saco la relacion de uno ya entra al formulario sin prolema

mamcx 15-07-2016 01:40:30

Y que tal si pones el stacktrace cuando te sale el error?

Belen12 15-07-2016 02:32:50

Hola
 
Cita:

Empezado por mamcx (Mensaje 506989)
Y que tal si pones el stacktrace cuando te sale el error?

hola disculpa si lo habia puesto en el msj #9 pase la imagen en forma de link ya que aun no me deja poner una imagen en los mensajes
te lo dejo aqui disculpa si no se vio
http://www.subirimagenes.com/otros-delphii-9622519.html

mamcx 15-07-2016 05:37:01

Eso no es un stackoverflow. Es un acces violation (ose, apuntar a una direccion invalida de memoria).

Lo que debe hacer es en el depurador parar justo en la linea.

Luego examina el valor de las variables/propiedades, Una de esas esta null.

Debes recorrer todo el arbol de:

Cita:

fmodulo.qdetalle.Active
Si esa es la linea del error (o la que sea), y revisar las propiedades internas y confirman que apuntan y enlazan todos los objetos..

Casimiro Notevi 15-07-2016 09:30:38

Cita:

Empezado por Belen12 (Mensaje 506991)
hola disculpa si lo habia puesto en el msj #9 pase la imagen en forma de link ya que aun no me deja poner una imagen en los mensajes
te lo dejo aqui disculpa si no se vio
http://www.subirimagenes.com/otros-delphii-9622519.html

Claro que puedes poner imágenes.
Los enlaces que pones sí que no muestran imagen alguna.


La franja horaria es GMT +2. Ahora son las 08:05:22.

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