From c70778308cab5f3b176525577cff6e1f9208cab9 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 16 Nov 2022 18:57:57 +0000 Subject: [PATCH] GridPrinter: Add example how to print a spreadsheet grid (requires fpspreadsheet) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8624 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/fpspreadsheet_demo.lpi | 93 ++++++++++++ .../fpspreadsheet/fpspreadsheet_demo.lpr | 25 ++++ .../examples/fpspreadsheet/main.lfm | 124 ++++++++++++++++ .../examples/fpspreadsheet/main.pas | 133 ++++++++++++++++++ .../examples/fpspreadsheet/test.xlsx | Bin 0 -> 11962 bytes components/gridprinter/source/gridprn.pas | 22 ++- 6 files changed, 391 insertions(+), 6 deletions(-) create mode 100644 components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpi create mode 100644 components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpr create mode 100644 components/gridprinter/examples/fpspreadsheet/main.lfm create mode 100644 components/gridprinter/examples/fpspreadsheet/main.pas create mode 100644 components/gridprinter/examples/fpspreadsheet/test.xlsx diff --git a/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpi b/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpi new file mode 100644 index 000000000..142fac2f3 --- /dev/null +++ b/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpi @@ -0,0 +1,93 @@ + + + + + + + + + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes> + <Mode Name="default"> + <local> + <CommandLineParams Value="test.xlsx"/> + </local> + </Mode> + </Modes> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="GridPrinterPkg"/> + </Item> + <Item> + <PackageName Value="laz_fpspreadsheet_visual"/> + </Item> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="fpspreadsheet_demo.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="Project1"/> + </Unit> + <Unit> + <Filename Value="main.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="fpspreadsheet_demo"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpr b/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpr new file mode 100644 index 000000000..d2124e027 --- /dev/null +++ b/components/gridprinter/examples/fpspreadsheet/fpspreadsheet_demo.lpr @@ -0,0 +1,25 @@ +program Project1; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, main + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. + diff --git a/components/gridprinter/examples/fpspreadsheet/main.lfm b/components/gridprinter/examples/fpspreadsheet/main.lfm new file mode 100644 index 000000000..a47675230 --- /dev/null +++ b/components/gridprinter/examples/fpspreadsheet/main.lfm @@ -0,0 +1,124 @@ +object MainForm: TMainForm + Left = 331 + Height = 498 + Top = 129 + Width = 719 + Caption = 'Printing a TsWorksheetGrid' + ClientHeight = 498 + ClientWidth = 719 + OnCreate = FormCreate + LCLVersion = '2.3.0.0' + object ButtonPanel: TPanel + Left = 6 + Height = 25 + Top = 467 + Width = 707 + Align = alBottom + AutoSize = True + BorderSpacing.Around = 6 + BevelOuter = bvNone + ClientHeight = 25 + ClientWidth = 707 + TabOrder = 1 + object btnPrint: TButton + AnchorSideLeft.Control = btnOpenFile + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = ButtonPanel + Left = 89 + Height = 25 + Top = 0 + Width = 75 + BorderSpacing.Left = 6 + Caption = 'Print...' + OnClick = btnPrintClick + TabOrder = 1 + end + object btnPreview: TButton + AnchorSideLeft.Control = btnPrint + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = ButtonPanel + Left = 170 + Height = 25 + Top = 0 + Width = 75 + BorderSpacing.Left = 6 + Caption = 'Preview...' + OnClick = btnPreviewClick + TabOrder = 2 + end + object btnOpenFile: TButton + AnchorSideLeft.Control = ButtonPanel + AnchorSideTop.Control = ButtonPanel + Left = 0 + Height = 25 + Top = 0 + Width = 83 + AutoSize = True + Caption = 'Open file...' + OnClick = btnOpenFileClick + TabOrder = 0 + end + end + object sWorkbookTabControl1: TsWorkbookTabControl + Left = 0 + Height = 461 + Top = 0 + Width = 719 + TabIndex = 0 + Tabs.Strings = ( + 'Sheet1' + ) + Align = alClient + TabOrder = 0 + WorkbookSource = sWorkbookSource1 + object sWorksheetGrid1: TsWorksheetGrid + Left = 2 + Height = 436 + Top = 23 + Width = 715 + FrozenCols = 0 + FrozenRows = 0 + PageBreakPen.Color = clBlue + PageBreakPen.Style = psDash + ReadFormulas = False + WorkbookSource = sWorkbookSource1 + Align = alClient + AutoAdvance = aaDown + DefaultColWidth = 64 + DefaultRowHeight = 22 + TabOrder = 0 + end + end + object GridPrinter1: TGridPrinter + Grid = sWorksheetGrid1 + Footer.Font.Height = -11 + Footer.FontSize = 8 + Header.Font.Height = -11 + Header.FontSize = 8 + ShowPrintDialog = gpdPrintDialog + OnAfterPrint = GridPrinter1AfterPrint + OnBeforePrint = GridPrinter1BeforePrint + OnGetRowCount = GridPrinter1GetRowCount + OnGetColCount = GridPrinter1GetColCount + OnPrintCell = GridPrinter1PrintCell + Left = 231 + Top = 142 + end + object GridPrintPreviewDialog1: TGridPrintPreviewDialog + FormParams.PixelsPerInch = 96 + GridPrinter = GridPrinter1 + Left = 448 + Top = 142 + end + object sWorkbookSource1: TsWorkbookSource + FileFormat = sfUser + Options = [] + Left = 112 + Top = 142 + end + object OpenDialog1: TOpenDialog + Filter = 'All spreadsheet files|*.xls;*.xlsx;*.ods;*.csv|All Excel files (*.xls, *.xlsx)|*.xls;*.xlsx|Excel XML spreadsheet (*.xlsx)|*.xlsx|Excel XP/2003 XML spreadsheet (*.xml)|*.xml|Excel 97-2003 spreadsheets (*.xls)|*.xls|Excel 5 spreadsheet (*.xls)|*.xls|Excel 2.1 spreadsheets (*.xls)|*.xls|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|HTML files (*.html; *.htm)|*.html;*.htm|Comma-separated text files (*.csv; *.txt)|*.csv;*.txt' + Left = 230 + Top = 248 + end +end diff --git a/components/gridprinter/examples/fpspreadsheet/main.pas b/components/gridprinter/examples/fpspreadsheet/main.pas new file mode 100644 index 000000000..bda78fad2 --- /dev/null +++ b/components/gridprinter/examples/fpspreadsheet/main.pas @@ -0,0 +1,133 @@ +unit main; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, + Grids, Types, GridPrn, GridPrnPreviewDlg, + fpspreadsheet, fpstypes, fpspreadsheetgrid, fpspreadsheetctrls, fpsAllFormats; + +type + + { TMainForm } + + TMainForm = class(TForm) + btnPrint: TButton; + btnPreview: TButton; + btnOpenFile: TButton; + GridPrinter1: TGridPrinter; + GridPrintPreviewDialog1: TGridPrintPreviewDialog; + OpenDialog1: TOpenDialog; + ButtonPanel: TPanel; + sWorkbookSource1: TsWorkbookSource; + sWorkbookTabControl1: TsWorkbookTabControl; + sWorksheetGrid1: TsWorksheetGrid; + procedure btnPrintClick(Sender: TObject); + procedure btnPreviewClick(Sender: TObject); + procedure btnOpenFileClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure GridPrinter1AfterPrint(Sender: TObject); + procedure GridPrinter1BeforePrint(Sender: TObject); + procedure GridPrinter1GetColCount(Sender: TObject; AGrid: TCustomGrid; + var AColCount: Integer); + procedure GridPrinter1GetRowCount(Sender: TObject; AGrid: TCustomGrid; + var ARowCount: Integer); + procedure GridPrinter1PrintCell(Sender: TObject; AGrid: TCustomGrid; + ACanvas: TCanvas; ACol, ARow: Integer; ARect: TRect); + private + FGridCanvas: TCanvas; + FOldPadding: Integer; + FNewPadding: Integer; + + public + + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.lfm} + +uses + Variants; + +type + TsWorksheetGridOpener = class(TsWorksheetGrid); + +{ TMainForm } + +procedure TMainForm.FormCreate(Sender: TObject); +begin + if ParamCount > 0 then + sWorkbookSource1.LoadFromSpreadsheetFile(ParamStr(1)); +end; + +procedure TMainForm.GridPrinter1AfterPrint(Sender: TObject); +begin + sWorksheetGrid1.Canvas := FGridCanvas; + varCellPadding := FOldPadding; +end; + +procedure TMainForm.GridPrinter1BeforePrint(Sender: TObject); +begin + FGridCanvas := sWorksheetGrid1.Canvas; + sWorksheetGrid1.Canvas := GridPrinter1.Canvas; + FOldPadding := varCellPadding; + FNewPadding := GridPrinter1.Padding - varCellPadding; +end; + +procedure TMainForm.btnPrintClick(Sender: TObject); +begin + GridPrinter1.Print; +end; + +procedure TMainForm.btnPreviewClick(Sender: TObject); +begin + GridPrintPreviewDialog1.Execute; +end; + +procedure TMainForm.btnOpenFileClick(Sender: TObject); +begin + if OpenDialog1.FileName <> '' then + OpenDialog1.InitialDir := ExtractFileDir(OpenDialog1.FileName); + if OpenDialog1.Execute then + sWorkbookSource1.LoadFromSpreadsheetFile(OpenDialog1.FileName); +end; + +procedure TMainForm.GridPrinter1GetColCount(Sender: TObject; AGrid: TCustomGrid; + var AColCount: Integer); +begin + if sWorksheetGrid1.Worksheet <> nil then + AColCount := sWorksheetGrid1.Worksheet.GetLastOccupiedColIndex + 1 + sWorksheetGrid1.HeaderCount; +end; + +procedure TMainForm.GridPrinter1GetRowCount(Sender: TObject; AGrid: TCustomGrid; + var ARowCount: Integer); +begin + if sWorksheetGrid1.Worksheet <> nil then + ARowCount := sWorksheetGrid1.Worksheet.GetLastOccupiedRowIndex + 1 + sWorksheetGrid1.HeaderCount; +end; + +procedure TMainForm.GridPrinter1PrintCell(Sender: TObject; AGrid: TCustomGrid; + ACanvas: TCanvas; ACol, ARow: Integer; ARect: TRect); +var + worksheet: TsWorksheet; + cell: PCell; +begin + worksheet := sWorksheetGrid1.Worksheet; + if worksheet <> nil then + begin + varCellPadding := FNewPadding; + TsWorksheetGridOpener(sWorksheetGrid1).DrawCell(ACol, ARow, ARect, []); + cell := worksheet.FindCell(sWorksheetGrid1.GetWorksheetRow(ARow), sWorksheetGrid1.GetWorksheetCol(ACol)); + if worksheet.HasComment(cell) then + TsWorksheetGridOpener(sWorksheetGrid1).DrawCommentMarker(ARect); + end; +end; + +end. + diff --git a/components/gridprinter/examples/fpspreadsheet/test.xlsx b/components/gridprinter/examples/fpspreadsheet/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c87145c29de6cd74e3ee98d59f8cba47c0405493 GIT binary patch literal 11962 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 b@qf7^d1(kBk$yJkAps77Tx_ELdH4SSN~g(+ literal 0 HcmV?d00001 diff --git a/components/gridprinter/source/gridprn.pas b/components/gridprinter/source/gridprn.pas index 117debebe..6ac8e1847 100644 --- a/components/gridprinter/source/gridprn.pas +++ b/components/gridprinter/source/gridprn.pas @@ -12,6 +12,9 @@ type TGridPrnDialog = (gpdNone, gpdPageSetup, gpdPrintDialog, gpdPrinterSetup); + TGridPrnPrintCellEvent = procedure (Sender: TObject; AGrid: TCustomGrid; + ACanvas: TCanvas; ACol, ARow: Integer; ARect: TRect) of object; + TGridPrnGetCellTextEvent = procedure (Sender: TObject; AGrid: TCustomGrid; ACol, ARow: Integer; var AText: String) of object; @@ -137,6 +140,7 @@ type FOnGetColCount: TGridPrnGetColCountEvent; FOnGetRowCount: TGridPrnGetRowCountEvent; FOnPrepareCanvas: TOnPrepareCanvasEvent; + FOnPrintCell: TGridPrnPrintCellEvent; FOnUpdatePreview: TNotifyEvent; function GetBorderLineWidthHor: Integer; function GetBorderLineWidthVert: Integer; @@ -239,6 +243,7 @@ type property PageRect: TRect read FPageRect; property PixelsPerInchX: Integer read FPixelsPerInchX; property PixelsPerInchY: Integer read FPixelsPerInchY; + property Padding: Integer read FPadding; property PageCount: Integer read GetPageCount; property PageNumber: Integer read FPageNumber; property PrintScaleToNumHorPages: Integer read FPrintScaleToNumHorPages write FPrintScaleToNumHorPages; @@ -270,6 +275,7 @@ type property OnGetRowCount: TGridPrnGetRowCountEvent read FOnGetRowCount write FOnGetRowCount; property OnGetColCount: TGridPrnGetColCountEvent read FOnGetColCount write FOnGetColCount; property OnPrepareCanvas: TOnPrepareCanvasEvent read FOnPrepareCanvas write FOnPrepareCanvas; + property OnPrintCell: TGridPrnPrintCellEvent read FOnPrintCell write FOnPrintCell; property OnUpdatePreview: TNotifyEvent read FOnUpdatePreview write FOnUpdatePreview; end; @@ -712,10 +718,14 @@ end; procedure TGridPrinter.Execute(ACanvas: TCanvas); begin FPrinting := true; + if Assigned(FOnBeforePrint) then + FOnBeforePrint(Self); case FPrintOrder of poRowsFirst: PrintByRows(ACanvas); poColsFirst: PrintByCols(ACanvas); end; + if Assigned(FOnAfterPrint) then + FOnAfterPrint(Self); FPrinting := false; end; @@ -1105,9 +1115,6 @@ begin end; end; - if Assigned(FOnBeforePrint) then - FOnBeforePrint(Self); - FOutputDevice := odPrinter; Prepare; Printer.BeginDoc; @@ -1116,9 +1123,6 @@ begin finally Printer.EndDoc; end; - - if Assigned(FOnAfterPrint) then - FOnAfterPrint(Self); end; { Advances first along rows when handling page-breaks. } @@ -1222,6 +1226,12 @@ var lGrid: TGridAccess; checkedState: TCheckboxState; begin + if Assigned(FOnPrintCell) then + begin + FOnPrintCell(Self, FGrid, ACanvas, ACol, ARow, ARect); + exit; + end; + lGrid := TGridAccess(FGrid); PrepareCanvas(ACanvas, ACol, ARow);