[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