Изменение цвета фона TTextCell во время выполнения XE4
Я работал с примером, размещенным здесь, в качестве отправной точки: изменить фон TTextCell в Firemonkey TGrid.
Я создал textcellstyle, который ссылается на изображение, и это работает хорошо. Когда я запускаю программу, все ячейки отображают фоновое изображение, как и ожидалось.
По приведенной выше ссылке Майк Саттон (я надеюсь, что вы читаете это, что бы мы делали без вашего участия!) Пишет (повторяется здесь, чтобы сделать это проще):
"Затем вы можете установить для каждого из своих ячеек свойства StyleLookup или использовать стили StyleName для TextCellStyle, чтобы оно автоматически подбиралось для каждого TTextCell".
Исходя из запроса об изменении цвета шрифта ( Delphi XE4 Firemonkey Grid Control - индивидуальная стилизация ячеек), можно ли также динамически устанавливать цвета фона?
Мой код по созданию ячеек:
Constructor TFinancialCell.Create(AOwner:TComponent);
begin
inherited;
StyleLookup:='textcellstyle';
StyledSettings:=StyledSettings-[TStyledSetting.ssStyle,TStyledSetting.ssFontColor];
TextAlign:=TTextAlign.taTrailing;
end;
Это успешно применяет мое изображение к TFinancialCell.
Но, в соответствии с запросом цвета шрифта, я бы хотел, чтобы фон изображения отображался только при достижении определенного значения или чего-либо еще:
Procedure TFinancialCell.ApplyStyling;
begin
Font.Style:=[TFontStyle.fsItalic];
If IsNegative then
FontColor:=claRed
else
FontColor:=claGreen;
If IsImportant then Font.Style:=[TFontStyle.fsItalic,TFontStyle.fsBold];
If Assigned(Font.OnChanged) then
Font.OnChanged(Font);
Repaint;
end;
Любая помощь в том, как это сделать, будет принята с благодарностью.
1 ответ
Спасибо майк Мне пришлось немного повозиться, но все заработало на основе твоего предложения. Я добавил TRectangle в свой textcellstyle в stylecontainer следующим образом:
textcellstyle : TLayout
background: TSubImage
rectangle1: TRectangle
rectanimation: TRectAnimation
В TFinancialCell.ApplyStyle я пробовал FindStyleResource ('background'), но это всегда возвращало ноль. Я изменил его на FindStyleResource ('rectangle1'), и это сработало отлично. Это потому, что он ищет соответствующее свойство StyleName (которое по умолчанию "Rectangle1" для прямоугольника 1) в инспекторе объектов? До сих пор не совсем вижу дерево за деревьями, как я уверен, вы можете сказать...
Рабочий код:
Procedure TFinancialCell.ApplyStyle;
var
T : TFMXObject;
begin
inherited;
T:=FindStyleResource('Rectangle1');
If (T<>nil) and (T is TRectangle) then
begin
If TRectangle(T).Fill<>nil then
begin
If IsNegative then
begin
TRectangle(T).Fill.Color:=claRed;
Repaint;
end;
end;
end;
ApplyStyling;
end;
В качестве отдельного упражнения я также попытался поместить приведенный выше код в TFinancialCell.ApplyStyling, и он также работал там, поэтому не уверен, какой вариант лучше и почему?
Резюме моего понимания этих стилей до сих пор (пожалуйста, исправьте / прокомментируйте при необходимости):
- Я создал стиль с именем textcellstyle, который я применяю в TFinancialCell. Создайте свой класс TFinancialCell [StyleLookup:='textcellstyle'].
- Когда я вызываю TFinancialCell.ApplyStyling, я могу напрямую получить доступ к свойствам Font и FontColor TFinancialCell, так как эти свойства являются свойствами TTextCell.
- Если я хочу закрасить фон ячеек, я должен явно вызвать компонент TRectangle, который я вручную добавил к textcellstyle 'style', а затем получить доступ к свойству Fill etc оттуда.