带有实时绑定的firemonkey移动网格 - 在运行时XE5更改TextCell文本颜色



我需要将我的货币单元格放在网格上以显示当地货币符号,右对齐并以红色显示负数。

与类似的帖子不同,我正在使用实时绑定从数据集中填充我的 TGrid。其他解决方案建议从 TStringCell 中对网格的"TFinancialCell"进行子类化,这在使用实时绑定时很困难。

对于实时绑定,绑定管理器

控制网格列和单元格的创建,因此对绑定管理器(和其他相关类)进行子类化可能既不实用也不优雅。

在搞砸了更多之后,我找到了解决我问题的解决方案

货币符号是通过使用数据集字段的 OnGetText 事件返回格式化字符串来获取的:

procedure FDTableMyCurrFieldGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  DisplayText := True;
  Text := FloatToStrF(Sender.AsCurrency, ffCurrency, 18, 2);
end;

我本可以在 Grid OnPainting 事件中执行此操作,但这样做会格式化所有链接控件以及网格的字段。我使用"Sender"而不是"FDTableMyCurrField"来引用字段,以便我可以将数据集中所有其他货币字段的 OnGetText 事件指向此方法。

其余的格式设置在网格中完成。网格的单元格没有显式公开,但你可以像这样访问它们"TTextCell(Grid1.Columns[I]。儿童[J])"。使用 Grid OnPainting 事件在绘制单元格之前设置单元格的格式。

通过设置网格中单元格的对齐方式来实现右对齐。

单元格文本颜色是使用样式设置的。我们需要在我们的应用程序样本中创建一个"textcellnegativestyle"。这将与默认的"文本单元格样式"相同,只是"前景"画笔颜色将为红色。在桌面应用程序上,您可以将 TEdit 放在应用程序上,右键单击它并选择"编辑自定义样式..."然后根据"编辑样式"将自定义样式命名为"textcellnegativestyle",但只需将前景色画笔颜色更改为红色即可。

Mine是一个移动应用程序,由于这个原因,"编辑自定义样式"不会出现在Delphi表单编辑器弹出菜单选项上。要添加自定义样式,您必须使用记事本或某些文本编辑器编辑(副本).style 文件。

  1. 复制/粘贴"文本单元格样式"对象
  2. 将粘贴对象的名称编辑为"文本单元格负样式"
  3. 将"前景"画笔颜色更改为红色。
  4. 将编辑后的文件加载到应用程序样本中。

以下是它在我的 .style 文件中的外观:

  object TLayout
    StyleName = 'textcellnegativestyle'
    DesignVisible = False
    Height = 50.000000000000000000
    Width = 50.000000000000000000
    object TLayout
      StyleName = 'content'
      Align = alContents
      Locked = True
      Height = 42.000000000000000000
      Margins.Left = 4.000000000000000000
      Margins.Top = 4.000000000000000000
      Margins.Right = 4.000000000000000000
      Margins.Bottom = 4.000000000000000000
      Width = 42.000000000000000000
    end
    object TBrushObject
      StyleName = 'foreground'
      Brush.Color = claRed
    end
    object TBrushObject
      StyleName = 'selection'
      Brush.Color = x7F72B6E6
    end
    object TFontObject
      StyleName = 'font'
    end
  end

我使用 Grid OnPainting 事件来设置单元格对齐方式和样式。 这是我的工作解决方案:

procedure TFormMain.Grid1Painting(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  I, J: Integer;
  T: TTextCell;
begin
  // my Column 0 is text, all other columns are money in this example
  for I := 1 to Grid1.ColumnCount - 1 do
    for J := 0 to Grid1.Columns[I].ChildrenCount- 1 do
    begin
      T := TTextCell(Grid1.Columns[I].Children[J]);
      // set the Cell text alignment to right align
      T.TextAlign := TTextAlign.taTrailing;
      // test the Cell string for a negative value
      if (T.Text[1] = '-') then
      begin
        // remove the leading minus sign
        T.Text := Copy(T.Text, 2, Length(T.Text) - 1);
        // set the font to red using the style
        T.StyleLookup := 'textcellnegativestyle';
      end
      else T.StyleLookup := 'textcellstyle';
    end;
end;

最新更新