Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-07-2005
jvalles jvalles is offline
Miembro
 
Registrado: mar 2005
Posts: 16
Poder: 0
jvalles Va por buen camino
que hago mal?

hola estoy intentando cargar una imagen de un campo blob desde un dataset pero me da error (access violation at adress....),
¿alguien me puede decir que hago mal?

esta es la linea que falla:
TBlobField(datasource1.DataSet.FieldByName('logo')).SaveToStream(Stream);

este es el procedure que falla:
procedure TForm1.muestraimagen();
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
TBlobField(datasource1.DataSet.FieldByName('logo')).SaveToStream(Stream);
if Stream.Size > 0 then begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Image1.Picture.Bitmap.LoadFromStream(Stream);
gtIcon: Image1.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Image1.Picture.Metafile.LoadFromStream(Stream);
gtJpeg: begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Image1.Picture.Assign(Jpg);
end else
Image1.Picture.Assign(nil);
end;
end else
Image1.Picture.Assign(nil);
except
on e:exception do begin
Image1.Picture.Assign(nil);
showmessage(e.Message);
end
end;
jpg.Free;
Stream.Free;
end;

y este es el original que no falla (lo he probado):
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
TBlobField(Table1.FieldByName('Graph')).SaveToStream(Stream);
if Stream.Size > 0 then begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Image1.Picture.Bitmap.LoadFromStream(Stream);
gtIcon: Image1.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Image1.Picture.Metafile.LoadFromStream(Stream);
gtJpeg: begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Image1.Picture.Assign(Jpg);
end else
Image1.Picture.Assign(nil);
end;
end else
Image1.Picture.Assign(nil);
except
Image1.Picture.Assign(nil);
end;
jpg.Free;
Stream.Free;
end;



La cosa es que en el original se usa un TTABLE para acceder a la base de datos y en mi programa se asigna un dataset (procedente de un servicio web .net) a un datasource, los datos se muestran correctamente en un DBGRID, pero no consigo ver la imagen que hay en el campo LOGO (blob).

muchas gracias!!!
Responder Con Cita
  #2  
Antiguo 19-07-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Varios comentarios:
- ¿Cuál es la lógica de ese tratamiento de errores?
- ¿Cuál es el sentido, de inicializar las variables Jpg y Stream?
- ¿Existen garantías de que exista datasource1.DataSet.FieldByName('logo')?
...

Este último punto, seguramente es la raíz de tu problema, primero tienes que saber si datasource1 tiene asignado un DataSet y luego si en este DataSet existe el campo ‘logo’:

Código Delphi [-]
var
  AField: TField;
begin
  ...
  If Assigned(datasource1.DataSet) then
  begin
    AField := datasource1.DataSet.FieldByName('logo');
    if Assigned(AField) then
       ...
  end;
Por otro lado... ¿Seguro que no puedes acceder directamente al DataSet?

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 19-07-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Manteniendo tu lógica:
Código Delphi [-]
var
  Stream: TMemoryStream;
  Jpg: TJpegImage;
  GraphType: TGraphType;
begin
  Stream := TMemoryStream.Create;
  try
    if Assigned(Query1.FieldByName('logo')) then
      try
        TBlobField(Query1.FieldByName('logo')).SaveToStream(Stream);
        if Stream.Size > 0 then
        begin
          Stream.Position := 0;
          Stream.Read(GraphType, 1);

          case GraphType of
            gtBitmap:
              Image1.Picture.Bitmap.LoadFromStream(Stream);
            gtIcon:
              Image1.Picture.Icon.LoadFromStream(Stream);
            gtMetafile:
              Image1.Picture.Metafile.LoadFromStream(Stream);
            gtJpeg:
            begin
              Jpg := TJpegImage.Create;
              try
                Jpg.LoadFromStream(Stream);
                Image1.Picture.Assign(Jpg);
              finally
                Jpg.Free;
              end;
            end else
              Image1.Picture.Assign(nil);
            end;
          end else
            Image1.Picture.Assign(nil);
      except
        on e: Exception do
        begin
          Image1.Picture.Assign(nil);
          raise;
        end
      end;
  finally
    Stream.Free;
  end;
end;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
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


La franja horaria es GMT +2. Ahora son las 11:07:09.


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