Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Question Stack Overflow

hola a todos, quería preguntarles lo siguiente:

Hice un aplicación, y la instalé en la máquina del cliente...tiene una primer pantalla donde se cargan datos de personas...
y en la máquina del cliente cuando están cargando los datos aparece un mensaje de Stack Overflow y se cierra la aplicación(esto en mi máquina no lo hace), alguien me puede dar una idea de que se trata... (en las dos máquinas está Windows XP).
También cuando se activa el protector de pantalla (en la máquina dedl cliente se cuelga)...
Si alguien me puede dar una idea se lo voy a agradecer pq estoy desesperada..
Gracias.
Mariana
Responder Con Cita
  #2  
Antiguo 23-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Hola mariana,

lo del protector de pantalla , ni idea... eso me suena mas a un error del XP.

Pero el error del Stack Overflow debe ser un problema de codigo en la carga de los datos o bien en la conexion...

Danos info sobre lo que hace tu aplicacion cuando se carga, asi vemos que puede ser
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #3  
Antiguo 23-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
les cuento un poco mas de la aplicación.

-usa tablas dbase for windows
-la carga el de datos personales (nombre, tel, dir, etc), y desde la aplicación lo hace con un append, genera un código para la persona que se está ingresando, pero no llega a grabarlo pq se cuelga antes.
- para instalarlo en la máquina del ciente hice un instalador con el InstallShield
- no se que más describir ya que no llega a hacer nada más que abrir una ventana, un append en una tabla, empiezan a cargar los datos y aparece el mensaje. pero lo más raro es que en mi máquina si funciona.
Espero que me puedan ayudar, gracias.
Mariana.
Responder Con Cita
  #4  
Antiguo 23-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

"Stack Overflow" o desbordamiento de pila, es un error frecuente, como se ha dicho en un hilo de hoy mismo, de cuando en una función se crea una recursión infinita, es decir, un bucle cerrado de llamadas a la misma función; la pila se va llenando de nuevas llamadas a la función, con su carga añadida de variables... etc, hasta que se desborda.

Para poder encontrar el error, haría falta por nuetra parte ver el código. El hecho de que se produzca en una máquina y no en otra, más aún teniendo el mismo SO, para el caso concreto que planteas, ¿pudiera estar relacionado con que en un caso se dispara un evento en el Append que ocasiona la llamada recursiva, y en el otro no se llama a Append, porque no precisa esos datos, por ejemplo? Son suposiciones, pero haría falta ver el código.
__________________
Guía de Estilo
Responder Con Cita
  #5  
Antiguo 24-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Andres,

Este es el código (de la opción nuevo del main menú) de la unidad principal donde se llama a la segunda unidad, en la que el usuario carga los datos (en la que aparece el stack overflow).
En esa unidad hay dbedits para cada campo de la tabla que se carga y cuando están completando los datos es cuando se cuelga.

procedure TConsultorio.Nuevo1Click(Sender: TObject);
begin

//deshabilita todos los botones menos aceptar y salir pq es uno nuevo
Application.CreateForm(Tform2, form2);
form2.bborrar.enabled:=false;
form2.lborrar.enabled:=false;
form2.bmodif.enabled:=false;
form2.lmodif.enabled:=false;
form2.bmodif2.enabled:=false;
form2.lmodif2.enabled:=false;
form2.bderivacion.enabled:=false;
form2.lderivacion.enabled:=false;
form2.brecita.enabled:=false;
form2.lrecita.enabled:=false;
form2.bimprimir.enabled:=false;
form2.limprimir.enabled:=false;
form2.bhcimprimir.enabled:=false;
form2.lhcimprimir.enabled:=false;
form2.baceptar.Enabled:=true;
form2.laceptar.Enabled:=true;
form2.baceptar2.Enabled:=true;
form2.laceptar2.Enabled:=true;
form2.bplan.Enabled:=false;
form2.lplan.Enabled:=false;
form2.bhistorial.Enabled:=false;
form2.lhistorial.Enabled:=false;
//dehabilta derivacion
form2.Ldbderivacion.enabled:=false;
form2.dbderivacion.enabled:=false;
// marca nuevo
paciente.nuevo:=true;
form2.comboNyAp.Visible:=false;
form2.editNyAp.Visible:=true;
//generar codigo paciente nuevo
codigopaciente;
modulodatos.modat.Paciente.append;
modulodatos.modat.Paciente.edit;
modulodatos.modat.Paciente.FieldByName('codigop').asinteger:=codigop;
modulodatos.modat.HistoriaClinica.append;
modulodatos.modat.HistoriaClinica.edit;
modulodatos.modat.HistoriaClinica.FieldByName('codigop').asinteger:=codigop;
form2.ShowModal;
modulodatos.modat.Paciente.Refresh;
modulodatos.modat.HistoriaClinica.Refresh;
end;

