Ver Mensaje Individual
  #9  
Antiguo 08-08-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Reputación: 19
JoAnCa Va por buen camino
Cool cambiar el color de una fila del dbgrid

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:


Código Delphi [-]
  private
    { Private declarations }
    UnColor:TColor;


-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 
  {Si es la primera columna, calculamos el color}
  {UnColor debe estar declarada global a la form}
 
  {If it is the first column, we calculate the color}
  {UnColor should be declared as global to the form}
  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 
  {Si es la primera columna, calculamos el color}
  {UnColor debe estar declarada global a la form}
 
  {If it is the first column, we calculate the color}
  {UnColor should be declared as global to the form}
  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;
 
    //Esta línea es nueva
 
    dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;

Así conservamos el formato y alineación del texto que había antes.
Responder Con Cita