This link/pic shows what I am trying to achieve with a TStringGrid.
This link/pic show what my code below is resulting in.
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 unit1.dfm file contents.
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 with the merging code in StringGridDrawCell
just below the //Attempt to merge 3 cells into one
comment.
I'm sure it's probably something obvious, but for the life of me I can't see it.
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.