0

I'm using Delphi XE5 and am trying to format a TGrid based on the contents of each cell. For numerics I'd like them right-aligned in the cell with negatives shown in red font. All other data should be left-aligned in the cell. The following code achieves this EXCEPT when I scroll the grid up or down the colour/alignment goes wrong.

type
  TMyColumn = class( TStringColumn )
end;

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
  var Value: TValue);
var
  vMyCell : TStyledControl;
  i : Integer;
  s : String;
begin

  s := gHoldingGrid.Cells[ Col, Row ];

  vMyCell := TMyColumn( Grid1.Columns[ Col ] ).CellControlByRow( Row );

  if ( ( vMyCell <> nil ) AND ( vMyCell is TTextCell ) )
  then begin
    TTextCell( vMyCell ).StyledSettings := [];

    if TryStrToInt( s, i )
    then begin
      if StrToInt( s ) < 0
      then TTextCell( vMyCell ).FontColor := claRed
      else TTextCell( vMyCell ).FontColor := claBlue;

      TTextCell( vMyCell ).TextAlign := TTextAlign.taTrailing;
    end  { if TryStrToInt( s, i ) }
    else begin
      TTextCell( vMyCell ).TextAlign := TTextAlign.taLeading;
      TTextCell( vMyCell ).FontColor := claGreen;
    end;  { else .... if TryStrToInt( s, i ) }

    vMyCell.ApplyStyleLookup;
  end;  { if ( ( vMyCell <> nil ) AND ( vMyCell is TTextCell ) ) }

  Value := s;

end;

Can someone help me solve this please? I've tried numerous examples on this forum but couldn't get them working and am well and truly stuck.

Many thanks in anticipation.

Ian Francis
  • 181
  • 1
  • 1
  • 9

1 Answers1

0

When a FireMonkey grid is scrolled the cells become recycled. New values are passed into the cells via the SetData method. Therefore you need a custom component for use as a cell which overrides SetData to apply the formatting.

Thus you need to subclass TTextCell (which itself simply subclasses TEdit) and you also need a new column class which will create cells of your new class.

This is all much simpler than it sounds when you understand it. I have an article with an example at http://monkeystyler.com/guide/Formatting-a-Column-as-Currency and there are other articles linked from there which will be of use to you.

Mike Sutton
  • 4,191
  • 4
  • 29
  • 42