Question

I am using delphi 2010 for a project with a stringgrid. I want some columns of the grid to be right justified. I understand how I can do this with defaultdrawing set to false.

I would like, however, to keep the runtime theme shading for the grid, if possible. Is there a way to right justify a column with defaultdrawing enabled, or at least duplicate the code in the onDrawCell event to imitate the runtime theme shading?

Was it helpful?

Solution

you can use an interposer class and override the DrawCell method, check this sample

type
  TStringGrid = class(Grids.TStringGrid)
   protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  end;    

  TForm79 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
  end;

var
  Form79: TForm79;

implementation

{$R *.dfm}

{ TStringGrid }

procedure TStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
var
  s : string;
  LDelta : integer;
begin
  if (ACol=1) and (ARow>0) then
  begin
    s     := Cells[ACol, ARow];
    LDelta := ColWidths[ACol] - Canvas.TextWidth(s);
    Canvas.TextRect(ARect, ARect.Left+LDelta, ARect.Top+2, s);
  end
  else
  Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
end;

procedure TForm79.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0]:='title 1';
  StringGrid1.Cells[1,0]:='title 2';
  StringGrid1.Cells[2,0]:='title 3';

  StringGrid1.Cells[0,1]:='normal text';
  StringGrid1.Cells[1,1]:='right text';
  StringGrid1.Cells[2,1]:='normal text';
end;

And the result

enter image description here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top