592 lines
20 KiB
ObjectPascal
592 lines
20 KiB
ObjectPascal
|
{******************************************}
|
||
|
{ }
|
||
|
{ 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.
|