Puedes regresar directamente como lo haces
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;
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