You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列值修改Delphi FireMonkey TGrid的背景色

Delphi FireMonkey中基于另一列值修改TGrid背景色

要实现基于RowMod列的值修改TGrid的背景色,核心是在DrawColumnBackground事件中获取对应行的RowMod值,下面提供两种常用实现方案:

方案1:直接操作绑定的数据集

如果你的TGrid绑定了数据集(如TClientDataSet、TADODataSet),可以直接定位到对应行读取RowMod字段值:

procedure GridDrawColumnBackground(Sender: TObject; const Canvas: TCanvas; const Column: TColumn;
  const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
  OldKind: TBrushKind;
  OldColor: TAlphaColor;
  DataSet: TDataSet;
  RowModValue: Integer;
begin
  // 跳过标题行(Row=-1)
  if Row < 0 then Exit;

  // 获取网格绑定的数据集
  DataSet := (Sender as TGrid).DataSource.DataSet;
  if not Assigned(DataSet) then Exit;

  DataSet.DisableControls;
  try
    // 定位到目标行:TGrid的Row从0开始,数据集RecNo从1开始
    DataSet.RecNo := Row + 1;
    RowModValue := DataSet.FieldByName('RowMod').AsInteger;
  finally
    DataSet.EnableControls;
  end;

  if RowModValue = 1 then
  begin
    // 保存原画布填充属性
    OldKind := Canvas.Fill.Kind;
    OldColor := Canvas.Fill.Color;

    // 绘制黄色背景
    Canvas.Fill.Color := TAlphaColorRec.Yellow;
    Canvas.Fill.Kind := TBrushKind.Solid;
    Canvas.FillRect(Bounds, 0, 0, AllCorners, 1);

    // 恢复原属性
    Canvas.Fill.Color := OldColor;
    Canvas.Fill.Kind := OldKind;
  end;
end;

方案2:使用DataController(LiveBindings场景)

如果网格通过LiveBindings绑定数据源(如TBindSourceDB),使用DataController获取值更高效,无需直接操作数据集的记录指针:

procedure GridDrawColumnBackground(Sender: TObject; const Canvas: TCanvas; const Column: TColumn;
  const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
  OldKind: TBrushKind;
  OldColor: TAlphaColor;
  Grid: TGrid;
  DataController: TDataController;
  RowModColIndex: Integer;
  RowModValue: Integer;
begin
  // 跳过标题行
  if Row < 0 then Exit;

  Grid := Sender as TGrid;
  DataController := Grid.DataController;
  if not Assigned(DataController) then Exit;

  // 通过字段名获取RowMod列的索引
  RowModColIndex := DataController.GetItemIndex('RowMod');
  if RowModColIndex < 0 then Exit;

  // 获取对应行的RowMod值
  RowModValue := DataController.GetValue(RowModColIndex, Row).AsInteger;

  if RowModValue = 1 then
  begin
    OldKind := Canvas.Fill.Kind;
    OldColor := Canvas.Fill.Color;

    Canvas.Fill.Color := TAlphaColorRec.Yellow;
    Canvas.Fill.Kind := TBrushKind.Solid;
    Canvas.FillRect(Bounds, 0, 0, AllCorners, 1);

    Canvas.Fill.Color := OldColor;
    Canvas.Fill.Kind := OldKind;
  end;
end;

注意事项

  • 如果是未绑定数据集的自定义网格(如TStringGrid),可以直接通过Grid.Items[Row].Values['RowMod']获取值
  • 必须保存并恢复画布的填充属性,否则会影响网格其他元素的绘制
  • 处理时要跳过标题行(Row=-1),避免出现索引越界或数据集操作错误

内容的提问来源于stack exchange,提问作者Rick Wheeler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:55:00