Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   mostrar una imagen en un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=38134)

adebonis 04-12-2006 18:44:42

mostrar una imagen en un DBGrid
 
Hola.

¿Alguien sabe cómo mostrar una imagen (.bmp) en un DBGrid según el valor True/False de un campo?

Uso Delphi 5.

Gracias.
Adolfo Bonis
Barcelona

luisgutierrezb 04-12-2006 18:55:29

pues puedes hacer un campo calculado y asignarle el bmp segun la opcion y ya solo necesitarias un dbgrid que muestre imagenes, el de los JEDI lo hace, entre otros

roman 04-12-2006 19:35:30

Te pongo un ejemplo usando un DBGrid normal. Este es el evento OnDrawColumnCell del DBGrid:

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(
  Sender: TObject; const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
var
  Bmp: TBitmap;
  L, T: Integer;

begin
  // Si es la columna donde deseas poner la imagen...
  if DataCol = 4 then
  begin
    // Seleccionas la imagen a usar según el valor del campo
    if Table1.FieldByName('campo').AsBoolean then
      Bmp := BitmapSi
    else
      Bmp := BitmapNo;

    // Calculas las coordenadas para que la imagen quede centrada en la celda
    L := Rect.Left + (Rect.Right - Rect.Left - Bmp.Width) div 2;
    T := Rect.Top + (Rect.Bottom - Rect.Top - Bmp.Height) div 2;

    // Dibujas la imagen
    DBGrid1.Canvas.Draw(L, T, Bmp);
  end
  else
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Aquí, BitmapSi y BitmapNo serían dos TBitmap creados al inicio con las imágenes que quieras:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  BitmapSi := TBitmap.Create;
  BitmapSi.LoadFromFile('SI.bmp');

  BitmapNo := TBitmap.Create;
  BitmapNo.LoadFromFile('NO.bmp');
end;

y destruidos al final

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  BitmapSi.Free;
  BitmapNo.Free;
end;

// Saludos

adebonis 04-12-2006 20:40:44

Hola roman.

Va perfecto, pero lo que me pasa es que la imagen se me muestra por encima del texto /True o False.

¿Sabes si hay un sistema para que no se me vea el texto por debajo de la imagen?

Gracias

Adolfo Bonis
Barcelona.

roman 04-12-2006 20:44:26

Si pusiste el código tal cual, creo entonces que lo que faltaría es poner la propiedad DefaultDrawing del DGrid en false.

// Saludos

roman 04-12-2006 21:03:14

Ya he comprobado que eso es lo que faltaba.

Por cierto, la columna sobre la que dibujas no necesariamente debe corresponder a la de un campo. Me explico: si usas el editor de columnas del DBGrid, puedes agregar columnas que no estén asociadas a ningún campo y dibujar sobre ella. De hecho eso fue lo que hice antes y por ello no me había percatado de la sobrescritura. Pero el caso es que haciendo esto puedes preservar el campo original true/false, además de la nueva columna.

// Saludos

adebonis 04-12-2006 21:20:12

Hola.

Cierto, me faltaba poner DefaultDrawing en false.

Ya sé que soy puntilloso, pero ahora el color de fondo de la fila no me aparece en la columna donde he dibujado la imagen.

Gracias otra vez.
Adolfo Bonis
Barcelona

roman 04-12-2006 21:41:29

Está bien que seas puntilloso. Si te refieres al color de la selección, prueba poniendo esta modificación al principio del evento:

Código Delphi [-]
  // Si es la columna donde deseas poner la imagen...
  if DataCol = 4 then
  begin
    // Si la celda está seleccionada, escoger el color de selección del sistema
    if gdSelected in State then
      DBGrid1.Canvas.Brush.Color := clHighlight;

    // Dibujar el fondo
    DBGrid1.Canvas.FillRect(Rect);

    // Seleccionas la imagen a usar según el valor del campo
    if Table1.FieldByName('campo').AsBoolean then
      Bmp := BitmapSi
    else
      Bmp := BitmapNo;

    // Calculas las coordenadas para que la imagen quede centrada en la celda
    L := Rect.Left + (Rect.Right - Rect.Left - Bmp.Width) div 2;
    T := Rect.Top + (Rect.Bottom - Rect.Top - Bmp.Height) div 2;

    // Dibujas la imagen
    DBGrid1.Canvas.Draw(L, T, Bmp);
  end
  else
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

// Saludos

adebonis 05-12-2006 05:56:50

Hola.

Ya está solucionado. Este es el código final. La imagen la saco de un ImageList.

Código Delphi [-]
  with Sender as TDBGrid do begin
    if (gdSelected in State) or (gdFocused in State) then begin
      Canvas.Font.Color := clBlack;
      Canvas.Brush.Color := ColorLin;
    end;
    if DataCol = 5 then begin
      if (gdSelected in State) or (gdFocused in State) then begin
        Canvas.Font.Color := clBlack;
        Canvas.Brush.Color := ColorLin;
        end
      else
        Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      if Table1.FieldByName('DOC').AsBoolean then begin
        Canvas.FillRect(Rect);
        L := Rect.Left + (Rect.Right - Rect.Left - ImageList1.Width) div 2;
        T := Rect.Top + (Rect.Bottom - Rect.Top - ImageList1.Height) div 2;
        Imagelist1.Draw(Canvas, L, T, 60);
      end;
      end
    else
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;

Gracias román.
Saludos.

Adolfo Bonis Mora
Barcelona

anubis 24-09-2012 22:26:24

Perdonad que recupere este post pero no me funciona como quiero, si aparece la imagen no aparece el contenido del campo.

Queria conseguir algo parecido a esto:



Porque el código que se usa en la pagina:
http://delphi.about.com/library/weekly/aa032205a.htm

ya lo aplique pero me da error de ejecucion en el imgindex.

alguna sugerencia?

Casimiro Notevi 24-09-2012 23:11:46

Cita:

Empezado por anubis (Mensaje 444132)
Porque el código que se usa en la pagina:
http://delphi.about.com/library/weekly/aa032205a.htm

ya lo aplique pero me da error de ejecucion en el imgindex.

alguna sugerencia?

Sí, que pongas tu código y que nos copies el error ;)

anubis 25-09-2012 13:25:18

Gracias, ya me funciona el código de adebonis de esa forma.

Casimiro Notevi 25-09-2012 13:33:00

Estupendo ^\||/


La franja horaria es GMT +2. Ahora son las 21:12:31.

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