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

时间:2019-07-30 09:00:10

标签: delphi colors dbgrid

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

我有一些想法 how to color DBGrid special cell? 所以我知道如何在OnDrawColumnCell中更改单元格的颜色。 我可以更改文本的背景。 但是我仍然不知道如何更改另一个单元格的颜色。 当然,这很容易,而且我对明显的事物视而不见。

1 个答案:

答案 0 :(得分: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;

如果要根据未显示的值确定单元格颜色 字段(没有网格列的字段),您只需测试该字段的值 在基础数据集中,因为逻辑数据集游标始终保持同步 当前正在绘制的单元格。例如

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