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;