Espero que con esto me puedas ayudar,
Muchas, Muchas Gracias
Mariana.
Responder Con Cita
  #6  
Antiguo 24-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

Del código que pones no veo donde pueda saltar un "Stack overflow", aunque sería bueno que indicases si tienes algún evento asociado a los Datasets que manejas.

Decirte además que si haces un Append, el Edit anterior es innecesario. Echo de menos el Post para validar la modificación, a ver si al no grabar y hacer el refresh se queda ese dato sin grabar y por eso se repite la operación (ahora mismo no estoy seguro ni lo puedo mirar, si el refresh aborta la edición sin validarla).

Otra consideración, que no tiene que ver con el problema planteado. Todas esas sentencias poniendo Enabled a FALSE sería mejor hacerlas dentro de la unit del Form2, mejor aún desde un procedimiento que recorriera los componentes:

Código:
for i:=0 to ComponentCount - 1 do
  if Components[i] is TButton then // Y alguna condición más
    TButton(Components[i]).Enabled := FALSE;
Aunque no entiendo, si ese código se ejecuta al crear un Form2, por qué no los deshabilitas en diseño.

A ver si esto te sirve, saludos
__________________
Guía de Estilo
Responder Con Cita
  #7  
Antiguo 24-10-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola Mariana.

Quisiera recomendarte el uso de etiquetas [ code ] y [ /code ] cuando introduzcas código en un hilo. La diferencia es enorme...

procedure TConsultorio.Nuevo1Click(Sender: TObject);
begin

//deshabilita todos los botones menos aceptar y salir pq es uno nuevo
Application.CreateForm(Tform2, form2);
form2.bborrar.enabled:=false;
form2.lborrar.enabled:=false;
form2.bmodif.enabled:=false;

Vs:

Código:
procedure TConsultorio.Nuevo1Click(Sender: TObject);
begin
  //deshabilita todos los botones menos aceptar y salir pq es uno nuevo
  Application.CreateForm(Tform2, form2);
  form2.bborrar.enabled:=false;
  form2.lborrar.enabled:=false;
  form2.bmodif.enabled:=false;
  ..
End;
Ves??.

Además, es realmente necesaria la llamada a Edit despues de append?? Me parece que no. Porque no aclaras un poco que eventos tenes relacionados a cada DataSet, quizas con las partes mas relevantes del código?...

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
  #8  
Antiguo 24-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Andres:

Gracias por tu respuesta,
- no tengo ningún evento asociado a los datasets que manejo, lo único que hago es cargar datos de la mima forma que mostré.
- El edit está puesto pq en algunas ocasiones al hacer el append no me permitía agregar los datos (el error decía que la tabla no estaba en modo de edit o insert ), y esta fue la única forma que encontré de solucionarlo.
- El Post se hace en el form2 antes de cerrarlo, por esto en el form principal después del showmodal hago el refresh de la tabla.
- Con respecto a la deshabilitación de los botones, es cierto lo que me indicas, pero el form2 lo llamo desde 2 ítems del main menú, en este caso los necesito dehabilitados, en el otro habilitados, de manera que si en diseño los pongo deshabilitados en la otra opción voy a tener que habilitarlos.


Jachguate:

Gracias por tu sugerencia, el tema del edit lo comenté arriba.

Gracias a todos.
Mariana.
Responder Con Cita
  #9  
Antiguo 24-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

Me resulta extraño que Append no te deje la tabla en estado de edición (en ese caso de inserción: dsInsert), la única razón que se me ocurre es que en el BeforeInsert de la tabla tuvieras algún código que "cerrara la edición".

Por otro lado, hay una llamada a un procedimiento "codigopaciente" que convendría ojear.

De todas formas, si te ocurre el error en otra máquina y en aquella no tienes instalado Delphi para debuguear, yo en tu caso pondría varios mensajes en puntos estratégicos de ese código, al estilo:

Form2.Tabla.Edit;
ShowMessage ('Paso 1');
codigopaciente;
ShowMessage ('Paso 2');

Aunque algo molesto, puede ayudarte a encontrar la línea que origina el error.
__________________
Guía de Estilo
Responder Con Cita
  #10  
Antiguo 27-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Question

Andres:

