Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2006
Avatar de adebonis
adebonis adebonis is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 145
Poder: 21
adebonis Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 04-12-2006
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 04-12-2006
Avatar de adebonis
adebonis adebonis is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 145
Poder: 21
adebonis Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si pusiste el código tal cual, creo entonces que lo que faltaría es poner la propiedad DefaultDrawing del DGrid en false.

// Saludos
Responder Con Cita
  #6  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 04-12-2006
Avatar de adebonis
adebonis adebonis is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 145
Poder: 21
adebonis Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #9  
Antiguo 05-12-2006
Avatar de adebonis
adebonis adebonis is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 145
Poder: 21
adebonis Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 24-09-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
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?
Responder Con Cita
  #11  
Antiguo 24-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
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
Responder Con Cita
  #12  
Antiguo 25-09-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias, ya me funciona el código de adebonis de esa forma.
Responder Con Cita
  #13  
Antiguo 25-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Estupendo
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar Imagen remota ( desde internet ) MRSAM Internet 4 30-11-2006 22:28:57
Mostrar imagen de un campo binario kiketijuana SQL 0 28-06-2006 01:20:33
Mostrar check en dbGrid Aprendiendo OOP 6 07-12-2005 21:14:51
como mostrar una imagen a base de un componente Nelly Varios 7 01-12-2005 15:50:43
Mostrar mi cursor en una imagen franc28 Varios 4 25-04-2005 19:17:39


La franja horaria es GMT +2. Ahora son las 04:29:44.


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