0
votes

I worked through the example posted here as my starting point: Change background of TTextCell in a Firemonkey TGrid

I have created a textcellstyle which references an image, and this is working well. When I run the program all the cells display the background image as expected.

From the above link, Mike Sutton (I hope you're reading this, what would we do without your input!) writes (repeated here just to make it easier):

"You can then set each of your cells StyleLookup properties to use it, or set the styles StyleName to TextCellStyle to have it picked up automatically for every TTextCell."

Following on from the query about changing the font colours (Delphi XE4 Firemonkey Grid Control - Styling cells individually), can one set the background colours dynamically as well?

My code on creating the cells:

Constructor TFinancialCell.Create(AOwner:TComponent);

begin
  inherited;
  StyleLookup:='textcellstyle';
  StyledSettings:=StyledSettings-[TStyledSetting.ssStyle,TStyledSetting.ssFontColor]; 
  TextAlign:=TTextAlign.taTrailing;
end;

This applies my image successfully to TFinancialCell.

But, as per the font colour query, I would like the image background to display only when a certain value is reached or whatever:

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;

Any help as to how to do this would be appreciated.

1
In theory, and assuming the style doesn't use bitmaps, in ApplyStyle, call FindStyleResource('background') which should return a TRectangle and you can change it's Fill.Color. If that fails I'll take a look when I get time.Mike Sutton

1 Answers

0
votes

Thanks Mike. I had to fiddle around a bit, but got it to work based on your suggestion. I added a TRectangle to my textcellstyle in the stylecontainer, as follows:

textcellstyle : TLayout
    background: TSubImage
        rectangle1: TRectangle
        rectanimation: TRectAnimation

In TFinancialCell.ApplyStyle I tried FindStyleResource ('background'), but this always returned nil. I changed it to FindStyleResource ('rectangle1') and this worked great. Is this because it looks for the relevant StyleName property (which obviously defaults to 'Rectangle1' for rectangle 1) in the object inspector? Still not quite seeing the wood for the trees, as I'm sure you can tell...

The working code:

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;

I also tried, as a separate exercise, to put the code above in TFinancialCell.ApplyStyling, and it also worked there, so not sure which is the better option, and why?

The summary of my understanding of these styles so far is (please correct/comment as necessary):

  1. I have created a style called textcellstyle, which I apply in TFinancialCell.Create to my TFinancialCell class [StyleLookup:='textcellstyle'].
  2. When I call TFinancialCell.ApplyStyling, I am able to access the Font and FontColor properties of TFinancialCell directly, as these properties are properties of TTextCell.
  3. If I want to paint the background of the cells, I have to explicitly call the TRectangle component that I manually added to the textcellstyle 'style', and then access the Fill etc property from there.