Применение стиля к ячейке Delphi XE4 Firemonkey StringGrid во время выполнения
Я пытаюсь применить стиль к XE4 FM Stringgrid во время выполнения, но не могу найти правильный синтаксис для этого.
StringGrid уже наследует TextCellStyle (по умолчанию), который я создал во время разработки, и отображает ячейки в сетке строк в соответствии с этим стилем.
В идеале я хотел бы изменить цвет шрифтов в определенных ячейках (отрицательный = красный, положительный = зеленый и т. Д.) Во время выполнения, но не могу понять, как это сделать, поскольку я не могу получить доступ к Stylelookup на уровне ячеек,
Пожалуйста, помните, что этот запрос относится к TStringGrid, а не к TGrid, поскольку наше приложение требует, чтобы мы динамически выделяли память для сетки во время выполнения, и это гораздо проще сделать со строкой сетки.
Любая помощь будет очень признательна, и спасибо заранее.
1 ответ
Я пытался научиться делать это с TGrid, и благодаря помощи Майка Саттона это удалось.
[См. Изменение цвета фона TTextCell во время выполнения XE4 для фона.]
Добившись этого, я попытался применить аналогичную логику к TStringGrid, и она работала нормально. Поскольку stringgrid не использует Grid1GetValue, я просто жестко запрограммировал случайные числа в сетке в FormCreate.
[В приведенном ниже коде у меня есть стиль, называемый textcellstyle; к компоненту 'background' textcellstyle я добавил TRectangle, чтобы я мог вызвать свойство 'Fill' TRectangle. Все еще не в курсе стилей, см. Ссылку выше.]
Мой код, в случае, если это полезно:
Procedure TForm1.FormCreate(Sender : TObject);
begin
{ CREATE AN EXTRA COLUMN }
StringGrid1.AddObject(TFinancialColumn.CreateStringGrid1));
{ HARD-CODE THE ROWS }
StringGrid1.Cells[0,0] :='0';
StringGrid1.Cells[0,1] :='1';
StringGrid1.Cells[0,2] :='2';
StringGrid1.Cells[0,3] :='3';
StringGrid1.Cells[0,4] :='4';
StringGrid1.Cells[0,5] :='5';
StringGrid1.Cells[0,6] :='6';
StringGrid1.Cells[0,7] :='7';
StringGrid1.Cells[0,8] :='8';
StringGrid1.Cells[0,9] :='9';
StringGrid1.Cells[0,10]:='10';
{ HARD-CODE A BUNCH OF NUMBERS. NOTE THAT HASH IN FRONT OF A NUMBER IS SIMPLY A FLAG FOR IsImportant }
StringGrid1.Cells[1,0] :='-10';
StringGrid1.Cells[1,1] :='-6.86999999';
StringGrid1.Cells[1,2] :='76.0999999';
StringGrid1.Cells[1,3] :='#10.25';
StringGrid1.Cells[1,4] :='#17.2900006';
StringGrid1.Cells[1,5] :='#57.1599993';
StringGrid1.Cells[1,6] :='21.86000';
StringGrid1.Cells[1,7] :='6.17';
StringGrid1.Cells[1,8] :='27.219999';
StringGrid1.Cells[1,9] :='#32.56000';
StringGrid1.Cells[1,10]:='-1.7999';
end;
Function TFinancialColumn.CreateCellControl : TStyledControl;
begin
Result:=TFinancialCell.Create(Self);
TTextCell(Result).OnTyping:=DoTextChanged;
TTextCell(Result).OnExit :=DoTextExit;
end;
Constructor TFinancialCell.Create(AOwner : TComponent);
begin
inherited;
StyleLookup:='textcellstyle';
StyledSettings:=StyledSettings-[TStyledSetting.ssStyle,TStyledSetting.ssFontColor]; { THIS LINE MUST BE HERE TO APPLY A NEW STYLE; IT CLEARS THE 'DEFAULT' STYLE SETTINGS }
TextAlign:=TTextAlign.taTrailing;
end;
Procedure TFinancialCell.SetData(const Value : TValue);
var
F : Single;
O : TFMXObject;
S : String;
begin
S:=Value.AsString;
If Length(S)>1 then
begin
FIsImportant:=S[1]='#';
If IsImportant then
S:=Copy(Value.AsString,2,MaxInt)
else
S:=Value.AsString;
F:=StrToFloat(S);
inherited SetData(Format('%n',[F]));
FIsNegative:=F<0;
ApplyStyling;
end;
end;
Procedure TFinancialCell.ApplyStyle;
var
T : TFMXObject;
begin
inherited;
T:=FindStyleResource('rectangle1');
If T is TRectangle then
begin
If IsNegative then
begin
TRectangle(T).Fill.Color:=claRed;
end;
end;
ApplyStyling;
end;
Procedure TFinancialCell.ApplyStyling;
var
T : TFMXObject;
begin
If IsNegative then
FontColor:=claBlack
else
FontColor:=claGreen;
If IsImportant then Font.Style:=[TFontStyle.fsItalic,TFontStyle.fsBold]; { REPEAT THE ITALIC ELSE IT WILL ONLY BE BOLD, IE IT OVERWRITES THE ITALIC WITH BOLD }
If Assigned(Font.OnChanged) then
Font.OnChanged(Font);
Repaint;
end;
Этот код работает с точки зрения рестайлинга шрифтов и фона. Любые предложения по улучшению вышесказанного приветствуются, но, надеюсь, это поможет.
Тем не менее, стилизация разваливается, как только вы начинаете прокручивать, но еще не выяснили, как это исправить. Любое предложение будет приветствоваться!