delphi grid delphi-xe2 firemonkey

delphi - Firemonkey Grid Control-Estilo de una celda basado en un valor(a través de la llamada de función OnGetValue)



delphi-xe2 (2)

En primer lugar, una disculpa. En mi respuesta a su última pregunta, CreateCellControl debería haber llamado heredado para crear la celda. He modificado mi respuesta.

En cuanto a esta pregunta, he subido la publicación de mi blog en FireMonkey Cells - http://monkeystyler.com/blog/entry/firemonkey-grid-basics-custom-cells-and-columns - cubre las cosas de la respuesta anterior y también cubre la creación de controles de celda personalizados. Tendrás que leer eso antes de proceder. Esperaré.

...

¿Atras ahora? Bueno.

Siguiendo con el ejemplo en la publicación del blog.

Excepto, que he actualizado TFinancialCell para que herede directamente de TTextCell (que por supuesto es un TEdit), lo que tiene mucho más sentido y es mucho más simple de estilo.

Por lo tanto, actualice el 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;

Código para lo anterior:

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;

Y finalmente, actualice el controlador de eventos 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;

Estoy buscando la solución recomendada para diseñar una celda TGrid que está siendo dibujada por la llamada OnGetValue (que se llama para pintar las celdas a la vista). Para el fondo, una excelente respuesta de Mike, mostró cómo simplemente aplicar una propiedad tALIGN cuando se crea la celda; pero mi próximo desafío es colorear los contenidos de la celda.

Publicación previa / respuesta

El objetivo es cambiar los atributos de la celda (Fuente, estilo, color, etc.) del valor que estoy a punto de devolver como la celda "Valor". En el ejemplo de abajo; sería aplicar un estilo al "valor" de OnGetValue que se está devolviendo. Es muy posible que tengamos que hacer esto a través de una hoja de estilo FM; o podemos acceder directamente a los atributos TText? Idealmente, ambos escenarios serían geniales, pero en esta etapa tomaré cualquiera de las soluciones ... (; ->

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.

Muchas gracias de antemano, Ian.


El código anterior está bien para versiones anteriores a XE4, pero para XE4 y XE5 no funciona. El color y el estilo del texto no se modifican.

Este es un código fijo para XE4 y 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;