我需要在一张A4纸上打印两页。我正在使用PrinterSetupDialog组件来设置打印机选项。然后我使用下面的代码打印两页,但两者都在单独的A4纸上。
我做错了什么?
我正在使用Delphi XE8,这是Firemonkey应用程序。
问候。
简单的打印程序:
var
SrcRect, DestRect: TRectF;
vBitmap: TBitmap;
begin
if PrinterSetupDialog1.Execute then
begin
Printer.ActivePrinter.SelectDPI(1200, 1200);
{ Set canvas filling style. }
Printer.Canvas.Fill.Color := TAlphaColorRec.White;
Printer.Canvas.Fill.Kind := TBrushKind.Solid;
{ Start printing. }
Printer.BeginDoc;
{ Set the Destination TRects. }
DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);
vBitmap := TBitmap.Create;
try
{ Page 1 }
vBitmap.LoadFromFile('D:\Page1.bmp');
SrcRect.Width := vBitmap.Width;
SrcRect.Height := vBitmap.Height;
{ Print the picture on all the surface of the page and all opaque. }
Printer.Canvas.DrawBitmap(vBitmap, SrcRect, DestRect, 1);
{ Page 2 }
vBitmap.LoadFromFile('D:\Page2.bmp');
SrcRect.Width := vBitmap.Width;
SrcRect.Height := vBitmap.Height;
{ Add new Page}
Printer.NewPage;
{ Print the picture on all the surface of the page and all opaque. }
Printer.Canvas.DrawBitmap(vBitmap, SrcRect, DestRect, 1);
finally
vBitmap.Free;
end;
{ Finish printing job. }
Printer.EndDoc;
end;
end;
删除SelectDPI
行不会给我带来任何结果。
但是我在VCL上制作了这个代码并且它有效。
var
SrcRect, DestRect: TRect;
vBitmap: TBitmap;
begin
if PrinterSetupDialog1.Execute then
begin
Printer.BeginDoc;
DestRect := Rect(0, 0, Printer.PageWidth, Printer.PageHeight);
vBitmap := TBitmap.Create;
try
vBitmap.LoadFromFile('D:\Page1.bmp');
SrcRect := Rect(0, 0, vBitmap.Width, vBitmap.Height);
Printer.Canvas.CopyRect(DestRect, vBitmap.Canvas, SrcRect);
Printer.NewPage;
vBitmap.LoadFromFile('D:\Page2.bmp');
SrcRect := Rect(0, 0, vBitmap.Width, vBitmap.Height);
Printer.Canvas.CopyRect(DestRect, vBitmap.Canvas, SrcRect);
finally
vBitmap.Free;
end;
Printer.EndDoc;
end;
end;
我在VCL中编写了一个打印模块解决了这个问题,但我将描述我的观察结果。
我认为这是我的Delphi版本的错误,来自FMX.Printer.TPrintDialog
的设置
打印时忽略FMX.Printer.TPrinterSettupDialog
。但这个组件
对于Windows,在VCL版本中运行正常。
我在MAC上进行了测试,它仅适用于FMX.Printer.TPrintDialog
,TPrinterSettupDialog
没有出现。
问候。
答案 0 :(得分:0)
问题的原因是行
Printer.ActivePrinter.SelectDPI(1200, 1200);
这会将Pages per sheet
设置重置为1(可能/可能还有其他属性)。删除线路可以解决问题。
DPI设置在我系统上的所有打印机设置对话框中都可用,也许您可以在设置其他属性时将其留给用户负责。无论如何,我不会将这样的设置硬编码。