Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 1 Semana
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.486
Poder: 21
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
  #2  
Antiguo Hace 1 Semana
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 75
Poder: 10
marco3k Va por buen camino
Aunque esa variable "Stream" es local y debería finalizar al final de la función, pero en todo caso intenta poner esa linea:

Código Delphi [-]
Stream: TMemoryStream;
La declaras fuera de esa función como publico y luego le aplicas el free desde afuera de la función. Me parece que el error es porque destruyes el objeto dentro de la función.

Última edición por marco3k fecha: Hace 1 Semana a las 15:02:51.
Responder Con Cita
  #3  
Antiguo Hace 1 Semana
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.342
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo soy de los que piensa que quien crea las cosas es quien debe ser resposable de destruirlas, así que yo optaría por crear y destruir el Stream en el mismo sitio.
Cambia la definición a algo como esto:
Código Delphi [-]
procedure DameQRIMG(QRText:String; QRImage:TMemoryStream);

Y la llamada de esta forma...

Código Delphi [-]
  ms := TMemoryStream.Create;
  try
    DameQRIMG(QRText:String; QRImage:TMemoryStream);
    ... Hacer lo que sea con la imagen
  finally
    FreeAndNil(ms);
  end;

Y en el procedimiento usar el parámetro QRImage, en lugar del result.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo Hace 1 Semana
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.486
Poder: 21
newtron Va camino a la fama
Gracias marco3k y Germán.


Realmente las dos sugerencias van por el mismo camino, la diferencia es dónde crear y liberar la variable. Al final he optado por la de Germán, prefiero usar variables locales siempre que sea posible.



Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo Hace 5 Días
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.199
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Date cuenta de una cosa, la función que muestras DameQRIMG devuelve el Stream que ha creado ella misma. Si al salir lo destruye, estas devolviendo un stream inválido que ya no existe. Deberá ser destruido por la función llamadora y para apoyar la idea, tu función debería llamarse algo como CreateQRStream. De esta forma ya indica que el Stream devuelto deberá ser destruido por la función llamadora.


La idea de Neftali va por el mismo camino, sólo que es la función llamadora la que suministra el Stream ya creado.





Saludos.
Responder Con Cita
  #6  
Antiguo Hace 2 Días
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.486
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por escafandra Ver Mensaje
Date cuenta de una cosa, la función que muestras DameQRIMG devuelve el Stream que ha creado ella misma. Si al salir lo destruye, estas devolviendo un stream inválido que ya no existe. Deberá ser destruido por la función llamadora y para apoyar la idea, tu función debería llamarse algo como CreateQRStream. De esta forma ya indica que el Stream devuelto deberá ser destruido por la función llamadora.


La idea de Neftali va por el mismo camino, sólo que es la función llamadora la que suministra el Stream ya creado.





Saludos.

Gracias compañero y gracias de nuevo por el componente, práctico y fácil de implementar.


La verdad es que estoy algo "atontao" como siempre y, en vez de modificar nuestro reporteador para directamente imprimir cualquier qr usando tu componente, me he mareado creando la imagen y guardándola en el registro para después imprimirla como imagen .


Saludos.
__________________
Be water my friend.
Responder Con Cita
  #7  
Antiguo Hace 2 Días
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.199
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El componente tiene otra versión para QReport derivado de TQRImage que está enfocado para la impresión de reportes. Si es tu caso, quizás te resulte más útil esa versión.

Saludos.
Responder Con Cita
  #8  
Antiguo Hace 2 Días
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.486
Poder: 21
newtron Va camino a la fama
Perfecto. Le echaré un vistazo.


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



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Stream webcam walito API de Windows 2 27-04-2010 15:21:57
MD5 de un Stream. JXJ Varios 3 03-10-2007 18:52:40
Stream a TImage eframtz Gráficos 4 20-04-2007 04:55:06
Puntero a Stream Enan0 Varios 3 22-03-2005 22:08:13
Optener un Stream como "Result" en una funcion sitrico Varios 3 24-11-2004 22:06:38


La franja horaria es GMT +2. Ahora son las 21:01:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi