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

如何获取TDBGrid控件的默认高亮颜色?

解决TDBGrid自定义绘制时获取默认高亮颜色的问题

针对你遇到的情况,最可靠的方式是通过**类助手(Class Helper)**来访问TDBGrid的保护成员DrawCellHighlight,直接复用控件原生的高亮绘制逻辑,这样既能保留你喜欢的默认高亮效果,又不用手动去获取颜色值(毕竟原生逻辑会自动适配系统主题、设置等)。

具体实现步骤:

  1. 编写TDBGrid类助手,暴露保护的DrawCellHighlight方法:
type
  TDBGridHelper = class helper for TDBGrid
  public
    procedure DrawDefaultHighlight(ACanvas: TCanvas; ARect: TRect; AState: TGridDrawState);
  end;

procedure TDBGridHelper.DrawDefaultHighlight(ACanvas: TCanvas; ARect: TRect; AState: TGridDrawState);
begin
  // 直接调用原生的保护方法
  inherited DrawCellHighlight(ACanvas, ARect, AState);
end;
  1. 在OnDrawColumnCell事件中处理绘制逻辑:
    假设你的TDBGrid已经设置了ReadOnly=True、Options.dgRowSelect=True、DefaultDrawing=False,在绘制事件里这样写:
procedure TYourForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Grid: TDBGrid;
begin
  Grid := Sender as TDBGrid;

  // 处理选中单元格的高亮
  if gdSelected in State then
  begin
    if Grid.Focused then
    begin
      // 有焦点时,调用原生高亮绘制
      Grid.DrawDefaultHighlight(Grid.Canvas, Rect, State);
    end
    else
    begin
      // 无焦点时自定义高亮颜色(比如浅灰色)
      Grid.Canvas.Brush.Color := $00E0E0E0;
      Grid.Canvas.FillRect(Rect);
    end;
  end
  else
  begin
    // 未选中单元格的背景绘制
    Grid.Canvas.Brush.Color := Grid.Color;
    Grid.Canvas.FillRect(Rect);
  end;

  // 绘制单元格文本(按需调整位置和样式)
  Grid.Canvas.Font.Color := IfThen(gdSelected in State, 
    IfThen(Grid.Focused, clHighlightText, clGrayText), Grid.Font.Color);
  Grid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.AsString);

  // 绘制单元格边框(可选,还原原生边框效果)
  Grid.Canvas.Pen.Color := clSilver;
  Grid.Canvas.Rectangle(Rect);
end;

为什么用类助手?

TDBGrid的DrawCellHighlight是保护成员,类助手是Delphi中访问保护成员的合法方式,不用修改VCL源码或继承重写整个控件,代码更轻量且能完美保留原生的高亮逻辑(包括系统主题、颜色设置的适配)。

如果一定要单独获取默认高亮颜色,也可以通过类助手扩展一个方法来捕获:

function TDBGridHelper.GetDefaultHighlightColor: TColor;
var
  TempCanvas: TCanvas;
  TempRect: TRect;
begin
  TempCanvas := TCanvas.Create;
  try
    TempCanvas.Handle := Self.Canvas.Handle;
    TempRect := Rect(0, 0, 1, 1);
    // 调用原生方法让它设置Brush颜色
    inherited DrawCellHighlight(TempCanvas, TempRect, [gdSelected, gdFocused]);
    Result := TempCanvas.Brush.Color;
  finally
    TempCanvas.Free;
  end;
end;

然后在需要的地方调用Grid.GetDefaultHighlightColor即可拿到颜色值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:32:45