Jump to content


Photo

Insertar un icono en DBGrid?


  • Please log in to reply
9 replies to this topic

#1 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 09 May 2015 - 03:23 AM

Bueno como sigo luchando y practicando con las bb.dd y el DBGrid, aunque he visto más relacionadas con este tema, como un combobox para BB.DD que no se la diferencia con el combobox "normal", estoy intentando insertar un icono (o imagen) en una columna de mi pequeño DBGrid.
 
Dispongo de 2 campos (Nombre y Edad) pero comparo la Edad si > 18 si es así inserto un icono sino el otro distinto. Pero al hacer este codigo en inserta el icono determinado en las dos columnas.
 
Este mismo codigo está aplicado a un stringGrid y sí funciona correctamente.
 
De igual modo como sería posible insertar en una columna llamada "Estado" el icono determinado sin tener valor esta columna solo el icono en cuestión? Ya que la bb.dd tendrá ese campo Estado como string,integer etc... y si pretendemos
insertar solamente un gráfico.
 

delphi
  1. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  2.   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. var
  4.   filastotales:integer;
  5. begin
  6.  
  7.   if  (Tabla.FieldByname('Edad').AsInteger > 18) then
  8.   begin
  9.          ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 0);
  10.   end
  11.   else
  12.          ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 1);
  13. end;


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 09 May 2015 - 04:07 AM

Revisa este tema.

 

Saludos.


  • 0

#3 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 09 May 2015 - 05:05 AM

Gracias escafandra, me da la sensación que no se puede aplicar la misma implementación de codigo que tengo para mi StringGrid que sí funciona así, con el DBGrid. Por ello quería saber si falta codigo o por el contrario está mal aplicado los métodos del mismo.

 

Como digo si me imprime los iconos pero en ambas columnas (todas las celdas).

 

Como puedo completar mi codigo para que funcione, antes de usar el que escafandra mi indica.

 

Un saludo


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 09 May 2015 - 07:14 AM

Hola Dooper.

¡Casi lo tienes! fíjate que tu estás comparando con el Field de tu dataset (la tabla) pero no estás discriminando sobre cuál columna realmente pintar. Tu código pinta todas las columnas precisamente porque no le indica sobre cual pintar de una forma u otra.

 

Además de verificar el Field, evalúa si el Column a pintar corresponde al campo Edad.

Necesitas evaluar primero si el Column es el de la Edad. Si es, luego debes evaluar la mayoría de edad. Dependiendo de si es o no mayor pintas uno u otra cosa. Por el contrario si el campo no es el de edad en la primera evaluación directamente pintas el registro con el método de pintado por defecto llamando al método DefaultDrawnColumnCell.

 

Saludos,


  • 0

#5 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 09 May 2015 - 10:21 AM

Pues he cambiado algo de codigo pero no me parece que sea tan facil comparando el codigo que aparece en el link de escafamdra.
 
 

delphi
  1. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  2.   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. var
  4.   filastotales:integer;
  5.   fixRect:TRect;
  6. begin
  7. fixRect := Rect;
  8. if (column.FieldName = 'Edad') then  // compruebo si es la columna=edad para pintar.
  9. begin
  10.   if  (Tabla.FieldByname('Edad').AsInteger > 18) then
  11.   begin
  12.          ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 0);
  13.   end
  14.   else
  15.          ImageList1.Draw (TDBGrid(Sender).Canvas, Rect. Left+20, Rect. Top, 1);
  16.   end;
  17.  
  18.   DBGrid1.DefaultDrawColumnCell(fixRect,DataCol,Column,State); // ni idea que hace este procedimiento.
  19. end;

 
Pero no hace nada, como ves no uso las varialbes BitMapTBitmap, ni  metodo GetBitMap ni nada de eso. No se si deberé usar estas
variables y métodos o mediante el codigo que voy implementando no sacaré nada.
 
Un saludo
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 09 May 2015 - 11:59 AM

Intentelo así:

 


delphi
  1. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  2.   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. var
  4.   fixRect:TRect;
  5.   bitmap : TBitmap;
  6.   imgIndex, bmpwidth: Integer;
  7. begin
  8.     fixRect := Rect;
  9.     if column.Field = Tabla.FieldByname('Edad') then  // compruebo si es la columna=edad para pintar.
  10.     begin
  11.       if  Tabla.FieldByname('Edad').AsInteger > 18 then
  12.         imgIndex := 0
  13.       else
  14.         imgIndex := 1;
  15.  
  16.         bitmap := TBitmap.Create;
  17.         try
  18.           ImageList1.GetBitmap(imgIndex,bitmap);
  19.           bmpWidth := (Rect.Bottom - Rect.Top);
  20.           fixRect.Right := Rect.Left + bmpWidth;
  21.           DBGrid1.Canvas.StretchDraw(fixRect,bitmap);
  22.         finally
  23.           bitmap.Free;
  24.         end;
  25.     
  26.         fixRect := Rect;
  27.         fixRect.Left := fixRect.Left + bmpWidth;
  28.     end;
  29.  
  30.   DBGrid1.DefaultDrawColumnCell(fixRect,DataCol,Column,State); // ni idea que hace este procedimiento.
  31. end;


  • 0

#7 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 09 May 2015 - 03:48 PM

Ahora si funciona enecumene, pero la pregunta que me hago es porque no funciona con el codigo identico que tengo para

un Stringrid?. En el StrinGrid no uso para nada el metoo StretchDraw, imagelist.getbitmap, ni bitmap, defaultDrawColumnCell.

 

Quería unificar codigo para que fueran o variara muy poco con respecto a un strinGrid con un DBGrid1. Pero veo que no puede ser.

 

Tú tambien tenías un problema aparentemente igual en otro post que escafandra me ha indicado para dar solución a este problema, pero

claro seguía intentando buscar una solución con mi codigo.

 

Gracias

 

Un saludo


  • 0

#8 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 09 May 2015 - 10:42 PM

Volviendo al tema, acabo de darme cuenta que si el icono lo inserto en la 1º columna, no queda bien, me ocurre igual que a enecumene en su ejemplo. Te inserta dos veces el nombre junto con el icono, quedando todo sobrepuesto encima todo en la celda.

 

....

....

....

 

end;
    
        fixRect := Rect;
        fixRect.Left := fixRect.Left + 20 + bmpWidth; -> aumentando el valor aquí a 20, consigo mover un poco el nombre a la derecha de la celda

 

pero el icono y el nombre repetido aparece a la izquierda de la celda. Vamos que se repite el campo nombre dos veces junto con el icono.

 

Un saludo


  • 0

#9 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 11 May 2015 - 06:31 AM

Alguien me puede indicar como solucionar el tema de sobreescritura de contenido, ya que me ocurre igual que el problema de enecumene.

 

Un saludo


  • 0

#10 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 posts

Posted 13 May 2015 - 03:05 PM

Los iconos al isertarse en el Dbgrid se visualizan mal. Aparecen un poco más grande del tamaño 16x16 .ico y como aserrado en su contorno. Alguien puede saber a que se debe eso? Aplicado el codigo dado por enecumene.

 

Se me resiste el componente DbGrid al customizarlo un poco solamente...

 

Un saludo


  • 0




IP.Board spam blocked by CleanTalk.