[FMX] 在 FMX 中手动控制打印机打印内容

好吧,先说下版本:10.1.2,然后说遇到的两个 Bug:

一、字体大小的问题

打印机的字体大小错误,比如设置为10.5(五号字的大小,3.7mm),你会发现打印出的字特别小,根本与实际设置不搭别。所以在 10.1.2 时,输出文本时的字体大小需要按以下公式计算下:

字体磅数 × DPI/72

然后就没有问题了,比如现在是 10.5,那么设置 TTextLayout 的字体大小应为:

ATextLayout.Font.Size := 10.5 *DPI/72

AOne 测试说是 10.2 解决了这个问题,但我没有测试,10.2 的朋友可以实际测试。

二、打印份数的问题

通过调用打印对话框设置打印份数时,始终返回0,那么解决这个问题,只需要将 FMX.Dialogs.Win 的 TFMXDialogService.DialogPrint 的 1368 行后面,加上

ACopies:=PrintDlgRec.nCopies;

好吧,在好用的 FMX 报表组件出来之前,如果你有兴趣,可以按下面的步骤来做报表:

1、通过 Printer.ActivePrinter.SelectDPI 来选择输出的 DPI,该函数会选择最接近的 DPI,你只是要告诉系统想要的就可以了。

2、通过 Printer.ActivePrinter.ActiveDPI 获得实际的 DPI,然后我们将它转换为 PPM(每毫米像素数,DPI/25.4),以便好计算实际的坐标位置,毕竟中国人更习惯毫米,而不是英寸。

3、调用 Printer.BeginDoc 开始一个打印作业。

4、设置 Printer.Canvas 的相关绘图参数,注意线宽不要用1,要换算成真正的物理尺寸,如 0.25mm(前面的PPM有用了)。

5、如果要输出文本,你就得创建TTextLayout对象的实例,用方法:

TTextLayoutManager.TextLayoutByCanvas(ACanvas.ClassType).Create(ACanvas)

注意一点,输出文本的字体信息,要设置这个 TTextLayout 实例的,而不是 Printer.Canvas 的。另外就是完事时虽忘了释放对象。

6、 正常调用 Printer.Canvas 的绘图函数和 TTextLayout 的 RenderLayout 来绘制你的内容。前面 PPM 的值有了,坐标位置自己也就好计算了。

7、如果需要换页,调用 Printer.NewPage。

8、调用 Printer.EndDoc 结束打印。

实际手工调用打印的函数来绘制报表,实际上并不比用第三方报表麻烦太多,主要的问题就是需要计算坐标,理清了也就好了,实际打印效果还是比较完美的。

分享到: