title: TStringGrid merge cell drawing
body: <p>This link/pic shows what I am trying to achieve with a TStringGrid.</p>
  
  <p><img src="https://i.stack.imgur.com/IO3de.jpg" alt="enter image description here"></p>
  
  <p>This link/pic show what my code below is resulting in.</p>
  
  <p><img src="https://i.stack.imgur.com/vVu7e.jpg" alt="enter image description here"></p>
  
  <pre><code>unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Grids;
  
  type
    TForm1 = class(TForm)
      StringGrid: TStringGrid;
      procedure FormCreate(Sender: TObject);
      procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
    private
    public
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  
  procedure TForm1.FormCreate(Sender: TObject);
  const
    cProdWidth = 70;
    cCountWidth = 45;
    cWeightWidth = 55;
  var
    Index: Integer;
    Col, Row: Integer;
  begin
    StringGrid.ColCount := 10;
    StringGrid.RowCount := 2;
    StringGrid.Cells[1, 0] := 'Shoulder';
    StringGrid.ColWidths[1] := cProdWidth;
    StringGrid.Cells[4, 0] := 'Barrel';
    StringGrid.ColWidths[4] := cProdWidth;
    StringGrid.Cells[7, 0] := 'Leg';
    StringGrid.ColWidths[7] := cProdWidth;
  
    StringGrid.Cells[0, 1] := 'Carcass Prod';
    StringGrid.ColWidths[0] := cProdWidth;
    StringGrid.Cells[1, 1] := 'Product';
    StringGrid.Cells[2, 1] := 'Count';
    StringGrid.ColWidths[2] := cCountWidth;
    StringGrid.Cells[3, 1] := 'Weight %';
    StringGrid.ColWidths[3] := cWeightWidth;
    StringGrid.Cells[4, 1] := 'Product';
    StringGrid.Cells[5, 1] := 'Count';
    StringGrid.ColWidths[5] := cCountWidth;
    StringGrid.Cells[6, 1] := 'Weight %';
    StringGrid.ColWidths[6] := cWeightWidth;
    StringGrid.Cells[7, 1] := 'Product';
    StringGrid.Cells[8, 1] := 'Count';
    StringGrid.ColWidths[8] := cCountWidth;
    StringGrid.Cells[9, 1] := 'Weight %';
    StringGrid.ColWidths[9] := cWeightWidth;
    StringGrid.Invalidate;
  end;
  
  procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  var
    CellText: String;
  begin
    if (ACol &gt; 0)
      then begin
            CellText := StringGrid.Cells[ACol, ARow];
            if ((ARow = 0) and (ACol in [1, 4, 7]))
              then begin
                    // Attempt to merge 3 cells into one
                    Rect.Right := StringGrid.ColWidths[ACol] + StringGrid.ColWidths[ACol + 1] + StringGrid.ColWidths[ACol + 2];
                    StringGrid.Canvas.Brush.Color := clWindow;
                    StringGrid.Canvas.Brush.Style := bsSolid;
                    StringGrid.Canvas.Pen.Style := psClear;
                    StringGrid.Canvas.FillRect(rect);
                    DrawText(StringGrid.Canvas.Handle, PChar(CellText), Length(CellText), Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
                   end;
            if (ACol in [1,2,3,7,8,9])
              then begin
                    StringGrid.Canvas.Brush.Color := clWebLinen;
                    StringGrid.Canvas.FillRect(Rect);
                   end
              else StringGrid.Canvas.Brush.Color := clWindow;
            if (ARow &gt; 0)
              then StringGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top, CellText);
           end;
  end;
  
  end.
  </code></pre>
  
  <p>And this is my unit1.dfm file contents.</p>
  
  <pre><code>object Form1: TForm1
    Left = 0
    Top = 0
    Caption = 'Form1'
    ClientHeight = 371
    ClientWidth = 606
    Color = clBtnFace    
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    OldCreateOrder = False
    OnCreate = FormCreate
    PixelsPerInch = 96
    TextHeight = 13
    object StringGrid: TStringGrid
      Left = 0
      Top = 0
      Width = 606
      Height = 371
      Align = alClient
      ColCount = 1
      FixedCols = 0
      RowCount = 1
      FixedRows = 0
      TabOrder = 0
      OnDrawCell = StringGridDrawCell
      ExplicitLeft = 160
      ExplicitTop = 88
      ExplicitWidth = 320
      ExplicitHeight = 120
    end
  end
  </code></pre>
  
  <p>The problem seems to be with the merging code in <code>StringGridDrawCell</code> just below the <code>//Attempt to merge 3 cells into one</code> comment.</p>
  
  <p>I'm sure it's probably something obvious, but for the life of me I can't see it.</p>
  
  <p>NOTE: If someone could turn the links into embedded images that would be much appreciated as I don't seem to have enough reputation to post images.</p>