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 的一小部分充当边界。
已解决: 我正在尝试使用 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 的一小部分充当边界。