unit main; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids, StdCtrls, GridPrn, GridPrnPreviewDlg; type { TMainForm } TMainForm = class(TForm) btnPrint: TButton; btnPreview: TButton; ButtonPanel: TPanel; GridPrinter1: TGridPrinter; GridPrintPreviewDialog1: TGridPrintPreviewDialog; StringGrid1: TStringGrid; procedure btnPreviewClick(Sender: TObject); procedure btnPrintClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure PrepareCanvasHandler(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); private public end; var MainForm: TMainForm; implementation {$R *.lfm} { TMainForm } procedure TMainForm.btnPrintClick(Sender: TObject); begin GridPrinter1.Print; end; procedure TMainForm.btnPreviewClick(Sender: TObject); begin GridPrintPreviewDialog1.Execute; end; procedure TMainForm.FormCreate(Sender: TObject); const NUM_ROWS = 100; NUM_COLS = 20; var r, c: Integer; begin StringGrid1.BeginUpdate; try StringGrid1.Clear; StringGrid1.RowCount := NUM_ROWS + StringGrid1.FixedRows; StringGrid1.ColCount := NUM_COLS + StringGrid1.FixedCols; for r := StringGrid1.FixedRows to StringGrid1.RowCount-1 do StringGrid1.Cells[0, r] := 'Row ' + IntToStr(r); for c := StringGrid1.FixedCols to StringGrid1.ColCount-1 do begin StringGrid1.Cells[c, 0] := 'Column ' + IntToStr(c); for r := StringGrid1.FixedRows to StringGrid1.RowCount-1 do StringGrid1.Cells[c, r] := Format('C%d R%d', [c, r]); end; StringGrid1.Cells[6, 5] := 'This is a long text'; StringGrid1.DefaultColWidth := 80; StringGrid1.ColWidths[3] := 40; StringGrid1.RowHeights[5] := 60; StringGrid1.Options := StringGrid1.Options + [goCellEllipsis]; StringGrid1.AlternateColor := clMoneyGreen; StringGrid1.OnPrepareCanvas := @PrepareCanvasHandler; GridPrinter1.OnPrepareCanvas := @PrepareCanvasHandler; finally StringGrid1.EndUpdate; end; end; procedure TMainForm.PrepareCanvasHandler(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); var lCanvas: TCanvas; ts: TTextStyle; begin if Sender = StringGrid1 then lCanvas := StringGrid1.Canvas else if Sender = GridPrinter1 then lCanvas := GridPrinter1.Canvas else raise Exception.Create('Unknown sender of OnPrepareCanvas.'); ts := lCanvas.TextStyle; if (ACol = 3) and (ARow >= StringGrid1.FixedRows) and odd(ARow) then begin lCanvas.Brush.Color := clSkyBlue; lCanvas.Font.Color := clBlue; end; if (ACol = 6) and (ARow = 5) then begin ts.Wordbreak := true; ts.SingleLine := false; lCanvas.Font.Size := 12; lCanvas.Font.Style := [fsBold]; end; if (ARow = 5) then begin ts.Alignment := taRightJustify; end; lCanvas.TextStyle := ts; end; end.