Ver Mensaje Individual
  #1  
Antiguo 20-06-2024
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.214
Reputación: 24
newtron Va camino a la fama
Liberar stream en función

Buenas a tod@s.


Trabajando en el tema del QR para VeriFactu he hecho una función para generarlo y devolvérmelo en modo stream para guardarlo en la tabla e imprimirlo en la factura posteriormente.


El tema es que he creado una función aprovechando y retocando un componente que publicó el compañero escafandra en otro foro tal que así:


Código Delphi [-]
function DameQRIMG(QRText: String): TMemoryStream;
var
  QR: TQRCodeImage;
  Stream: TMemoryStream;
  Bitmap: TBitmap;
  GR: TGraphic;
  Jpg: TJpegImage;
begin
  QR:=TQRCodeImage.Create(nil);
  QR.Width := 169;
  QR.Height:= QR.Width;
  QR.Text := QRText;
  GR:=TGraphic.Create;
  GR:=QR.Picture.Graphic;
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Width:= QR.Width;
    Bitmap.Height:= QR.Width;
    Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,GR);

    jpg := TJPEGImage.Create;
    jpg.Assign(Bitmap);
    Stream:=tmemorystream.Create;
    jpg.SaveToStream(Stream);
  finally
    Result:=Stream;
    Bitmap.Free;
    Jpg.Free;
//    Stream.Free;
  end;
end;


En la que la llamo con el texto del QR y me devuelve un stream con la imagen. Hasta aquí todo bien.


El problema es si le hago un "Free" a la variable Stream que previamente he creado, he asignado y luego he igualado "Result" a ella. Si hago el "Free" me da un error y si lo quito funciona bien pero no sé si eso irá consumiendo memoria en cada llamada hasta el infinito y más allá.


Alguien me podría decir si no hago el "Free" tendré problemas de memoria o si se libera solo de alguna manera, o en caso contrario, cómo puedo liberarlo sin que me de error.


Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita