[Lazarus-es] error al liberar formulario
José Mejuto
joshyfun en gmail.com
Sab Nov 6 01:14:12 CET 2010
Hello Paola,
Saturday, November 6, 2010, 12:10:35 AM, you wrote:
PB> Application.CreateForm(TDMPrincipal,DMPrincipal);
Aquí le dices que el DMPrincipal es dependiente de la destrucción de
Application.
PB> procedure TABMEquipos.FormClose(Sender: TObject; var CloseAction:
PB> TCloseAction);
PB> begin
PB> dbEquipos.Close;
PB> //DMPrincipal.Free;
PB> CloseAction:=caFree ;
PB> end;
PB> ahora.... el datamodule tiene estos eventos:
[...]
PB> qué tiene que ver que comentando el FreeAndNil(DMPrincipal) ya no me
PB> cause problemas??
Si tienes en TABMEquipos controles que dependen de conexiones o
queries o algo que está en DMPrincipal, si liberas DMPrincipal, al
hacer el close del formulario, estos controles (como un datagrid)
intentarán cerrar el SQL que está en DMPrincipal, pero oh! sorpresa,
DMPrincipal ya no existe!!! :) KBoom!
Con los datamodules, o los abres al principio del programa, y los
dejas ahí hasta que lo cierres, o bien los usas de este modo:
DM:=TDataModule.Create(Self);
Form:=TForm.Create(Self);
Form.ShowModal;
Form.Free;
FreeAndNIL(DM);
Suponiendo que DM sea el nombre global del datamodule.
Si tienes muchos, y no quieres que consuman memoria, pero abrirlos
todos al principio, implementas un datamodule.Use y un
datamodule.release, de modo que cuando el contador de release llegue a
cero, (contador de referencias) cierre todos los SQL y todas las
conexiones. Cuando haces .Use si el contador es cero, abres todas las
conexiones (Open) y activas los SQL. Quedaría algo como:
DM.Use;
Form:=TForm.Create(Self);
Form.ShowModal;
Form.Free;
DM.Release;
Con la ventaja que al cerrar del modo que tu haces:
begin
dbEquipos.Close;
DMPrincipal.Release;
CloseAction:=caFree ;
end;
Si el contador es cero, cierra los SQL y las conexiones, pero NO
destruye los objetos, cosa que hará TApplication al cerrar el
programa.
--
Best regards,
José
More information about the Lazarus-es
mailing list