Ver Mensaje Individual
  #2  
Antiguo 08-08-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Creo que no es correcto porque liberas el stream antes de devolverlo

Código Delphi [-]
function TServerMethods1.GetImagenBannerAsStream(ASQLQuery: TSQLQuery;
  AIDBanner: Integer): TStream;
var
 stream: TMemoryStream;
 MiImagenDB: TImage;
begin
  if (ASQLQuery.Active) then ASQLQuery.Close();
  with ASQLQuery do
  begin
    ParamByName('id_articulo').AsInteger := AIDBanner;
    Open;
  end;
  //
  stream := TMemoryStream.Create; <== AQUI CREAS EL STREAM
  MiImagenDB := TImage.Create(MiImagenDB);
  try
    MiImagenDB.Picture.LoadFromFile(qArtImagenIMAGEN.AsString);
    MiImagenDB.Update;
    MiImagenDB.Picture.SaveToStream(stream);

  finally
    MiImagenDB.Free;
    Result := stream; <== AQUI DEVUELVES EL STREAM QUE SERA LIBREADO EN LA SIGUIENTE LINEA
    stream.Free; <== AQUI LIBERAS EL STREAM
  end;
  ASQLQuery.Close;
end;


Código Delphi [-]
function TServerMethods1.GetImagenBannerAsStream(ASQLQuery: TSQLQuery;
  AIDBanner: Integer): TStream;
var
 MiImagenDB: TImage;
begin
  if (ASQLQuery.Active) then ASQLQuery.Close();
  with ASQLQuery do
  begin
    ParamByName('id_articulo').AsInteger := AIDBanner;
    Open;
  end;
  
  // AQUI CREAS EL STREAM
  // Quien lo consuma, deberá encargarse de librear la memoria
  Result := TMemoryStream.Create;
  try
    MiImagenDB := TImage.Create(MiImagenDB);
    try
      MiImagenDB.Picture.LoadFromFile(qArtImagenIMAGEN.AsString);
      MiImagenDB.Update;
      MiImagenDB.Picture.SaveToStream(Result);

    finally
      MiImagenDB.Free;
    end;
  except
    // libero el stream si hubo algun problema
    Result.Free;
  end;
  ASQLQuery.Close;
end;

[...]

var
 AStream: TMemoryStream;
begin
  AStream := GetImagenBannerAsStream(Q, 1234);
  try
     // Hacer algo con el Stream
  finally
     AStream.Free;
  end;
end;

Última edición por duilioisola fecha: 08-08-2022 a las 11:05:58. Razón: Evito MemoryLeak si hay errores.
Responder Con Cita