DBGrid - 如何设置单独的背景颜色?

DBGrid - How to set an individual background color?

我正在使用 Delphi 10.2.3 并且想要更改 DBgrid 的背景颜色。 例如,我有一个文本列和一个整数列。 如果值不为零,我想根据文本更改整数单元格(在同一行中)的颜色。

我从中得到了一些想法 how to color DBGrid special cell? 所以我知道如何更改 OnDrawColumnCell 中单元格的颜色。 我可以更改文本的背景。 但是我仍然没有弄清楚如何更改另一个单元格的颜色。 当然这很容易,我只是对显而易见的事情视而不见。

下面的代码显示了如何根据 同一网格行中另一列中的值。

procedure TForm1.FormCreate(Sender: TObject);
var
  AField : TField;
begin
  AField := TIntegerField.Create(Self);
  AField.FieldKind := fkData;
  AField.FieldName := 'ID';
  AField.DataSet := ClientDataSet1;

  AField := TStringField.Create(Self);
  AField.FieldKind := fkData;  // Field size defaults to 20
  AField.FieldName := 'AValue';
  AField.DataSet := ClientDataSet1;

  ClientDataSet1.CreateDataSet;
  ClientDataSet1.InsertRecord([1, 'One']);
  ClientDataSet1.InsertRecord([2, 'Two']);
  ClientDataSet1.InsertRecord([3, 'Three']);

  DBGrid1.DefaultDrawing := False;  // otherwise DBGrid1DrawColumnCell will have no effect
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.Index = 1 then begin
    if Odd(DBGrid1.Columns[0].Field.AsInteger) then
      DBGrid1.Canvas.Brush.Color := clGreen;
  end;
  DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
end;

如果您想根据未显示的值确定单元格颜色 字段(没有网格列的字段)你可以简单地测试字段的值 在底层数据集中,因为逻辑数据集游标始终同步 当前正在绘制的单元格。例如

    if Odd(DBGrid1.DataSource.DataSet.Fields[99].AsInteger) then
      DBGrid1.Canvas.Brush.Color := clGreen;