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