如何修改FMX TStringGrid表头线条颜色 现有代码仅生效于网格线
FMX TStringGrid 表头区域线条颜色修改方案
当前通过interposer类重写ApplyStyle方法修改LineFill的实现,仅能生效于网格数据区域的分隔线,无法修改表头线条,原因是表头区域的线条使用独立的样式资源绘制,和数据区不共用画刷。
可行实现步骤
1. 修正ApplyStyle逻辑,同步修改表头专属线条资源
原有代码存在两点问题:一是未查找表头对应的线条画刷资源,二是inherited调用顺序错误,在样式未完全加载时就查找资源会存在找不到的风险。修正后的interposer类代码如下:
type TStringGrid = class(FMX.Grid.TStringGrid) protected procedure ApplyStyle; override; end; TForm1 = class(TForm) StringGrid1: TStringGrid; StringColumn1: TStringColumn; StringColumn2: TStringColumn; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} { TStringGrid } procedure TStringGrid.ApplyStyle; var LLineFill: TBrushObject; LHeaderLineFill: TBrushObject; begin inherited; // 优先执行基类样式加载逻辑,确保所有样式资源完成初始化 // 修改数据区域网格线颜色 if FindStyleResource<TBrushObject>('LineFill', LLineFill) then LLineFill.Brush.Color := TAlphaColorRec.Orange; // 修改表头区域分隔线颜色 if FindStyleResource<TBrushObject>('HeaderLineFill', LHeaderLineFill) then LHeaderLineFill.Brush.Color := TAlphaColorRec.Orange; end;
注意:
inherited调用必须放在所有样式资源查找逻辑之前,否则基类还未完成样式加载,会出现资源查找失败、修改不生效的问题。
2. 残留灰色线条的补充处理
如果完成上述修改后,表头边缘仍有灰色线条,是因为THeaderItem使用的默认样式自带描边设置,可通过两种方式处理:
- 设计时操作:右键点击Grid选择「编辑自定义样式」,复制一份默认的HeaderItem样式副本,将样式内的描边(Stroke)颜色修改为目标颜色,再将Grid的
HeaderItemStyle属性指向自定义的新样式即可,不要直接修改全局默认样式,避免影响项目内其他控件。 - 运行时处理:在ApplyStyle方法末尾遍历Grid的表头子控件,找到对应的样式描边对象直接修改颜色。

注意事项
- 不同Delphi版本的FMX内置样式资源命名可能存在细微差异,如果找不到
HeaderLineFill资源,可以在ApplyStyle中加断点遍历StyleResources列表,确认当前版本下表头线条对应的资源名称。 - 如果需要同时修改选中状态、热区状态下的表头线条颜色,需要对应查找样式资源中状态相关的画刷对象同步修改。
内容的提问来源于stack exchange,提问作者Dave Nottage
相关产品推荐
相关产品推荐

