Hola, tengo el siguiente problema, Tengo la clase TConexionBD que es descendiente de un TDSServerModule, que creo vía código, realizando la siguiente llamada:
Código Delphi
[-]
FConexionBD:=TConexionBD.Create(FProviderDataBD);
Donde FProviderDataBD, es una clase que contiene los parámetros de conexión de la BD (Nombre base de datos, login, password, ruta BD, etc). El constructor de TConexionBD es el siguiente:
Código Delphi
[-]
constructor TConexionBD.Create(AProvider:TProviderData);
begin
inherited create(nil);
FManagerConexion:=TFDManager.Create(nil);
FConexion:=TFDConnection.Create(nil);
FConexion.LoginPrompt:= False;
FTransaction:=TFDTransaction.Create(nil);
FConexion.Transaction:=FTransaction;
FParams:=TStringList.Create;
setParam(AProvider);
setConexion(AProvider);
end;
Y el destructor de TConexionBD es el que sigue:
Código Delphi
[-]
procedure TConexionBD.DSServerModuleDestroy(Sender: TObject);
begin
Disconect;
funGlobal.CloseObjet([FParams,FDPhysFBDriverLink,FTransaction,FConexion,FManagerConexion]);
end;
Destructor que es llamado de la siguiente forma:
Código Delphi
[-]
procedure TSystemClass.DestroyConexionBD;
begin
funGlobal.CloseObjet([FConexionBD]);
end;
procedure TfunGlobal.CloseObjet(AObjeto:Array of TObject);
var vIndice:Integer;
begin
for vIndice:= Low(AObjeto) to High(AObjeto) do begin
if Assigned(AObjeto[vIndice]) then FreeAndNil(AObjeto[vIndice]);
end;
end;
Como verán la destrucción la llevo a cavo utilizando el método freeandnil y validando con assigned que el objeto halla sido creado con anterioridad. Es de suponer que al destruir el objeto este quedara en nil, pero no es así. Si llamo a DestroyConexionBD dos veces en la segunda llamada dispara un error de violación de acceso, esto no debería pasar ya que Assigned comprueba que el objeto este creado para destruirlo.
Preguntaran porque llamo 2 veces al destructor. El objeto se crea en forma manual por el usuario y también lo puede destruir el mismo usuario, pero los procedimientos al estar contenidos en un form la destrucción también se lleva a cavo al cerrar el form. Es decir, puede ocurrir que el usuario cierre el objeto y después al cerrar el form el cierre ocurre nuevamente. ¿Es correcta la forma de ?destruir el objeto?, ¿Assigned, comprueba realmente que el objeto ha sido creado?...
Saludos....