Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda Error Campo tipo Imagen SQL (https://www.clubdelphi.com/foros/showthread.php?t=95978)

steelha 23-11-2022 15:51:19

Ayuda Error Campo tipo Imagen SQL
 
Buenas, espero todos estén bien. Tengo una tabla (PACIETNES) en la cual tengo un campo (pxfoto) de tipo IMAGE, esto es en SQL SERVE 2014 utilizando Delphi XE7/10. Tengo los siguientes procedimientos :

Código Delphi [-]
procedure TfrmPacientes.cargar_imagen;
Var
  bmp: TBitmap; Stream: TStream;
  bs      : TMemoryStream;
begin
  with DM.QryPacientes do
  begin
     Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
     imgfoto.Picture.Graphic.SaveToStream(Stream);
     Stream.Free;
  end;
end;

Código Delphi [-]
procedure TfrmPacientes.mostrar_imagen;
var
  Stream: TStream;
begin
  Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
  Stream.Seek(0, soFromBeginning);
  imgfoto.Picture.Graphic.LoadFromStream(Stream);
  Stream.Destroy;
end;

Al guardar el campo no tengo problema, incluso veo que el campo pasa de null a <Datos binarios>, pero cuando quiero mostrar la imagen justo en donde marque como rojo da un error. lo intente con bitmap y da mensaje de error de bitmap no valid; si lo dejo con graphic da un error adress violation adress 00700EDA.

Si pueden ayudarme con este problema. se los agradecere.

duilioisola 23-11-2022 17:12:43

Yo cargo así las imágenes con el siguiente procedimiento.
Supongo que en tu caso Formato debería ser 'BMP'.
Lo importante es que creo un bitmap para leer el stream. Luego asigno ese Bitmap a la imagen.

Código Delphi [-]
/// Imagen es un componente tipo TImage en el formulario.
/// Stream es un stream que leo de un campo BLOB que contiene una imagen.
/// Formato es el tipo de codificacion de la imagen.

procedure TDMMain.CargarImagenDeStream(Imagen: TImage; Stream: TStream; Formato: string);
var
  BMP : TBitMap;
  JPG : TJpegImage;
  GIF : TGIFImage;
  PNG : TPNGGraphic;
begin
  if Formato = 'BMP' then
  begin
     BMP := TBitmap.Create;
     try
        BMP.LoadFromStream(Stream);
        Imagen.Picture.Assign(BMP);
     finally
        BMP.Free;
     end;
  end
  else
  if Formato = 'JPG' then
  begin
     JPG := TJpegImage.Create;
     try
        JPG.LoadFromStream(Stream);

        BMP := TBitmap.Create;
        try
           BMP.Assign(JPG);
           Imagen.Picture.Assign(BMP);
        finally
           BMP.Free;
        end;
     finally
        JPG.Free;
     end;
  end
  else
  if Formato = 'GIF' then
  begin
     GIF := TGIFImage.Create;
     try
        GIF.LoadFromStream(Stream);
        Imagen.Picture.Assign(GIF);
     finally
        GIF.Free;
     end;
  end
  else
  if Formato = 'PNG' then
  begin
     PNG := TPNGGraphic.Create;
     try
        PNG.LoadFromStream(Stream);
        Imagen.Picture.Assign(PNG);
     finally
        PNG.Free;
     end;
  end;
end;

duilioisola 23-11-2022 17:18:02

Recuerda también utilizar bloques TRY..FINALLY para evitar que queden cosas abiertas si algo falla.

Código Delphi [-]
procedure TfrmPacientes.cargar_imagen;
Var
  bmp: TBitmap; Stream: TStream;
  bs      : TMemoryStream;
begin
  with DM.QryPacientes do
  begin
     Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
     try {<---}
        imgfoto.Picture.Graphic.SaveToStream(Stream);
     finally {<---}
        Stream.Free;
     end; {<---}
  end;
end;

procedure TfrmPacientes.mostrar_imagen;
var
  Stream: TStream;
begin
  Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
  try {<---}
     try {<---}
        Stream.Seek(0, soFromBeginning);
        imgfoto.Picture.Graphic.LoadFromStream(Stream);
     except {<---}
       // Si falla limpio la foto para que no quede la anterior
       imgfoto.Picture := nil;
     end; {<---}
  finally {<---}
     Stream.Free;
  end; {<---}
end;

steelha 23-11-2022 17:55:14

Muchas gracias duilioisola, copie el codigo que me mandaste y aun asi me daba el mismo error. Cambie el Graphic por bitmap y funciono. dejo código por si lo necesitan.
Código Delphi [-]
procedure TfrmPacientes.cargar_imagen;
Var
  bmp: TBitmap; Stream: TStream;
  bs      : TMemoryStream;
begin
  with DM.QryPacientes do
  begin
     Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
     try
        imgfoto.Picture.Bitmap.SaveToStream(Stream);
     finally
        Stream.Free;
     end;
  end;
end;

Código Delphi [-]
procedure TfrmPacientes.mostrar_imagen;
var
  Stream: TStream;
begin
  Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
  try
     try
        Stream.Seek(0, soFromBeginning);
        imgfoto.Picture.Bitmap.LoadFromStream(Stream);
     except
       // Si falla limpio la foto para que no quede la anterior
       imgfoto.Picture := nil;
     end;
  finally
     Stream.Free;
  end;
end;


La franja horaria es GMT +2. Ahora son las 12:29:59.

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