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.
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.