This / pic link shows what I'm trying to achieve with a TStringGrid.

This / pic link shows what is my code below.

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 > 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 > 0) then StringGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top, CellText); end; end; end.
And this is my contents of the unit1.dfm file.
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
The problem seems to be due to code merging into StringGridDrawCell just below the comment //Attempt to merge 3 cells into one .
I am sure that this is probably something obvious, but for me I do not see life.
NOTE. If someone can turn links into inline images that will be highly appreciated since I don't have enough reputation to post images.