Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Mostra Blob como imagen (https://www.clubdelphi.com/foros/showthread.php?t=44076)

MaMu 28-05-2007 15:40:00

Mostra Blob como imagen
 
Tengo una tabla access a donde le cargue imagenes en un campo blob sin problemas. Pero como puedo hacer para que cuando cargo la tabla en un DBGrid, me visualice directamente la imagen y no que me figure [BLOB] en dicho campo.

Alguien me puede dar una mano?

Saludos y Gracias

lucero_chivas 28-05-2007 19:48:17

Bueno, lo que yo hago es quitar la columna de imagen del Grid y creo aparte un DBImage..... el cual lo ligo con el campo de la tabla donde esta guardada la imagen....

No se si te sirva o era algo diferente lo q buscabas

MaMu 28-05-2007 21:21:07

En realidad lo que quiero es mostrar la imagen dentro de la misma celda, son bmp no mas grandes que un icono. Haciendolo como me sugeris, me funciona, ya lo habia probado, utilizando un DBControlGrid tambien, pero lo que quiciera es poder pintar la imagen dentro de la misma celda u otra cualquira.

Saludos

MaMu 29-05-2007 06:11:08

Hice esto, pero no me dibuja la imagen adentro de la celda, y no se por que me sale este error

Código Delphi [-]
[Warning] Unit2.pas(824): Variable 'icono' might not have been initialized

El cual solucione, cambiando a FALSE el DefaultDrawing del DBGrid, pero aun asi no me dibuja la imagen dentro de la celada

Código Delphi [-]
procedure TFormSubclases.DBGrid1DrawDataCell(Sender: TObject;
  const Rect: TRect; Field: TField; State: TGridDrawState);
var icono: TBitmap;
begin
if Field.Name = 'Icono' then
begin
  try
   icono:= Tbitmap.Create;
   icono.Assign(TBlobField(Field));
   (Sender as TDBGrid).Canvas.FillRect(Rect);
   (Sender as TDBGrid).Canvas.Draw(Rect.left+3,Rect.Top+1, icono);
  finally
    icono.free;
  end;
end
else
    (Sender as TDBGrid).DefaultDrawDataCell(Rect, Field, State);
end;

Saludos

casacham 30-05-2007 02:40:16

Es el tema mas preguntado del foro
 
Lee tu respuesta en este hilo --> http://www.clubdelphi.com/foros/showthread.php?t=41768

MaMu 30-05-2007 06:41:55

Cita:

Empezado por casacham

Lo lei detenidamente, pero la solucion que me ofrece no es la que busco, ya que yo poniendo un DBImage o un Timage linkado al campo blob, visualizo la imagen sin problema alguno. Lo que yo quiero es pintar esa imagen en una celda del DBGrid donde se visualizan los registros, sin necesidad de tener que poner un DBImage o un Timage.

Saludos

roman 30-05-2007 08:29:18

Acabo de probar tu código practicamente sin modificaciones y me ha funcionado bien. La única diferencia sería en la comparación:

Código Delphi [-]
if Field.Name = 'Icono' then

que yo pongo como

Código Delphi [-]
if Field.FieldName = 'Icono' then

Name es el nombre de la componente TField y no el nombre del campo. Así que yo creo que el único problema es ése, la condición nunca se cumple de manera que todo se dibuja tal cual.

// Saludos

MaMu 31-05-2007 04:49:08

Roman, yo lo acabo de probar otra vez, y no me dibuja nada, de hecho ni siquiera me muestra los demas datos, y me vuelve a salir que la variable icono no puede inicializarse. No se que puede ser, que estoy haciendo mal.

La imagen la cargo asi

Código Delphi [-]
procedure TLocal.Button1Click(Sender: TObject);
var
  MS : TMemoryStream;
begin
MS := TMemoryStream.Create;
  MS.LoadFromFile('c:\a.bmp');
     SQL.SQL.Clear;
    SQL.SQL.Add('INSERT INTO unidades (icono) VALUES(:PFOTO)');
    SQL.Parameters.ParamByName('PFOTO').LoadFromStream(MS,ftBlob);
    // o bien (pruebo ambas, creo que no hay diferencia pero por si acaso)
    //  SQL.ParamByName('PFOTO').LoadFromStream(MS,ftBlob);
    SQl.ExecSQL;
    MS.Free;
    QUnidades.Close;
    Qunidades.Open;
end; // del procedure

y el procedimiento para que se dibujen es este

Código Delphi [-]
procedure TLocal.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var icono: TBitmap;
begin
if Field.FieldName = 'Icono' then
begin
  try
   icono:= Tbitmap.Create;
   icono.Assign(TBlobField(Field));
   (Sender as TDBGrid).Canvas.FillRect(Rect);
   (Sender as TDBGrid).Canvas.Draw(Rect.left+3,Rect.Top+1, icono);
  finally
    icono.free;
  end;
end
else
    (Sender as TDBGrid).DefaultDrawDataCell(Rect, Field, State);
end;

Pero ni se dibuja la imagen en la celda, ni me muestra los datos de cualquier otro campo. La propiedad DefaultDrawing esta en False. Pero me sigue saliendo:

Código Delphi [-]
[Warning] Unit2.pas(824): Variable 'icono' might not have been initialized

Porque??, lo que pienso es que al no coincidir el FieldName, no se crea, por lo que tampoco puede destruirse, a lo que voy, es porque? si en mi tabla tengo el campo icono como ObjetoOLE, y me figura como BLOB.

Saludos

MaMu 31-05-2007 21:36:57

Volvi a hacer todo de nuevo, y me sigue sin funcionar, como hiciste para que te funcionara? me podrias poner algo de codigo? tal vez asi me de cuenta.

Saludos


La franja horaria es GMT +2. Ahora son las 22:35:54.

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