Firemonkey Grid Control-стиль ячейки на основе значения (через вызов функции OnGetValue)
Я ищу рекомендуемое решение для стиля ячейки TGrid, которая рисуется вызовом OnGetValue (который вызывается для рисования ячеек в представлении). Для фона, отличный ответ Майка, показал, как просто применить свойство tAlign при создании ячейки; но моя следующая задача-окрашивание содержимого ячейки.
цель-изменить атрибуты ячейки (шрифт, стиль, цвет и т. д...) значения I я собираюсь вернуться в качестве ячейки "Value". В приведенном ниже примере; он будет применять стиль к 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.
заранее большое спасибо, Иан.
2 ответов
во-первых, извиниться. В моем ответе на ваш последний вопрос CreateCellControl должен был вызвать inherited для создания ячейки. Я исправил свой ответ.
Что касается этого вопроса, я загрузил свою публикацию в блоге на ячейках FireMonkey -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;
код выше подходит для версий до XE4, но для XE4 и XE5 не работает. Цвет и стиль текста не меняется.
это фиксированный код для XE4 и XE5:
procedure TFinancialCell.ApplyStyling;
begin
StyledSettings := [TStyledSetting.ssFamily, TStyledSetting.ssSize];
if IsNegative then
FontColor := claRed
else
FontColor := 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;