【问题标题】:Changing TTextCell background colour at runtime XE4在运行时更改文本单元格背景颜色 XE4
【发布时间】:2026-01-03 03:05:02
【问题描述】:

我完成了此处发布的示例作为我的起点:Change background of TTextCell in a Firemonkey TGrid

我创建了一个引用图像的 textcellstyle,它运行良好。当我运行程序时,所有单元格都按预期显示背景图像。

从上面的链接中,Mike Sutton(我希望你正在阅读这篇文章,如果没有你的意见我们会怎么做!)写道(在这里重复只是为了更容易):

“然后,您可以设置每个单元格的 StyleLookup 属性以使用它,或者将样式 StyleName 设置为 TextCellStyle 以便为每个 TTextCell 自动拾取它。”

根据关于更改字体颜色的查询 (Delphi XE4 Firemonkey Grid Control - Styling cells individually),是否也可以动态设置背景颜色?

我创建单元格的代码:

Constructor TFinancialCell.Create(AOwner:TComponent);

begin
  inherited;
  StyleLookup:='textcellstyle';
  StyledSettings:=StyledSettings-[TStyledSetting.ssStyle,TStyledSetting.ssFontColor]; 
  TextAlign:=TTextAlign.taTrailing;
end;

这会将我的图像成功应用到 TFinancialCell。

但是,根据字体颜色查询,我希望仅在达到某个值或其他任何值时才显示图像背景:

Procedure TFinancialCell.ApplyStyling;
begin
  Font.Style:=[TFontStyle.fsItalic];

  If IsNegative then
    FontColor:=claRed
  else
    FontColor:=claGreen;

  If IsImportant then Font.Style:=[TFontStyle.fsItalic,TFontStyle.fsBold]; 
  If Assigned(Font.OnChanged) then
    Font.OnChanged(Font);

  Repaint;
end;

任何有关如何执行此操作的帮助将不胜感激。

【问题讨论】:

  • 理论上,假设样式不使用位图,在 ApplyStyle 中调用 FindStyleResource('background'),它应该返回一个 TRectangle,您可以将其更改为 Fill.Color。如果失败了,我会在有时间的时候看看。

标签: delphi colors grid firemonkey


【解决方案1】:

谢谢迈克。我不得不摆弄一下,但根据你的建议让它工作。 我在stylecontainer中给我的textcellstyle添加了一个TRectangle,如下:

textcellstyle : TLayout
    background: TSubImage
        rectangle1: TRectangle
        rectanimation: TRectAnimation

在 TFinancialCell.ApplyStyle 中,我尝试了 FindStyleResource ('background'),但这总是返回 nil。我将其更改为 FindStyleResource ('rectangle1'),效果很好。这是因为它在对象检查器中查找相关的 StyleName 属性(对于矩形 1 显然默认为“Rectangle1”)?仍然没有完全看到树木的树木,我相信你可以告诉......

工作代码:

Procedure TFinancialCell.ApplyStyle;

var 
  T : TFMXObject;

begin
  inherited;

  T:=FindStyleResource('Rectangle1');

  If (T<>nil) and (T is TRectangle) then
  begin 
    If TRectangle(T).Fill<>nil then 
    begin 
      If IsNegative then 
      begin
        TRectangle(T).Fill.Color:=claRed; 
        Repaint;
      end;  
    end;
  end;

  ApplyStyling;
end;

作为一个单独的练习,我还尝试将上面的代码放在 TFinancialCell.ApplyStyling 中,它也在那里工作,所以不确定哪个是更好的选择,为什么?

到目前为止我对这些风格的理解总结是(请根据需要更正/评论):

  1. 我创建了一个名为 textcellstyle 的样式,我将其应用于 TFinancialCell.Create 到我的 TFinancialCell 类 [StyleLookup:='textcellstyle']。
  2. 当我调用 TFinancialCell.ApplyStyling 时,我可以直接访问 TFinancialCell 的 Font 和 FontColor 属性,因为这些属性是 TTextCell 的属性。
  3. 如果我想绘制单元格的背景,我必须显式调用我手动添加到 textcellstyle 'style' 的 TRectangle 组件,然后从那里访问 Fill 等属性。

【讨论】:

  • 1.它应该找到你的风格,而不需要设置 StyleLookup。如果它不调用您的样式 FinancialCellStyle。 2. 正确。 3. 我假设他们的风格已经是 TRectangle,它被称为背景。如果没有事情可能会变得复杂,例如如果您上面的 TSubImage 来自 TextCellStyle.
  • 在上面的代码中:只需测试 T 是否为 TRectangle (如果 T 为 nil 将失败);填充永远不会为零,因此无需测试;无需从ApplyStyle调用Repaint,在控件绘制之前调用。
  • 您的样式将背景显示为 TSubImage,但您说 FindStyleResource 返回 nil,这没有任何意义。如果 TSubImage 来自 TextCellStyle,我建议将其替换为 TRectangle 并将其下方的动画替换为您想要应用的任何效果。 (您可能希望 TColorAnimations 更改 Fill.Color)。
  • 嗨,迈克,谢谢。我做了你建议的代码更改(第二条评论),一切都很好。就 stylecontainer 问题而言,这些可能是我正在做的愚蠢的事情,直到现在我更专注于代码。我现在看了看,仍然有点卡在这个问题上。我想我从“editstyle”开始,并将其重命名为“textcellstyle”,所以树下的任何东西最初都属于“editstyle”。然后不知何故(通过阅读各种论坛帖子),我在“背景”树下拖动了一个 TRectangle,如上所示。这很好用....
  • ....我现在根据您的查询,尝试将矩形向上移动、重命名等,看看它有什么效果。简而言之,我可以将“背景”重命名为我喜欢的任何名称,只要“背景”是 TSubImage 并且矩形在树中的下方 - 在这种情况下一切正常。其他组合要么不产生背景或字体,要么两者兼而有之。我还没有将矩形完全移出 textcellstyle,这是你的意思吗?
最近更新 更多