下面是我参考别人的资料后编写的单元文件,通过当中的设置纸张大小和定位输出可以做到较精确的打印,但连续的票据打印就可能有问题,到目前为止我还没有解决,希望各位高手指点。
unit Mysource;
interface
uses
Windows, Classes, SysUtils, Printers, Forms;
{自定义打印纸张 For Win9X 单位:mm }
Function SetPage(PW,PL: Integer): Boolean;
{精确定位打印输出过程 单位: mm }
Procedure PrintText(X,Y:Extended;Txt:string;FontName:string;FontSize:Integer=12);
implementation
{自定义打印纸张的函数 For Win9X 单位:mm }
Function SetPage(PW,PL: Integer): Boolean;
var
DeviceHandle:THandle;
PDMode
DeviceMode;
ADevice,ADriver,APort:array[0..255] of char;
begin
if PW<40 then
PW:=40;
{ 规定纸张的宽度最小为40mm }
if PW>400 then
PW:=400;
{ 规定纸张的宽度最大为400mm }
if PL<30 then
PL:=30;
{ 规定纸张的长度最小为30mm }
if PL>1000 then
PL:=1000;
{ 规定纸张的长度最大为1000mm }
Printer.GetPrinter(ADevice,ADriver,APort,DeviceHandle);
if DeviceHandle=0 then
begin
MessageBox(Application.Handle,'无法初始化打印机','提示信息',MB_OK+MB_ICONWARNING);
Result:=False;
exit;
end;
try
PDMode:=GlobalLock(DeviceHandle);
with PDMode^do
begin
dmFields:=dmFields or DM_PAPERSIZE ;
{ if Page = A5 then
}
// dmPaperSize:=DMPAPER_A5;
{ if Page = USER then
}
dmPaperSIZE:=DMPAPER_USER;
dmFields:=dmFields or DM_PAPERWIDTH ;
dmPaperWidth:=PW*10;
dmFields:=dmFields or DM_PAPERLENGTH ;
dmPaperLength:=PL*10;
end;
finally
GlobalUnLock(DeviceHandle);
end;
Result:=True;
end;
{结束函数}
{精确定位打印输出过程 单位: mm }
Procedure PrintText(X,Y:Extended;Txt:string;FontName:string;FontSize:Integer=12);
var
AV : Word;
Metrics : TTextMetric;
Px, Py, HP, VP, GY: Integer;
begin
HP:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
VP:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);
GY:=GetDeviceCaps(Printer.Handle,PhysicalOffsetY);
GetTextMetrics(Printer.Canvas.Handle,Metrics);
AV:=Metrics.tmAveCharWidth;
Px:=Round(Round(X*HP*10000/25.4)/10000);
Py:=Round(Round(Y*VP*10000/25.4)/10000);
Py:=Py-GY;
//因为是绝对坐标, 因此, 不用换算成相对于Y轴坐标
Px:=Px+2*AV;
Printer.Canvas.Font.Name:=FontName;
Printer.Canvas.Font.Size:=FontSize;
Printer.Canvas.TextOut(Px,Py,Txt);
end;
{结束函数}
end.
如果用QR报表打印,则必须先建立QR报表(自定义纸张,高度和宽度为需要打印的票据纸张大小),在QR中添加Title栏,将其宽度和高度设置QR的高度和宽度,在程序运行过程中,利用QRTable.Create等相关命令生成各个打印项目,但必须注意Parent,Font.Size,Font.Name等几个属性的值。