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

标签 delphi colors dbgrid

我正在使用 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;

关于delphi - DBGrid - 如何设置单独的背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57267946/

相关文章:

c# - Delphi DLL 可以在 C# 中调用和使用吗?

delphi - Delphi 中通用持有记录的等于运算符

c - OpenCV 获取/设置 IplImage RGB 值

android - 在 XML 中更改 Spinner 下拉箭头的颜色

delphi - 从 DrawColumnCell 中的前一行获取值

delphi - TThread 不释放句柄

delphi - Delphi 中的 COM 方法偏移量

vim LineNr 和 CursorLine 颜色配置更改

delphi - 如何检测 DBGrid 或 ClientDataset 中的用户在运行时删除了单元格中的数据?

database - 如何强制更新数据库网格?