Estoy buscando la solución recomendada para diseñar una celda TGrid que se dibuja mediante la llamada OnGetValue (llamada a 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.Firemonkey Grid Control - Estilo de una celda basado en un valor (a través de la llamada a función OnGetValue)
El objetivo es cambiar los atributos de celda (fuente, estilo, color, etc ...) del valor que voy a volver como la célula "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? Lo ideal es que ambos escenarios serían grandes - pero en esta etapa que adoptarán una solución ... (; -..>
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
¿Puede definir 'basado en un valor'? ¿Quiere decir, por ejemplo, que si el valor es negativo, la fuente será roja, etc.? –
Hola Mike - Sí; lugar perfecto. Tengo dos escenarios, pero ambos son el mismo principio. Un escenario es que el valor negativo se muestra en ROJO y el otro es "poner en negrita" un elemento en la lista (que elijo, debido a detalles fuera de la cuadrícula, cliente importante, etc.). Gracias por adelantado. Ian. – Ian