{******************************************} { } { FastReport FMX v2.0 } { Printer } { } { Copyright (c) 1998-2020 } { by Alexander Syrykh, } { Fast Reports Inc. } { } {******************************************} unit FMX.Linux.Old.frxPrinter; interface {$I fmx.inc} {$I frx.inc} uses System.Classes, System.SysUtils,System.Types, System.UITypes, System.Variants, FMX.Types, FMX.frxPrinter, FMX.Printer.Linux, FMX.Printer, FMX.frxClass {$IFDEF DELPHI19} , FMX.Graphics {$ENDIF}; type THackCanvas = class(TCanvas); THackPrinter = class(TPrinter); TfrxPrinter = class(TfrxCustomPrinter) private FIsFirst: Boolean; public constructor Create(const AName, APort: String); override; destructor Destroy; override; procedure Init; override; procedure Abort; override; procedure BeginDoc; override; procedure BeginPage; override; procedure BeginRAWDoc; override; procedure EndDoc; override; procedure EndPage; override; procedure EndRAWDoc; override; procedure WriteRAWDoc(const buf: AnsiString); override; procedure SetViewParams(APaperSize: Integer; APaperWidth, APaperHeight: Extended; AOrientation: TPrinterOrientation); override; procedure SetPrintParams(APaperSize: Integer; APaperWidth, APaperHeight: Extended; AOrientation: TPrinterOrientation; ABin, ADuplex, ACopies: Integer); override; procedure PropertiesDlg; override; function ShowPrintDialog: Boolean; override; function UpdateDeviceCaps: Boolean; end; TfrxPrinters = class(TfrxCustomPrinters) protected function GetDefaultPrinter: String; override; public constructor Create; destructor Destroy; override; procedure FillPrinters; override; end; function ActualfrxPrinterClass : TfrxCustomPrintersClass; implementation uses FMX.frxUtils, FMX.frxRes, FMX.frxFMX, FMX.Forms, FMUX.Api; type TPaperInfo = {packed} record Typ: Integer; Name: String; X, Y: Integer; end; const PAPERCOUNT = 66; PaperInfo: array[0..PAPERCOUNT - 1] of TPaperInfo = ( (Typ:1; Name: ''; X:2159; Y:2794), (Typ:2; Name: ''; X:2159; Y:2794), (Typ:3; Name: ''; X:2794; Y:4318), (Typ:4; Name: ''; X:4318; Y:2794), (Typ:5; Name: ''; X:2159; Y:3556), (Typ:6; Name: ''; X:1397; Y:2159), (Typ:7; Name: ''; X:1842; Y:2667), (Typ:8; Name: ''; X:2970; Y:4200), (Typ:9; Name: ''; X:2100; Y:2970), (Typ:10; Name: ''; X:2100; Y:2970), (Typ:11; Name: ''; X:1480; Y:2100), (Typ:12; Name: ''; X:2500; Y:3540), (Typ:13; Name: ''; X:1820; Y:2570), (Typ:14; Name: ''; X:2159; Y:3302), (Typ:15; Name: ''; X:2150; Y:2750), (Typ:16; Name: ''; X:2540; Y:3556), (Typ:17; Name: ''; X:2794; Y:4318), (Typ:18; Name: ''; X:2159; Y:2794), (Typ:19; Name: ''; X:984; Y:2254), (Typ:20; Name: ''; X:1048; Y:2413), (Typ:21; Name: ''; X:1143; Y:2635), (Typ:22; Name: ''; X:1207; Y:2794), (Typ:23; Name: ''; X:1270; Y:2921), (Typ:24; Name: ''; X:4318; Y:5588), (Typ:25; Name: ''; X:5588; Y:8636), (Typ:26; Name: ''; X:8636; Y:11176), (Typ:27; Name: ''; X:1100; Y:2200), (Typ:28; Name: ''; X:1620; Y:2290), (Typ:29; Name: ''; X:3240; Y:4580), (Typ:30; Name: ''; X:2290; Y:3240), (Typ:31; Name: ''; X:1140; Y:1620), (Typ:32; Name: ''; X:1140; Y:2290), (Typ:33; Name: ''; X:2500; Y:3530), (Typ:34; Name: ''; X:1760; Y:2500), (Typ:35; Name: ''; X:1760; Y:1250), (Typ:36; Name: ''; X:1100; Y:2300), (Typ:37; Name: ''; X:984; Y:1905), (Typ:38; Name: ''; X:920; Y:1651), (Typ:39; Name: ''; X:3778; Y:2794), (Typ:40; Name: ''; X:2159; Y:3048), (Typ:41; Name: ''; X:2159; Y:3302), (Typ:42; Name: ''; X:2500; Y:3530), (Typ:43; Name: ''; X:1000; Y:1480), (Typ:44; Name: ''; X:2286; Y:2794), (Typ:45; Name: ''; X:2540; Y:2794), (Typ:46; Name: ''; X:3810; Y:2794), (Typ:47; Name: ''; X:2200; Y:2200), (Typ:50; Name: ''; X:2355; Y:3048), (Typ:51; Name: ''; X:2355; Y:3810), (Typ:52; Name: ''; X:2969; Y:4572), (Typ:53; Name: ''; X:2354; Y:3223), (Typ:54; Name: ''; X:2101; Y:2794), (Typ:55; Name: ''; X:2100; Y:2970), (Typ:56; Name: ''; X:2355; Y:3048), (Typ:57; Name: ''; X:2270; Y:3560), (Typ:58; Name: ''; X:3050; Y:4870), (Typ:59; Name: ''; X:2159; Y:3223), (Typ:60; Name: ''; X:2100; Y:3300), (Typ:61; Name: ''; X:1480; Y:2100), (Typ:62; Name: ''; X:1820; Y:2570), (Typ:63; Name: ''; X:3220; Y:4450), (Typ:64; Name: ''; X:1740; Y:2350), (Typ:65; Name: ''; X:2010; Y:2760), (Typ:66; Name: ''; X:4200; Y:5940), (Typ:67; Name: ''; X:2970; Y:4200), (Typ:68; Name: ''; X:3220; Y:4450)); type TPaperInfoLCL = {packed} record Name: String; W, H: Extended; end; const LCLPaperCount = 119; PtPrIn = 72; CmPrIn = 2.54; PtPrCm = PtPrIn/CmPrIn; PtPrmm = PtPrCm/10; LCLPaperInfo : array[0..LCLPAPERCOUNT-1] of TPaperInfoLCL = ((Name: 'Letter 8 1/2 x 11 in'; W: 8.5 * PtPrIn; H: 11 * PtPrIn), (Name: 'Letter Small 8 1/2 x 11 in'; W: 8.5 * PtPrIn; H: 11 * PtPrIn), (Name: 'Tabloid 11 x 17 in'; W: 11 * PtPrIn; H: 17 * PtPrIn), (Name: 'Ledger 17 x 11 in'; W: 17 * PtPrIn; H: 11 * PtPrIn), (Name: 'Legal 8 1/2 x 14 in'; W: 8.5 * PtPrIn; H: 14 * PtPrIn), (Name: 'Statement 5 1/2 x 8 1/2 in'; W: 5.5 * PtPrIn; H: 8.5 * PtPrIn), (Name: 'Executive 7 1/4 x 10 1/2 in'; W: 7.25 * PtPrIn; H: 10.5 * PtPrIn), (Name: 'A3 297 x 420 mm'; W: 297 * PtPrmm; H: 420 * PtPrmm), (Name: 'A4 210 x 297 mm'; W: 210 * PtPrmm; H: 297 * PtPrmm), (Name: 'A4 Small 210 x 297 mm'; W: 210 * PtPrmm; H: 297 * PtPrmm), (Name: 'A5 148 x 210 mm'; W: 148 * PtPrmm; H: 210 * PtPrmm), (Name: 'B4 (JIS) 250 x 354 mm'; W: 250 * PtPrmm; H: 354 * PtPrmm), (Name: 'B5 (JIS) 182 x 257 mm'; W: 182 * PtPrmm; H: 257 * PtPrmm), (Name: 'Folio 8 1/2 x 13 in'; W: 8.5 * PtPrIn; H: 13 * PtPrIn), (Name: 'Quarto 215 x 275 mm'; W: 215 * PtPrmm; H: 275 * PtPrmm), (Name: '10x14 in'; W: 10 * PtPrIn; H: 14 * PtPrIn), (Name: '11x17 in'; W: 11 * PtPrIn; H: 17 * PtPrIn), (Name: 'Note 8 1/2 x 11 in'; W: 8.5 * PtPrIn; H: 11 * PtPrIn), (Name: 'Envelope #9 3 7/8 x 8 7/8'; W: 3 * 7 / 8 * PtPrIn; H: 8 * 7 / 8 * PtPrIn), (Name: 'Envelope #10 4 1/8 x 9 1/2'; W: 3 * 1 / 8 * PtPrIn; H: 9.5 * PtPrIn), (Name: 'Envelope #11 4 1/2 x 10 3/8'; W: 4.5 * PtPrIn; H: 10 * 3 / 8 * PtPrIn), (Name: 'Envelope #12 4 3/4 x 11'; W: 4.75 * PtPrIn; H: 11 * PtPrIn), (Name: 'Envelope #14 5 x 11 1/2'; W: 5 * PtPrIn; H: 11.5 * PtPrIn), (Name: 'C size sheet 17 x 22 in'; W: 17 * PtPrIn; H: 22 * PtPrIn), (Name: 'D size sheet 22 x 34 in'; W: 22 * PtPrIn; H: 34 * PtPrIn), (Name: 'E size sheet 34 x 44 in'; W: 34 * PtPrIn; H: 44 * PtPrIn), (Name: 'Envelope DL 110 x 220mm'; W: 110 * PtPrmm; H: 220 * PtPrmm), (Name: 'Envelope C5 162 x 229 mm'; W: 162 * PtPrmm; H: 229 * PtPrmm), (Name: 'Envelope C3 324 x 458 mm'; W: 324 * PtPrmm; H: 458 * PtPrmm), (Name: 'Envelope C4 229 x 324 mm'; W: 229 * PtPrmm; H: 324 * PtPrmm), (Name: 'Envelope C6 114 x 162 mm'; W: 114 * PtPrmm; H: 162 * PtPrmm), (Name: 'Envelope C65 114 x 229 mm'; W: 114 * PtPrmm; H: 229 * PtPrmm), (Name: 'Envelope B4 250 x 353 mm'; W: 250 * PtPrmm; H: 353 * PtPrmm), (Name: 'Envelope B5 176 x 250 mm'; W: 176 * PtPrmm; H: 250 * PtPrmm), (Name: 'Envelope B6 176 x 125 mm'; W: 176 * PtPrmm; H: 125 * PtPrmm), (Name: 'Envelope 110 x 230 mm'; W: 110 * PtPrmm; H: 230 * PtPrmm), (Name: 'Envelope Monarch 3 7/8 x 7 1/2 in'; W: 3 * 7 / 8 * PtPrIn; H: 7.5 * PtPrIn), (Name: '6 34 Envelope 3 5/8 x 6 1/2 in'; W: 3 * 5 / 8 * PtPrIn; H: 6.5 * PtPrIn), (Name: 'US Std Fanfold 14 7/8 x 11 in'; W: 14 * 7 / 8 * PtPrIn; H: 11 * PtPrIn), (Name: 'German Std Fanfold 8 1/2 x 12 in'; W: 8.5 * PtPrIn; H: 12 * PtPrIn), (Name: 'German Legal Fanfold 8 1/2 x 13 in'; W: 8.5 * PtPrIn; H: 13 * PtPrIn), (Name: 'B4 (ISO) 250 x 353 mm'; W: 250 * PtPrmm; H: 353 * PtPrmm), (Name: 'Japanese Postcard 100 x 148 mm'; W: 100 * PtPrmm; H: 148 * PtPrmm), (Name: '9 x 11 in'; W: 9 * PtPrIn; H: 11 * PtPrIn), (Name: '10 x 11 in'; W: 10 * PtPrIn; H: 11 * PtPrIn), (Name: '15 x 11 in'; W: 15 * PtPrIn; H: 11 * PtPrIn), (Name: 'Envelope Invite 220 x 220 mm'; W: 220 * PtPrmm; H: 220 * PtPrmm), (Name: 'RESERVED--DO NOT USE'; W: 0; H: 0), (Name: 'RESERVED--DO NOT USE'; W: 0; H: 0), (Name: 'Letter Extra 9 \275 x 12 in'; W: 9.275 * PtPrIn; H: 12 * PtPrIn), (Name: 'Legal Extra 9 \275 x 15 in'; W: 9.275 * PtPrIn; H: 15 * PtPrIn), (Name: 'Tabloid Extra 11.69 x 18 in'; W: 11.69 * PtPrIn; H: 18 * PtPrIn), (Name: 'A4 Extra 9.27 x 12.69 in'; W: 9.27 * PtPrIn; H: 12.69 * PtPrIn), (Name: 'Letter Transverse 8 \275 x 11 in'; W: 8.275 * PtPrIn; H: 11 * PtPrIn), (Name: 'A4 Transverse 210 x 297 mm'; W: 210 * PtPrmm; H: 297 * PtPrmm), (Name: 'Letter Extra Transverse 9\275 x 12 in'; W: 9.275 * PtPrIn; H: 12 * PtPrIn), (Name: 'SuperASuperAA4 227 x 356 mm'; W: 227 * PtPrmm; H: 356 * PtPrmm), (Name: 'SuperBSuperBA3 305 x 487 mm'; W: 305 * PtPrmm; H: 487 * PtPrmm), (Name: 'Letter Plus 8.5 x 12.69 in'; W: 8.5 * PtPrIn; H: 12.69 * PtPrIn), (Name: 'A4 Plus 210 x 330 mm'; W: 210 * PtPrmm; H: 330 * PtPrmm), (Name: 'A5 Transverse 148 x 210 mm'; W: 148 * PtPrmm; H: 210 * PtPrmm), (Name: 'B5 (JIS) Transverse 182 x 257 mm'; W: 182 * PtPrmm; H: 257 * PtPrmm), (Name: 'A3 Extra 322 x 445 mm'; W: 322 * PtPrmm; H: 445 * PtPrmm), (Name: 'A5 Extra 174 x 235 mm'; W: 174 * PtPrmm; H: 235 * PtPrmm), (Name: 'B5 (ISO) Extra 201 x 276 mm'; W: 201 * PtPrmm; H: 276 * PtPrmm), (Name: 'A2 420 x 594 mm'; W: 420 * PtPrmm; H: 594 * PtPrmm), (Name: 'A3 Transverse 297 x 420 mm'; W: 297 * PtPrmm; H: 420 * PtPrmm), (Name: 'A3 Extra Transverse 322 x 445 mm'; W: 322 * PtPrmm; H: 445 * PtPrmm), (Name: 'Japanese Double Postcard 200 x 148 mm'; W: 200 * PtPrmm; H: 148 * PtPrmm), (Name: 'A6 105 x 148 mm'; W: 105 * PtPrmm; H: 148 * PtPrmm), (Name: 'Japanese Envelope Kaku #2'; W: 0; H: 0), (Name: 'Japanese Envelope Kaku #3'; W: 0; H: 0), (Name: 'Japanese Envelope Chou #3'; W: 0; H: 0), (Name: 'Japanese Envelope Chou #4'; W: 0; H: 0), (Name: 'Letter Rotated 11 x 8 1/2 11 in'; W: 11 * PtPrIn; H: 8.5 * PtPrIn), (Name: 'A3 Rotated 420 x 297 mm'; W: 420 * PtPrmm; H: 297 * PtPrmm), (Name: 'A4 Rotated 297 x 210 mm'; W: 297 * PtPrmm; H: 210 * PtPrmm), (Name: 'A5 Rotated 210 x 148 mm'; W: 210 * PtPrmm; H: 148 * PtPrmm), (Name: 'B4 (JIS) Rotated 364 x 257 mm'; W: 364 * PtPrmm; H: 257 * PtPrmm), (Name: 'B5 (JIS) Rotated 257 x 182 mm'; W: 257 * PtPrmm; H: 182 * PtPrmm), (Name: 'Japanese Postcard Rotated 148 x 100 mm'; W: 148 * PtPrmm; H: 100 * PtPrmm), (Name: 'Double Japanese Postcard Rotated 148 x 200 mm'; W: 148 * PtPrmm; H: 200 * PtPrmm), (Name: 'A6 Rotated 148 x 105 mm'; W: 148 * PtPrmm; H: 105 * PtPrmm), (Name: 'Japanese Envelope Kaku #2 Rotated'; W: 0; H: 0), (Name: 'Japanese Envelope Kaku #3 Rotated'; W: 0; H: 0), (Name: 'Japanese Envelope Chou #3 Rotated'; W: 0; H: 0), (Name: 'Japanese Envelope Chou #4 Rotated'; W: 0; H: 0), (Name: 'B6 (JIS) 128 x 182 mm'; W: 128 * PtPrmm; H: 182 * PtPrmm), (Name: 'B6 (JIS) Rotated 182 x 128 mm'; W: 182 * PtPrmm; H: 128 * PtPrmm), (Name: '12 x 11 in'; W: 12 * PtPrIn; H: 11 * PtPrIn), (Name: 'Japanese Envelope You #4'; W: 0; H: 0), (Name: 'Japanese Envelope You #4 Rotated'; W: 0; H: 0), (Name: 'PRC 16K 146 x 215 mm'; W: 146 * PtPrmm; H: 215 * PtPrmm), (Name: 'PRC 32K 97 x 151 mm'; W: 97 * PtPrmm; H: 151 * PtPrmm), (Name: 'PRC 32K(Big) 97 x 151 mm'; W: 97 * PtPrmm; H: 151 * PtPrmm), (Name: 'PRC Envelope #1 102 x 165 mm'; W: 102 * PtPrmm; H: 165 * PtPrmm), (Name: 'PRC Envelope #2 102 x 176 mm'; W: 102 * PtPrmm; H: 176 * PtPrmm), (Name: 'PRC Envelope #3 125 x 176 mm'; W: 125 * PtPrmm; H: 176 * PtPrmm), (Name: 'PRC Envelope #4 110 x 208 mm'; W: 110 * PtPrmm; H: 208 * PtPrmm), (Name: 'PRC Envelope #5 110 x 220 mm'; W: 110 * PtPrmm; H: 220 * PtPrmm), (Name: 'PRC Envelope #6 120 x 230 mm'; W: 120 * PtPrmm; H: 230 * PtPrmm), (Name: 'PRC Envelope #7 160 x 230 mm'; W: 160 * PtPrmm; H: 230 * PtPrmm), (Name: 'PRC Envelope #8 120 x 309 mm'; W: 120 * PtPrmm; H: 309 * PtPrmm), (Name: 'PRC Envelope #9 229 x 324 mm'; W: 229 * PtPrmm; H: 324 * PtPrmm), (Name: 'PRC Envelope #10 324 x 458 mm'; W: 324 * PtPrmm; H: 458 * PtPrmm), (Name: 'PRC 16K Rotated 215 x 146 mm'; W: 215 * PtPrmm; H: 146 * PtPrmm), (Name: 'PRC 32K Rotated 151 x 97 mm'; W: 151 * PtPrmm; H: 97 * PtPrmm), (Name: 'PRC 32K(Big) Rotated 151 x 97 mm'; W: 151 * PtPrmm; H: 97 * PtPrmm), (Name: 'PRC Envelope #1 Rotated 165 x 102 mm'; W: 165 * PtPrmm; H: 102 * PtPrmm), (Name: 'PRC Envelope #2 Rotated 176 x 102 mm'; W: 176 * PtPrmm; H: 102 * PtPrmm), (Name: 'PRC Envelope #3 Rotated 176 x 125 mm'; W: 176 * PtPrmm; H: 125 * PtPrmm), (Name: 'PRC Envelope #4 Rotated 208 x 110 mm'; W: 208 * PtPrmm; H: 110 * PtPrmm), (Name: 'PRC Envelope #5 Rotated 220 x 110 mm'; W: 220 * PtPrmm; H: 110 * PtPrmm), (Name: 'PRC Envelope #6 Rotated 230 x 120 mm'; W: 230 * PtPrmm; H: 120 * PtPrmm), (Name: 'PRC Envelope #7 Rotated 230 x 160 mm'; W: 230 * PtPrmm; H: 160 * PtPrmm), (Name: 'PRC Envelope #8 Rotated 309 x 120 mm'; W: 309 * PtPrmm; H: 120 * PtPrmm), (Name: 'PRC Envelope #9 Rotated 324 x 229 mm'; W: 324 * PtPrmm; H: 229 * PtPrmm), (Name: 'PRC Envelope #10 Rotated 458 x 324 mm'; W: 458 * PtPrmm; H: 324 * PtPrmm), (Name: 'Custom size'; W: 0; H: 0)); constructor TfrxPrinter.Create(const AName, APort: String); begin inherited Create(AName, APort); end; destructor TfrxPrinter.Destroy; begin inherited; end; procedure TfrxPrinter.Init; function FindLinuxPaper(w, h: Integer): Integer; var I: Integer; p: TPaperInfo; lw,lh: Integer; begin Result := 0; for I := 0 to Length(PaperInfo) - 1 do begin p := PaperInfo[I]; lw :=p.X; lh :=p.Y; if ((w >= lw - 6) and (w <= lw + 6)) and ((h >= lh - 6) and (h <= lh + 6)) then begin Result := I; Break; end; end; end; procedure FillPapers; var i,k: Integer; fw, fh: Integer; begin for I := 0 to PAPERCOUNT - 1 do begin fw := PaperInfo[I].X; fh := PaperInfo[I].Y; k := FindLinuxPaper(fw, fh); if k > 0 then FPapers.AddObject(LCLPaperInfo[i].Name, TObject(PaperInfo[k].Typ)); end; end; procedure AssignActivePrinter; var i: Integer; begin for i := 0 to FMX.Printer.Printer.Count - 1 do if TPrinterLinux(FMX.Printer.Printer).Printers[i].Device = Name then TPrinterLinux(FMX.Printer.Printer).ActivePrinter:= TPrinterLinux(FMX.Printer.Printer).Printers[i]; end; begin AssignActivePrinter; if FInitialized then Exit; UpdateDeviceCaps; FDefOrientation := TPrinterLinux(FMX.Printer.Printer).Orientation; FOrientation := FDefOrientation; FDefPaper := 256; FDefBin := 0; FDefDuplex := 0; FPaper := FDefPaper; FDefPaperWidth := FPaperWidth; FDefPaperHeight := FPaperHeight; FOrientation := FDefOrientation; FillPapers; FBin := -1; FDuplex := -1; FInitialized := True; FBin := -1; FDuplex := -1; FInitialized := True; end; procedure TfrxPrinter.Abort; begin TPrinterLinux(FMX.Printer.Printer).Abort; end; procedure TfrxPrinter.BeginDoc; begin FPrinting := True; FCanvas := TPrinterLinux(FMX.Printer.Printer).Canvas; FIsFirst := True; if FTitle <> '' then TPrinterLinux(FMX.Printer.Printer).Title := FTitle else TPrinterLinux(FMX.Printer.Printer).Title := 'Fast Report Document'; UpdateDeviceCaps; TPrinterLinux(FMX.Printer.Printer).BeginDoc; FCanvas := TPrinterLinux(FMX.Printer.Printer).Canvas; end; procedure TfrxPrinter.BeginPage; begin inherited; if not (FIsFirst) then begin TPrinterLinux(FMX.Printer.Printer).NewPage; TPrinterLinux(FMX.Printer.Printer).Canvas.BeginScene; end; FIsFirst := False; end; procedure TfrxPrinter.EndDoc; var LSettings: TFmuxPageSettings; begin TPrinterLinux(FMX.Printer.Printer).EndDoc; FmuxGetPageSettings(LSettings); FPaperWidth := LSettings.Width * 25.4 / 96; FPaperHeight := LSettings.Height * 25.4 / 96; {$IFDEF DELPHI25} try if TPrinterLinux(FMX.Printer.Printer).Canvas.BeginSceneCount > 0 then TPrinterLinux(FMX.Printer.Printer).Canvas.EndScene; except end; {$ELSE} TPrinterLinux(FMX.Printer.Printer).Canvas.EndScene; {$ENDIF} FPrinting := False; THackPrinter(FMX.Printer.Printer).FPrinting := False; FBin := -1; FDuplex := -1; end; procedure TfrxPrinter.EndPage; begin //todo end; procedure TfrxPrinter.BeginRAWDoc; begin //todo end; procedure TfrxPrinter.EndRAWDoc; begin //todo end; procedure TfrxPrinter.WriteRAWDoc(const buf: AnsiString); begin //todo end; procedure TfrxPrinter.SetViewParams(APaperSize: Integer; APaperWidth, APaperHeight: Extended; AOrientation: TPrinterOrientation); begin FPaper := APaperSize; FOrientation := AOrientation; if APaperSize <> 256 then begin FPaperHeight := LCLPaperInfo[FPaper].H; FPaperWidth := LCLPaperInfo[FPaper].W; if not UpdateDeviceCaps then Exit; end else begin // copy the margins from A4 paper SetViewParams(DMPAPER_A4, 0, 0, AOrientation); FPaperHeight := APaperHeight; FPaperWidth := APaperWidth; end; end; function TfrxPrinter.ShowPrintDialog: Boolean; begin Result := False; end; procedure TfrxPrinter.SetPrintParams(APaperSize: Integer; APaperWidth, APaperHeight: Extended; AOrientation: TPrinterOrientation; ABin, ADuplex, ACopies: Integer); var LPaperHeight, LPaperWidth: Double; begin { later fix these values } FPaper := APaperSize; if TPrinterLinux(FMX.Printer.Printer).Orientation <> AOrientation then begin if FPrinting then begin EndDoc; TPrinterLinux(FMX.Printer.Printer).Orientation := AOrientation; BeginDoc; end else TPrinterLinux(FMX.Printer.Printer).Orientation := AOrientation; end; LPaperHeight := FPaperHeight * FDPI.Y / 96; LPaperWidth := FPaperWidth * FDPI.X / 96; {$IFDEF DELPHI18} TPrinterLinux(FMX.Printer.Printer).Canvas.SetSize(Round(LPaperWidth), Round(LPaperHeight)); {$ELSE} TPrinterLinux(FMX.Printer.Printer).Canvas.ResizeBuffer(Round(LPaperWidth), Round(LPaperHeight); {$ENDIF} FOrientation := AOrientation; UpdateDeviceCaps; end; function TfrxPrinter.UpdateDeviceCaps: Boolean; var Idx: Integer; LSettings: TFmuxPageSettings; begin FCanvas := TPrinterLinux(FMX.Printer.Printer).Canvas; Idx := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.ActiveDPIIndex; if Idx <> -1 then begin FDPI.X := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.DPI[Idx].X; FDPI.y := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.DPI[Idx].Y; end else if TPrinterLinux(FMX.Printer.Printer).ActivePrinter.DPICount > 0 then begin FDPI.X := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.DPI[0].X; FDPI.y := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.DPI[0].Y; end else begin FDPI := System.Classes.Point(72, 72); end; FmuxGetPageSettings(LSettings); FPaperWidth := LSettings.Width * 25.4 / 96; // DPI / DPI FPaperHeight := LSettings.Height * 25.4 / 96; // DPI / DPI FLeftMargin := LSettings.Margins.Left * 25.4 / 96; // mm per Inch / DPI = mm FTopMargin := LSettings.Margins.Top * 25.4 / 96; // DPI FRightMargin := LSettings.Margins.Right * 25.4 / 96; // DPI FBottomMargin := LSettings.Margins.Bottom * 25.4 / 96; // DPI Result := True; end; procedure TfrxPrinter.PropertiesDlg; begin end; { TfrxPrinters } constructor TfrxPrinters.Create; begin Inherited; end; destructor TfrxPrinters.Destroy; begin inherited; end; function TfrxPrinters.GetDefaultPrinter: String; begin Result := TPrinterLinux(FMX.Printer.Printer).ActivePrinter.Device; end; procedure TfrxPrinters.FillPrinters; var i: Integer; procedure AddPrinter(ADevice, APort: String); begin FPrinterList.Add(TfrxPrinter.Create(ADevice, APort)); FPrinters.Add(ADevice); end; begin Clear; for i := 0 to TPrinterLinux(FMX.Printer.Printer).Count - 1 do AddPrinter(FMX.Printer.Printer.Printers[i].Device, TPrinterLinux(FMX.Printer.Printer).Printers[i].Port); end; function ActualfrxPrinterClass : TfrxCustomPrintersClass; begin Result := TfrxPrinters; end; initialization finalization end.