Ver Mensaje Individual
  #8  
Antiguo 29-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
Cool

Cita:
Empezado por ingel
Estas querys se liberan al liberar el form uUtiles ? (lo que se hace al cerrar la aplicacion) con lo cual se estarian creando cientos de querys sin liberar... o se libera cuando devuelve la llamada que le hizo algun form ?
Pero... esta decisión no la toma nadie por vos... que sos quien lo decide.

Si no los estas liberando, al ser propiedad de Application, se liberarán hasta le final de la ejecución, cosa que no me parece adecuada para la mayoría de los casos. En todo caso, quien sabe lo que pretende con esto y las necesidades específicas del programa sos vos, o al menos debieras saberlo..

En general es conveniente liberar la memoria tan pronto como el objeto deje de usarse. Así, si una función devuelve un TQuery, lo ideal sería algo como:

Código Delphi [-]
Function UnQuery(Parametros : TipoParametros) : TQuery;
Begin
  result := TQuery.Create(nil);
  result.HagoLoQueTengoQueHacer;
end;

Procedure TForm1.Button1Click(Sender : TObject);

Begin
  with UnQuery(Parametros) do
    try
      ProcesarElQuery;
    finally
      Free; // Libero el query
    end;
end;

//o bien:

Procedure TForm1.Button2Click(Sender : TObject);

Var
  Query : TQuery;

Begin
  Query := UnQuery(Parametros);
  try
    ProcesarElQuery(Query);
  finally
    Query.Free;
  end;
end;

{ si el uso escapa a un procedimiento o función, se puede guardar 
una referencia en el formulario y destruirlo cuando sea conveniente, 
por ejemplo en el evento OnDestroy del formulario }
Type
  TForm1 = class(TForm)
    { Lo generado por delphi }
  private
    FQueryUno : TQuery;
    // otros mienbros, métodos y/o propiedades
  end;

Procedure TForm1.Button3Click(Sender : TObject);

Begin
  if not assigned(FQueryUno) Then
    FQueryUno := UnQuery(Parametros);
  FQueryUno.First; 
  etcetera;
end;

Procedure TForm1.Form1Destroy(Sender : TObject);

Begin
  if assigned(FQueryUno) Then
    FQueryUno.Free;
end;

{ por último, se puede pasar una referencia al objeto que se quiere
  dejar como propietario del query dentro de los parámetros de 
  la función que lo crea, para delegar su destrucción al mecanismo
  de liberación automática de memoria de este objeto }

Procedure TForm1.ButtonYaPerdiLaCuentaClick(Sender : TObject);

Var
  Query : TQuery;

Begin
  Query := UnQuery(Self, OtrosParametros);
  // no hace falta liberar el query, porque self será el owner.
end;


Cita:
Empezado por roman
pd: traducción de términos con dedicatoria a jachguate

¿hay algo malo en mi forma de traducir los términos?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita