FMX StringGrid 列 Header 背景

FMX StringGrid Column Header Background

已解决: 我正在尝试使用 onDrawColumnHeader 在 FMX StringGrid 上更改列 header 的背景颜色。我可以更改列 header 颜色,但我丢失了 Header 文本和 Header 网格线。

更改列标题背景颜色以便我仍能看到文本和网格线的正确方法是什么?

这是我使用的代码:

procedure TfrmCustomers.GridDrawColumnHeader(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF);
begin
  //Exit;
  Canvas.Fill.Kind := TBrushKind.Solid;
  Canvas.Fill.Color := TAlphaColors.LightBlue;
  Canvas.FillRect(Bounds,1);
end;

object lytGrid: TLayout
  Align = Client
  Padding.Left = 2.000000000000000000
  Padding.Top = 2.000000000000000000
  Padding.Right = 2.000000000000000000
  Padding.Bottom = 2.000000000000000000
  Size.Width = 640.000000000000000000
  Size.Height = 398.000000000000000000
  Size.PlatformDefault = False
  TabOrder = 2
  object Grid: TStringGrid
    Align = Client
    CanFocus = True
    ClipChildren = True
    Size.Width = 636.000000000000000000
    Size.Height = 394.000000000000000000
    Size.PlatformDefault = False
    StyleLookup = 'GridStyle1'
    TabOrder = 2
    RowCount = 55
    OnDrawColumnHeader = GridDrawColumnHeader
    Viewport.Width = 616.000000000000000000
    Viewport.Height = 353.000000000000000000
  end
end

这是浅蓝色列标题的屏幕截图:

我需要将 Canvas.Filltext 纳入流程。

这是我最终想出的代码。它有一个很好的居中列标题的小副作用。棘手的一点是弄清楚如何获取 Column Header 文本。我在这个 SO answer 中找到了一段很好的代码,它很容易理解。

procedure TfrmCustomers.GridDrawColumnHeader(Sender: TObject; const Canvas: TCanvas;
const Column: TColumn; const Bounds: TRectF);
var
   R : TRectF;
begin
    R := Bounds;
    Canvas.Fill.Kind := TBrushKind.Solid;
    Canvas.Fill.Color := TAlphaColorRec.Dimgray;
    Canvas.FillRect(R,1);
    R.Inflate(0,0,-0.25,-0.25);
    Canvas.Fill.Color := TAlphaColorRec.Whitesmoke;
    Canvas.FillRect(R,1);
    Canvas.Fill.Color := TAlphaColors.Black;
    Canvas.Font.Style := [TFontStyle.fsBold];
    Canvas.FillText(Bounds,Grid.ColumnByIndex(Column.Index).Header,False,1,[],TTextAlign.Center,TTextAlign.Center);
   end;

第一个 FillRect 绘制整个单元格 Dimgray。第二个 FillRect 将单元格 WhiteSmoke 稍微扭曲一下。在调用 FillRect 之前,RectF 在右侧和底部边缘略微缩小。这让来自第一个 RectF 的 Dimgray 的一小部分充当边界。