Ver Mensaje Individual
  #2  
Antiguo 24-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Puedes regresar directamente como lo haces

Código Delphi [-]
Result := html;

pero no puedes liberarlo dentro de la misma función sino posteriormente. Por tanto, si usas simplemente:


Código Delphi [-]
LoadFromStream(CargarStream);

tendrás una fuga de memoria ya que no tienes ninguna referencia al Stream devuelto para poder liberarlo, así que tendrías que hacer algo como:


Código Delphi [-]
var
  Stream: TStream;

begin
  Stream := CargarStream;
  LoadFromStream(Stream);
  Stream.Free;
end;

de manera que no ahorras nada.

Si de plano te da flojera escribir tanto podrías englobar el stream dentro de una interfaz:

Código Delphi [-]
type
  ILazyStream = interface
    function GetStream: TMemoryStream;
    property Stream:  TMemoryStream read GetStream;
  end;

  TLazyStream = class(TInterfacedObject, ILazyStream)
  private
    FStream: TMemoryStream;

  public
    constructor Create;
    destructor Destroy; override;

    { ILazyStream }
    function GetStream: TMemoryStream;
  end;

...

constructor TLazyStream.Create(AStream: TMemoryStream);
begin
  inherited;
  FStream := TMemoryStream.Create;
end;

destructor TLazyStream.Destroy;
begin
  FStream.Free;
  inherited;
end;

function TLazyStream.GetStream: TMemoryStream;
begin
  Result := FStream;
end;

En tu función CargarStream creas una instancia de TLazyStream y esa es la que devuelves usando LazyStream.Stream:

Código Delphi [-]
function CargarStream: ILazyStream;
begin
  Result := TLazyStream.Create;

  ...
end;

...

LoadFromStream(CargarStream.Stream);

Así, cuando se pierda el contexto de LoadFromStream (es decir termine el procedimiento desde donde lo llamas) CargarStream, siendo una interfaz, automáticamente llamará al destructor de TLazyStream.

// Saludos
Responder Con Cita