PDA

Ver la Versión Completa : Problema Stack overflow


Belen12
10-07-2016, 02:47:13
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:
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

tfListadosVentas.Create(self).ShowModal;

dejo las consulta sql de cada query:
Query venta:

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

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:
{$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:
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
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
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:
{$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
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

{$M 32768, 214748364} //(16384 * 2 , 2147483647 div 10)

Belen12
13-07-2016, 09:45:00
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

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í, {$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,

fmodulo.qdetalle.Active:=true;

como mencionas en el mensaje #6 (http://www.clubdelphi.com/foros/showpost.php?p=506942&postcount=6) o en,

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 (http://www.clubdelphi.com/foros/showpost.php?p=506943&postcount=7) ?

Por otro lado, ¿ Sabes como usar los puntos de interrupción(breakpoint) como te sugirió Agustin en el mensaje #2 (http://www.clubdelphi.com/foros/showpost.php?p=506840&postcount=2) ?

Saludos :)

Belen12
13-07-2016, 20:18:02
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


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:

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
Hola Belen12.

A ver, empecemos por mirar si fmodulo está creado al momento del llamado agregando una línea a tu código:

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.

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:

https://s31.postimg.org/rbs4rgldn/Belen12.gif

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.

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:

https://s31.postimg.org/rbs4rgldn/Belen12.gif

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
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:

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
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.

Belen12
15-07-2016, 10:32:08
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:

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..

Hola buenas noches.Primero disculpa si mal interprete lo que me dijiste y te pase un link de algo que no era.Resulta que cuando cree el formulario y lo ejecute me salia ese error de Stack overflow luego cuando empece con la depuracion me salio este error de "acces violation ... "
con respeto a lo que me dijiste esto es lo que me devuelve:


http://www.subirimagenes.com/otros-oioio-9623643.html

http://www.subirimagenes.com/otros-iio-9623650.html

mamcx
15-07-2016, 17:28:26
Pues sigo sin ver el stackoverflow, y sigue siendo un Acces violation.