delphi – Firemonkey网格控件 – 基于值设置单元格样式(通过OnG
|
我正在寻找建议的解决方案来设置由OnGetValue调用绘制的TGrid单元格(称为在视图中绘制单元格).对于背景,Mike的出色反应展示了如何在创建单元格时简单地应用tAlign属性;但我的下一个挑战是着色细胞内容.
Previous posting/answer 目标是更改我将要返回的值的单元格属性(字体,样式,颜色等…)作为单元格“值”.在下面的例子中;它会将样式应用于正在返回的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;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
