unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   with StringGrid1 do
  begin
    Color:=clWhite;
    Colwidths[0]:=25;
    Options:=Options+[goEditing];
    Cells[0,0]:='LP';
    Cells[1,0]:='Cena'+#13+'[zł]';
    Cells[2,0]:='Waga'+#13+'[kg]';
    Cells[3,0]:='1';
    Cells[4,0]:='1'+#13+'try';
    Cells[1,3]:='bbb'+#13+'ccc';
    Cells[2,4]:='a'+#13+'b';
    Cells[1,1]:='1456';
    Cells[2,2]:='3567'+#13+'4dsfahdsg';
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   k:integer;
   c1,c2,c3:string;
   pr1,pr2:TRect;
begin
 with StringGrid1 do
 begin
    //rysowaie komórki niezaleznie od wpisanego tekstu
    Canvas.Brush.Color:=clWhite;
    Canvas.FillRect(Rect);
    Canvas.Font.Color:=clBlack;
    Canvas.TextOut(Rect.Left+2,Rect.Top+2,Cells[0,0]);

   c3:=Cells[Acol,Arow];
   k:=Pos(#13,c3);
   if k<>0 then  //czy w łańcuchu znaków był znak #13
   begin
      //powiększenie wysokości wiersza do
      //rozmiaru dwóch linii plus 8 pikseli
      if 2*Canvas.TextHeight(c3)>(Rect.Bottom-Rect.Top) then
      RowHeights[Arow]:=2*Canvas.TextHeight('c3')+8;

      c1:=copy(c3,1,k-1); //pierwsza linia
      c2:=copy(c3,k+1,length(c3)-k+1);//druga linia
    //ustalenie współrzędnych dolnej krawędzi prostokąta do pisania tekstu w pierwszej
    //linii
      pr1:=Rect; pr1.Bottom:=Rect.Top+(Rect.Bottom-Rect.Top) div 2-2;
     //ustalenie współrzędnych górnej krawędzi prostokąta do pisania tekstu w drugiej
     //linii
      pr2:=Rect; pr2.Top:=pr1.Bottom+2;
    Canvas.TextRect(pr1, pr1.Left + (pr1.Right - pr1.Left - Canvas.TextWidth(c1)) div 2,
                    pr1.Top+2,c1);
    Canvas.TextRect(pr2, pr2.Left + (pr2.Right - pr2.Left - Canvas.TextWidth(c2)) div 2,
                    pr2.Top,c2);
   end //k<>0
   else  //wyśrodkowanie w pionie i w poziomie, tu można dodać inny sposób wyrównania
         //zawartości komórek, np. w zależności od numeru kolumny
          Canvas.TextRect(Rect,
          Rect.Left+(Rect.Right-Rect.Left-Canvas.TextWidth(Cells[Acol,arow])) div 2,
          Rect.Top + (Rect.Bottom-Rect.Top-Canvas.TextHeight(Cells[Acol,Arow])) div 2,
          Cells[Acol,arow]);
  end;//with

end;

end.
