Ir al contenido



Foto

Mostrando imágenes PNG en una celda del DBGrid


  • Por favor identifícate para responder
15 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 19 abril 2015 - 01:15

Pues eso tengo problemas para mostrar una imagen en un campo Blob en una celda del DBGrid, tengo el siguiente código:


delphi
  1. procedure TFJugador.dbgTorneosDrawDataCell(Sender: TObject; const Rect: TRect;
  2.   Field: TField; State: TGridDrawState);
  3. var
  4.   Bmp: TPngImage;
  5. begin
  6.   if Field is TGraphicField then
  7.   begin
  8.     try
  9.       Bmp := TPngImage.Create;
  10.       Bmp.Assign(Field);
  11.       dbgTorneos.Canvas.StretchDraw(Rect, Bmp);
  12.     finally
  13.       Bmp.Free;
  14.     end
  15.   end
  16.   else
  17.     dbgTorneos.DefaultDrawDataCell(Rect,Field,State);
  18. end;

No me funciona, en la celda aún se muestra con el texto (GRAPHIC). hay alguna otra manera de hacerlo?.

Estoy trabajando con Delphi XE2 y Firebird 2.5.

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.019 mensajes
  • LocationMéxico

Escrito 19 abril 2015 - 04:38

Y porque no usas un TImage incrustado en el DBGrid, a ver si te sirve ésto

 

http://www.swissdelp...ode.php?id=2209

 

Saludos


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.878 mensajes
  • LocationMadrid - España

Escrito 20 abril 2015 - 01:38

¿Tienes algún error de compilación?

 

En principio debería funcionar siempre que Field represente una imagen válida para ser asignada a tu TPngImage. Yo indagaría en esa parte del código.

 

 

Saludos.


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 abril 2015 - 06:21

Pues no me da error alguno, revisaré más a fondo.

Saludos.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 21 abril 2015 - 04:46

Lamentablemente sólo lo pude resolver con el método de Zarko Gajic en su artículo Drawing an image in a cell of a Delphi DBGrid

 

Saludos.


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.878 mensajes
  • LocationMadrid - España

Escrito 21 abril 2015 - 04:53

¿Has usado un TImageList para guardar todas las imágenes de tu base de datos? :|

 

 

Saludos.


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 21 abril 2015 - 05:02

¿Has usado un TImageList para guardar todas las imágenes de tu base de datos? :|

 

 

Saludos.

 

jaja no amigo, solo tiene 7 imagenes, pero me hubiese gustado hacerlo sin el imagelist sino directamente de la BD.


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.878 mensajes
  • LocationMadrid - España

Escrito 21 abril 2015 - 05:07

¿Si de la DB pasas las imágenes a un TImageList, por qué no a un TBitmap directamente?. Yo lo hice así cuando probé, solo que de imágenes desde archivos de disco...

 

 

Saludos.


  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 21 abril 2015 - 05:14

No las cargo desde la BD sino desde el disco al TimageList. sólo que el efecto no es lo que quería.

 

saludos.


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.878 mensajes
  • LocationMadrid - España

Escrito 21 abril 2015 - 05:16

Entonces interpreté mal lo que buscabas, pero ¿qué efecto querías?

 

Saludos.


  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 21 abril 2015 - 05:23

Mira que mal efecto queda en al adjunto:
 

delphi
  1. procedure TFJugador.dbgTorneosDrawColumnCell(Sender: TObject; const Rect: TRect;
  2.   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. var
  4.   bitmap : TBitmap;
  5.   fixRect : TRect;
  6.   bmpWidth : integer;
  7.  
  8.   imgIndex : integer;
  9. begin
  10.   fixRect := Rect;
  11.  
  12.   if Column.Field = dsJugadores.DataSet.FieldByName('NOMBRE') then
  13.   begin
  14.     case dsJugadores.DataSet.FieldByName('JUGA_PIC').AsInteger of
  15.       0:  imgIndex := 0; //República Dominicana
  16.       1:  imgIndex := 1; //España
  17.       2:  imgIndex := 2;
  18.       3:  imgIndex := 3;
  19.       4:  imgIndex := 4;
  20.       5:  imgIndex := 5;
  21.       6:  imgIndex := 6;
  22.       7:  imgIndex := 7;
  23.     end;
  24.  
  25.     bitmap := TBitmap.Create;
  26.     try
  27.  
  28.       Banderas.GetBitmap(imgIndex,bitmap);
  29.       bmpWidth := (Rect.Bottom - Rect.Top);
  30.       fixRect.Right := Rect.Left + bmpWidth;
  31.       dbgTorneos.Canvas.StretchDraw(fixRect,bitmap);
  32.     finally
  33.       bitmap.Free;
  34.     end;
  35.  
  36.     fixRect := Rect;
  37.     fixRect.Left := fixRect.Left + bmpWidth;
  38.   end;
  39.  
  40.   dbgTorneos.DefaultDrawColumnCell(
  41.      fixRect,
  42.      DataCol,
  43.      Column,
  44.      State);
  45. end;

Archivos adjuntos


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.878 mensajes
  • LocationMadrid - España

Escrito 22 abril 2015 - 10:31

Quizás tangas que escribir tu el texto desde dbgTorneosDrawColumnCell y no ejecutar DefaultDrawColumnCell


Saludos
  • 0

#13 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 250 mensajes

Escrito 09 mayo 2015 - 10:16

Nada amigo delphius, no creo que sea tan facil, comparando mi codigo con el que estoy repasando en el link dado por escafandra

 

He añadido además,

 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  filastotales:integer;
  fixRect:TRect;
begin
fixRect := Rect;
if (column.FieldName = 'Edad') then // Comparo que columna es la que quiero pintar.
begin
  if  (Tabla.FieldByname('Edad').AsInteger > 18) then
  begin
         ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 0);
  end
  else
         ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 1);
  end;

  DBGrid1.DefaultDrawColumnCell(fixRect,DataCol,Column,State); // ni idea que hace esta método.
end;

 

Además como se puede ver no uso Bitmap:TBitmap, ni algunas variables que usan en los procedimientos varios que aparecen en el link. No se si al final será factible el codigo que uso.

 

Un saludo


  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 mayo 2015 - 05:50

Quizás tangas que escribir tu el texto desde dbgTorneosDrawColumnCell y no ejecutar DefaultDrawColumnCell


Saludos


Hice lo siguiente:
 

delphi
  1. dbgTorneos.Canvas.TextOut(Rect.Left,Rect.Top + bmpWidth, Column.Field.AsString);

No ejecuté el DefaultDrawColumnCell y el efecto se fue, pero no logro mover el texto por la izquierda, queda detrás de la imagen.

Saludos.

Archivos adjuntos


  • 0

#15 tmsanchez

tmsanchez

    Advanced Member

  • Miembros
  • PipPipPip
  • 85 mensajes

Escrito 10 mayo 2015 - 12:37

En el proyecto tmsgtracking se muestran una imagen dependiendo del estatus de la tarea y el ícono queda a la izquierda y enseguida el texto, el código fuente está disponible para descarga, probablemente te ayude en lo que necesites.
 

http://tmsanchezdev....ienta-para.html

 

principal.jpg

 

Saludos


  • 0

#16 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 250 mensajes

Escrito 11 mayo 2015 - 11:36

En mi caso estoy en la misma situación que enecumene, he probado de todo y siempre queda el texto detrás del icono.

 

Este codigo tmsanchez está en delphi? se puede visionar el codigo para ver si funciona en Lazarus?

 

Un saludo


  • 0