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

Jen*_*ens 3 delphi colors dbgrid

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

我从如何给DBGrid特殊单元格着色中获得了一些想法 所以我知道如何在OnDrawColumnCell中更改单元格的颜色。我可以更改文本的背景。但是我仍然不知道如何更改另一个单元格的颜色。当然,这很容易,而且我对明显的事物视而不见。

Mar*_*ynA 5

下面的代码显示了如何根据同一网格行中另一列中的值更改单元格的背景色。

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;
Run Code Online (Sandbox Code Playgroud)

如果要根据未显示字段(没有网格列的字段)的值确定单元格颜色,则只需测试基础数据集中字段的值,因为逻辑数据集游标始终与当前单元格同步被吸引。例如

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