[Lazarus-es] forms enredados II

José Mejuto joshyfun en gmail.com
Lun Dic 20 21:51:42 CET 2010


Hello Paola,

Monday, December 20, 2010, 8:49:48 PM, you wrote:

>> Después del ShowModal no haces nada más ?
PB> no.. es una opción de menú: creo y showmodal

Vale... Pero si es "ShowModal" puedes liberarlo después del modal, sin
tener que meterte en lo del caFree.

PB> Program received signal SIGSEGV, Segmentation fault.
PB> 0x004372d6 in TAPPLICATION__DOIDLEACTIONS (this=0x21a448)
PB>      at ./include/application.inc:980
PB> 980           if AForm.FormStyle=fsSplash then
PB> Current language:  auto; currently pascal
PB> (gdb) bt
PB> #0  0x004372d6 in TAPPLICATION__DOIDLEACTIONS (this=0x21a448)
PB>      at ./include/application.inc:980
PB> #1  0x004361ee in TAPPLICATION__IDLE (WAIT=true, this=0x21a448)
PB>      at ./include/application.inc:382
PB> #2  0x00437a7f in TAPPLICATION__HANDLEMESSAGE (this=0x21a448)
PB>      at ./include/application.inc:1227
PB> #3  0x00437e8f in TAPPLICATION__RUNLOOP (this=0x21a448)
PB>      at ./include/application.inc:1359
PB> #4  0x00447203 in TWIDGETSET__APPRUN (ALOOP=0x437e50 
PB> <TAPPLICATION__RUNLOOP>,
PB>      this=0x222460) at ./include/interfacebase.inc:49
PB> #5  0x00437e45 in TAPPLICATION__RUN (this=0x21a448)
PB>      at ./include/application.inc:1347
PB> #6  0x00402ece in main () at Serviam.lpr:47
PB> (gdb)

A ver, ahora intento explicarte que significa eso :) Lo primero que
parece un bug en la LCL, no un fallo tuyo, aunque posiblemente por un
uso extraño (en el sentido de poco habitual) del form.

Tu form recibe el onclose, le dices que haga un "caFree", así que
cuando acaba la rutina, la LCL libera el form (le hace un free). Hasta
aquí todo bien, pero resulta que misteriosamente el mismo form que ha
sido destruido recibe un mensaje (posiblemente uno enviado con
PostMessage) para él, y la LCL al decirle que lo procese, KBOOM! ya
que el form ya no existe.

Esto puede ser debido al uso de caFree en un ShoModal, y quizá
combinado con el uso de un timer, o algo que provoca el envio de
mensajes asíncronos. Desde luego será usa cosa complicada de
"debuggar" ya que tendrías que hacerlo tu a menos que consiga
sintetizar un ejemplo mínimo que provoque el mismo fallo.

Hazme un favor, provoca el crash otra vez, cuando te de el "SIGSEGV"
dale a OK, vete a "Ver -> Debug -> Call stack" (no se como lo pone en
español), busca la linea del stack que pone
TAPPLICATION__DOIDLEACTIONS, dale doble click, y luego click derecho y
selecciona la opción de, uy no recuerdo el nombre, la tercera opción,
que hace que en esa linea se ponga una flechita de color azul claro.
Ahora deberías poder inspeccionar el valor de las variables, a ver si
ves una que se llame algo así como "message", o "LMessage" o algo así,
que me de una pista del mensaje que está provocando el estropicio.

PB> Ahora estaba mirando, que si cambio en el onClose del ABM esto que puse:
PB> cierre de tablas
PB> closeAction:= caFree;  //como aca libero el form, no necesito hacer el
PB> freeandnil
PB> por esto:
PB> cierre de tablas
PB> close;
PB> no me sale el access violation

Por que el form no se libera, se queda ocupando memoria. Puedes
liberarlo después del ShowModal.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list