Delphi XE8 Firemonkey PrinterSetupDialog在一张A4上有两页

时间:2017-04-24 07:39:43

标签: delphi firemonkey delphi-xe8

我需要在一张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;

1更新

删除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;

2更新

我在VCL中编写了一个打印模块解决了这个问题,但我将描述我的观察结果。

我认为这是我的Delphi版本的错误,来自FMX.Printer.TPrintDialog的设置 打印时忽略FMX.Printer.TPrinterSettupDialog。但这个组件 对于Windows,在VCL版本中运行正常。 我在MAC上进行了测试,它仅适用于FMX.Printer.TPrintDialogTPrinterSettupDialog 没有出现。

问候。

1 个答案:

答案 0 :(得分:0)

问题的原因是行

Printer.ActivePrinter.SelectDPI(1200, 1200);

这会将Pages per sheet设置重置为1(可能/可能还有其他属性)。删除线路可以解决问题。 DPI设置在我系统上的所有打印机设置对话框中都可用,也许您可​​以在设置其他属性时将其留给用户负责。无论如何,我不会将这样的设置硬编码。