我正在寻找建议的解决方案来设置由OnGetValue调用绘制的TGrid单元格(称为在视图中绘制单元格).对于背景,Mike的出色反应展示了如何在创建单元格时简单地应用tAlign属性;但我的下一个挑战是着色细胞内容.
目标是更改我将要返回的值的单元格属性(字体,样式,颜色等…)作为单元格“值”.在下面的例子中;它会将样式应用于正在返回的OnGetValue“value”.很可能我们必须通过FM样式表来做到这一点;或者我们可以直接获得TText属性吗?理想情况下,两种情况都很好 – 但在这个阶段我会采取任何解决方案……(; – >
unit Unit1; interface uses System.SysUtils,System.Types,System.UITypes,System.Classes,System.Variants,FMX.Types,FMX.Controls,FMX.Forms,FMX.Dialogs,FMX.Objects,FMX.Grid,FMX.Layouts,FMX.Edit; type TForm1 = class(TForm) Grid1: TGrid; Button1: TButton; StyleBook1: TStyleBook; procedure Grid1GetValue(Sender: TObject; const Col,Row: Integer; var Value: Variant); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TStringColNum = class(TStringColumn) private function CreateCellControl: TStyledControl; override; published end; var Form1: TForm1; implementation {$R *.fmx} function TStringColNum.CreateCellControl: TStyledControl; begin Result:=TTextCell.Create(Self); TTextCell(Result).TextAlign := TTextAlign.taTrailing; end; procedure TForm1.Button1Click(Sender: TObject); begin Grid1.AddObject(TStringColumn.Create(Self)); Grid1.AddObject(TStringColNum.Create(Self)); // Right Aligned column? Grid1.RowCount:=5000; Grid1.ShowScrollBars:=True; end; procedure TForm1.Grid1GetValue(Sender: TObject; const Col,Row: Integer; var Value: Variant); begin if Col=0 then Value:='Row '+IntToStr(Row); if Col=1 then Value := 'Row '+IntToStr(Row); // Apply style based on value ? end; end.
提前谢谢了,
伊恩.
解决方法
首先是道歉.在我对你上一个问题的回答中,CreateCellControl应该调用inherited来创建单元格.我修改了我的答案.
至于这个问题,我已经在FireMonkey Cells上发布了我的博客文章 – http://monkeystyler.com/blog/entry/firemonkey-grid-basics-custom-cells-and-columns – 它涵盖了上一个答案的内容,还包括创建自定义单元格控件.在继续之前,您需要阅读它.我会等.
…
回来了?好.
除此之外,我已经更新了TFinancialCell以直接从TTextCell继承(当然这是一个TEdit),这更有意义,而且风格更简单.
所以,更新TFinancialCell:
type TFinancialCell = class(TTextCell) private FIsNegative: Boolean; FIsImportant: Boolean; protected procedure SetData(const Value: Variant); override; procedure ApplyStyle;override; procedure ApplyStyling; public constructor Create(AOwner: TComponent); override; published property IsNegative: Boolean read FIsNegative; property IsImportant: Boolean read FIsImportant; end;
上述代码:
procedure TFinancialCell.ApplyStyle; var T: TFMXObject; begin inherited; ApplyStyling; end; procedure TFinancialCell.ApplyStyling; begin if IsNegative then FontFill.Color := claRed else FontFill.Color := claBlack; Font.Style := [TFontStyle.fsItalic]; if IsImportant then Font.Style := [TFontStyle.fsBold] else Font.Style := []; if Assigned(Font.OnChanged) then Font.OnChanged(Font); Repaint; end; constructor TFinancialCell.Create(AOwner: TComponent); begin inherited; TextAlign := TTextAlign.taTrailing; end; procedure TFinancialCell.SetData(const Value: Variant); var F: Single; O: TFMXObject; S: String; begin S := Value; FIsImportant := S[1] = '#'; if IsImportant then S := Copy(Value,2,MaxInt) else S := Value; F := StrToFloat(S); inherited SetData(Format('%m',[F])); FIsNegative := F < 0; ApplyStyling; end;
最后,更新GetValue事件处理程序:
procedure TForm1.Grid1GetValue(Sender: TObject; const Col,Row: Integer; var Value: Variant); var Cell: TStyledControl; begin if Col = 0 then Value := Row else if Col = 1 then begin Value := FloatToStr(Data[Row]); if Value > 30 then Value := '#'+Value; end; end;