Search code examples
delphidelphi-2010dbgrid

how to color DBGrid special cell?


I have a column which have only "yes" and "no" values. I want if column value is "yes" then only that cell background color is red else "no" then background color is yellow but this code colors whole row :

if ADOTable1.FieldByName('Clubs').AsString = 'yes' then
begin
  DBGrid1.Canvas.Brush.Color := clRed;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

EDIT

Thanks for your replies. My real code look like that. The "netice" column only have "L, D, W,".

if Column.FieldName = 'netice' then
 begin
 if ADOTable1.FieldByName('netice').AsString = 'L' then
 DBGrid1.Canvas.Brush.Color := clgreen ;
 if ADOTable1.FieldByName('netice').AsString = 'D' then
 DBGrid1.Canvas.Brush.Color := clRed ;
 if ADOTable1.FieldByName('netice').AsString = 'W' then
 DBGrid1.Canvas.Brush.Color := clYellow ;
 end;
 DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 end;

but I need L--green, D--red, W--yellow I am using Delphi 2010.

enter image description here


Solution

  • You need to add a condition to restrict changing of the brush color only to the column of your choice. In code it could be:

    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
      Field: TField;
    begin
      // store the currently rendered cell's column assigned field reference
      // (if any) to the local variable (there's quite expensive getter)
      Field := Column.Field;
      // if the rendered cell's column has assigned a field and this field's
      // name is 'Clubs' (compared without case sensitivity), then, and only
      // then change the brush color...
      if Assigned(Field) and SameText(Field.FieldName, 'Clubs') then
      begin
        if Field.AsString = 'yes' then
          DBGrid1.Canvas.Brush.Color := clRed
        else
          DBGrid1.Canvas.Brush.Color := clYellow;
      end;
      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
    

    I'd prefer this before Column.FieldName because Column.FieldName does not yet guarantee that there is such field in the linked dataset. Accessing the field directly is therefore safer in this manner.