PDA

Ver la Versión Completa : Mostra Blob como imagen


MaMu
28-05-2007, 15:40:00
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


[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


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
Lee tu respuesta en este hilo --> http://www.clubdelphi.com/foros/showthread.php?t=41768

MaMu
30-05-2007, 06:41:55
Lee tu respuesta en este hilo --> http://www.clubdelphi.com/foros/showthread.php?t=41768

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:


if Field.Name = 'Icono' then


que yo pongo como


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


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


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:

[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