[Lazarus-es] EXC_BAD_ACCESS al hacer un close de un form

Giuseppe Luigi Punzi glpunzi en lordzealon.com
Jue Jun 25 18:23:33 CEST 2009


Se me tiene que haber olvidado programar :D, las medicinas (que estos
días ando malo), me tienen el cerebro frito, o no se qué :P

Veamos....

El jue, 25-06-2009 a las 17:52 +0200, JoshyFun escribió:

> Hello Giuseppe,
> 
> Thursday, June 25, 2009, 5:15:26 PM, you wrote:
> 
> >> Pues yo diría que si :)
> GLP> Pues yo no veo el error :P
> 
> Jajajaja, ahora sacamos los guantes y nos peleamos :)
> 
> GLP> form está declarado como variable del tipo TFrmClientes.
> 
> El tipo coincide, pero no la instancia a menos que por algún sitio
> hagas:
> 
> frmClientes:=Self o algo así.
> 
> A ver si consigo explicarlo. Supongamos que al hacer un create en vez
> de devolvernos un puntero a una nueva instancia, nos devolviera
> siempre un número consecutivo 1,2,3,4....
> 
> La variable global "frmClientes" inicialmente es igual a nil (cero).
> Ahora en tu código haces:
> 
> var
>   form: TfrmClientes;
> begin
>   form:=TfrmClientes.Create();


Por un lado, éste código, asigna la variable form a la dirección de
memoria de la nueva instancia de TFrmClientes, lanza un show modal (no
visualizado en la citación pero lo comento yo) y luego libera esa
variable/objeto, pero Form, sólo existe en el ámbito del procedimiento
OnClick donde es referenciado, ni siquiera para el resto de la unidad.


> 
> Entonces form es igual a "1", ejecutas el showmodal, y dentro del
> onclose llamas a "frmClientes" que recordemos es igual a cero, no
> igual a "1" que es el que ha originado la llamada. Para eso existe
> "Self" para que no tengas que apuntar quién originó la llamada, ese
> siempre es "Self".


Pero, dentro del formulario, FrmClientes (que es el nombre asociado al
form), es propiamente Self. El formulario, se encuentra en otro ámbito,
y no debería de hecho ni saber de la existencia del valor de la variable
"form". Yo le paso su sentencia de cerrado, que debería cerrarlo, y el
código continuar después del modal, y liberarse con FreeAndNil(form).


> 
> >> Cambia el frmClientes.Close por Self.Close ;)
> GLP> Ok, lo probaré, pero igualmente, debería funcionar como lo he puesto :P
> 
> No por lo explicado arriba, a menos que haya algo de por medio que
> invalide mi exposición.
> 


Pues, a no ser que yo esté equivocado (que no digo que no sea probable),
queda invalidado :D
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20090625/1dc76919/attachment-0002.html>


More information about the Lazarus-es mailing list