Firemonkey Grid Control - стилизация ячейки на основе значения (с помощью вызова функции OnGetValue) - PullRequest
7 голосов
/ 13 февраля 2012

Я ищу рекомендуемое решение для стилизации ячейки TGrid, которая рисуется вызовом OnGetValue (который вызывается для рисования ячеек в поле зрения).Для фона отличный ответ Майка показал, как просто применять свойство tAlign при создании ячейки;но моя следующая задача - раскрасить содержимое ячейки.

Предыдущая публикация / ответ

Цель - изменить атрибуты ячейки (шрифт, стиль, цвет и т. д. ...) значения, которое я собираюсь вернуть в качестве ячейки «Значение».В приведенном ниже примере;это будет применение стиля к «значению» OnGetValue, которое возвращается.Вполне возможно, что мы должны сделать это с помощью таблицы стилей 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 ]

5 голосов
/ 14 февраля 2012

Во-первых, извинения. В моем ответе на ваш последний вопрос CreateCellControl должен был вызываться унаследованным для создания ячейки. Я исправил свой ответ.

Что касается этого вопроса, я загрузил свое сообщение в блоге на 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;
1 голос
/ 15 октября 2013

Код выше подходит для версий до 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;
...