Puedes consultar el truco 411 de Trucomania (cambiar el color de una fila) y tambien el 61, para las columnas
No obstante, te lo copio para adelantarte algo
En este otro, cambiaremos el color de una fila entera, es decir, de un registro entero (un registro o los que cumplan una determinada condición).
El asunto es conseguir que la comparacion de si se trata de un registro a mostrar de otro color, no se realice una vez por cada campo de cada
registro, sino una vez por registro, ganando así en velocidad.
Para ello, calcularemos el color con el que pintaremos el registro en una sóla de las columnas del DBGrid, usando este color calculado en el resto
de las columnas.
¿Para que sirve esto?, por ejemplo, imaginate una lista de clientes mostrada en un DBGrid... podriamos marcar en rojo aquellos clientes que nos
deban dinero...
Vamos con un ejemplo:
Usaremos la tabla Animals.DBF de las demos de Delphi:
-Pon una Tabla y asociala a la tabla Animals.DBF de las demos de Delphi
-Pon un Datasouce asociado a la tabla
-Pon un DBGrid (DBGrid1) asociado al DataSource
-Declara una variavle TColor en el private de la form:
-Mete este código en el evento OnDrawColumnCell de DBGrid1:
Código Delphi
[-]procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataCol=0 then
if Table1Size.AsInteger>10
then UnColor:=clRed
else UnColor:=clBlack;
with (Sender As TDBGrid).Canvas do
begin
Font.Color:=UnColor;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Column.Field.AsString);
end;
end;
Una mejora para que funciona aunque hagan scroll de las columnas:
Código Delphi
[-]procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataCol=TStringGrid(Sender).LeftCol-1 then
if Table1Size.AsInteger>10
then UnColor:=clRed
else UnColor:=clBlack;
with (Sender As TDBGrid).Canvas do
begin
Font.Color:=UnColor;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Column.Field.AsString);
end;
end;
Enviado por: Santy Concepción (SANTYCG@terra.es)
Te envío una mejora para el truco [411] de TrucoManía Mostrar de otro color una FILA de un DBGrid
Con los trucos anteriores, el formato y la alineación del texto de las celdas se perdía...
Pero con este método lo conservamos y el resultado es increíble.
Código Delphi
[-]procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
if Column.Field.Dataset.FieldbyName('CANTIDAD').AsInteger < 5
then
if (gdFocused in State)
then dbgrid1.canvas.brush.color := clBlack
else dbgrid1.canvas.brush.color := clPaleGreen;
dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;
Así conservamos el formato y alineación del texto que había antes.