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

时间:2013-10-28 08:16:37

标签: delphi grid firemonkey livebindings

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

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

使用Livebindings,Bind Manager控制网格列和单元格的创建,以便对Bind Manager(和其他相关类)进行子类化可能既不实用也不优雅。

1 个答案:

答案 0 :(得分:2)

我已经找到了解决问题的解决方案

通过使用数据集字段的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”来引用Field,以便我可以将我的数据集中所有其他货币字段的OnGetText事件指向此方法。

其余格式化在网格中完成。网格的单元格没有显式公开,但你可以像“TTextCell(Grid1.Columns [I] .Children [J])”那样找到它们。使用Grid OnPainting 事件在绘制之前立即格式化单元格。

通过在网格中设置Cell的对齐来实现右对齐。

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

我是一个移动应用程序,其中“编辑自定义样式”没有出现在this reason的Delphi表单编辑器弹出菜单选项中。 要添加自定义样式,您必须使用记事本或某些文本编辑器编辑.style文件(的副本)。

  1. 复制/粘贴“textcellstyle”对象
  2. 将粘贴对象的名称编辑为“textcellnegativestyle”
  3. 将“前景”笔刷颜色更改为红色。
  4. 将编辑后的文件加载到应用程序样书中。
  5. 以下是我在.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事件来设置Cells对齐和样式。这是我的工作解决方案:

    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;