Gracias por tus respuestas, pero estoy empezando a pensar que no es problema del código, y mis preguntas ahora son:
- puede ser originado el problema por tener muchas ventanas activas a la vez?
- puede ser originado por algún problema de Windows XP?
Muchas Gracias
Mariana.
Responder Con Cita
  #11  
Antiguo 27-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

El "stack overflow" como dije anteriormente, tiene toda la pinta de saltar porque has entrado en un bucle infinito de llamadas recursivas, puede ser por otras razones, pero esa es, al menos, la que más veces he visto. Lo de tener varias ventanas no debe influir, en teoría, otra cosa es que llamen a funciones comunes y que éstas entren en recursividad.

Lo de ser debido a XP, bueno, tú dijiste que en dos máquinas XP, en una iba y en otra no, así que parece descartable esa posibilidad.

¿Has probado lo de poner "mensajes debugeadores", como te sugerí?

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #12  
Antiguo 27-10-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
- El edit está puesto pq en algunas ocasiones al hacer el append no me permitía agregar los datos (el error decía que la tabla no estaba en modo de edit o insert ), y esta fue la única forma que encontré de solucionarlo.
Código:
if not ( modulodatos.modat.Paciente.State in dsEditModes) then
    modulodatos.modat.Paciente.Edit;
Append deja el registro en modo de edición, si algunas veces no te deja, es que ha ocurrido algun error, por lo que deberias considerar el uso de los eventos de la tabla paciente para que, en caso de error, te avise. (OnPostError, OnEditError....)

codigopaciente;

Al parecer eso prepara algunos datos para crear el paciente, seria muy conveniente hacer uso del evento OnNewRecord de la tabla correspondiente para inicializar valores de los campos. Ya que es donde debe hacerse.

El Form2 es Modal, se permite cancelar el alta del registro???
si se permite, que pasa con el nuevo registro que ya has añadido ?

Lo que quiero decir, para saber si funciona bien, deberiamos saber que hace codigopaciente y el Form2

Saludos, y espero aclarar algo en lugar de liarlo más.
Responder Con Cita
  #13  
Antiguo 30-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Gracias por las respuestas, les contesto lo que me preguntan:

Andres: Con respecto a los mensajes no los puse aún porque todavía no volví a tener acceso a la máquina del cliente, pero de todos modos las sentencias que están allí las pasa porque el error surge en el form2.
No tengo ninguna función recursiva, de manera que no creo que se generen llamadas de este tipo.

Lepe: codigopaciente es una función que genera un código (usando la función random), fijándose que no este en la tabla (es la clave del nuevo registro).
En el form2, tiene la opción de cancelar (cancel de la tabla), o de guardar (post).

Gracias a todos por las respuestas, y si tiene alguna otra idea se los voy a agradecer.
Mariana.
Responder Con Cita
  #14  
Antiguo 30-10-2003
Mariana Mariana is offline
Miembro
 
Registrado: sep 2003
Posts: 50
Poder: 21
Mariana Va por buen camino
Gracias por las respuestas, les contesto lo que me preguntan:

Andres: Con respecto a los mensajes no los puse aún porque todavía no volví a tener acceso a la máquina del cliente, pero de todos modos las sentencias que están allí las pasa porque el error surge en el form2.
No tengo ninguna función recursiva, de manera que no creo que se generen llamadas de este tipo.

Lepe: codigopaciente es una función que genera un código (usando la función random), fijándose que no este en la tabla (es la clave del nuevo registro).
En el form2, tiene la opción de cancelar (cancel de la tabla), o de guardar (post).

Gracias a todos por las respuestas, y si tiene alguna otra idea se los voy a agradecer.
Mariana.
Responder Con Cita
  #15  
Antiguo 30-10-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No hace falta que haga llamadas recursivas, puedes provocarlas por un simple fallito, imagina esta secuencia.

Llamas a Append, y allí cambias el valor de un campo, y despues tienes puesto que en el Onchange de un campo haga tal o cual cosa.... ya se están provocando llamadas "silenciosas" que se te pueden pasar por alto. Sé que éste no es tu caso, ya que dices que no tienes eventos asignados, pero es un ejemplo de lo que puede ocurrir.

Fallos en una Base de datos puede haber miles y miles, si no tienes eventos asignados, se te puede ir por peteneras y no enterarte de nada

los ShowMessages es una alternativa cuando estas desarrollando el programa en tu ordenador, tambien podrías hacer un simple fichero de texto e ir añadiendo los mensajes a ese fichero. Siempre puedes enviar un millon de mensajes para que una sola ejecución, saber donde falla.

Suerte !!
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


La franja horaria es GMT +2. Ahora son las 12:18:10.


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