快来呀,救命呀!Win98下套打发票问题。(200分)

  • 主题发起人 主题发起人 xixixi
  • 开始时间 开始时间
X

xixixi

Unregistered / Unconfirmed
GUEST, unregistred user!
在Win98+Delphi5下我用TPrinter套打发票,打印机为AR3200+。
发票格式为2440*700(宽*高,0.1mm),打印机纸张来源设为链式送纸,纸张大小
为自定义2440*700。
为什么打印后的实际纸张高度和设置时的高度不一样,调试中在
宽度为700---719之间误差由3mm缩小为2mm(此时实际纸张为设置纸张短),
在720--749之间误差为2mm(此时实际纸张为设置纸张长),
而且打印出的纸张之间距离也不完全相同,第一和第二张之间的误差要大一点,
在宽度大于750mm后纸宽度才和设置时宽度一致,也没有误差了。
采用QReprot时也有这种情况。
下面是我的打印部份代码
begin
...
for I := 1 to stringgrid.rowcount - 1do
begin
printer.begin
Doc;
printer.canvas(x,y,'');

...
printer.EndDoc;
end;
...
end;
 
采用直接打印最省事。
查以前的资料已很清楚了。
 
to:aerobull
以前的资料,能详细一些吗?万分感谢!!!
 
将系统打印机同时也设置为自定义纸张,同时要注意打印机的不可打印区域.
 
低级但有效的方法:
Printer.Title := '打印专用发票:' + fphm.Text + ' 开票人:' + zd.Text;
Printer.begin
Doc;
Printer.Canvas.Font.Name := '宋体';
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.Font.Size := 11;
Printer.Canvas.TextOut(Y + 812, X + 206, Copy(kprq.Text, 7, 4) + '年' +
Copy(kprq.Text, 1, 2) + '月' +
Copy(kprq.Text, 4, 2) + '日');
Printer.Canvas.TextOut(Y + 1356, X + 265, Copy(khrq.Text, 7, 4) + '年' +
Copy(khrq.text, 1, 2) + '月' +
Copy(khrq.text, 4, 2) + '日');
Printer.Canvas.TextOut(Y + 162, X + 312, qyg.Text);
Printer.Canvas.TextOut(Y + 768, X + 312, xhg.Text);
Printer.Canvas.TextOut(Y + 1322, X + 312, mdg.Text);
if Paym.Text = '人民币' then
Printer.Canvas.TextOut(Y + 1225, X + 770, '¥' + jehj.DisplayText)
else
Printer.Canvas.TextOut(Y + 1225, X + 770, PayM.Text + jehj.DisplayText);
Printer.EndDoc;
end;

 
同意plwei 同时注意纸张格式。
 
每个页面都有不可打印区域,用以下函数可以得到不可打印区域,当然纸张大小不一样,
不可打印区域也不一样。
GetDeviceCaps(printer.Handle,PHYSICALOFFSETX);
GetDeviceCaps(printer.Handle,PHYSICALOFFSETY);
 
看看http://www.delphibbs.com/delphibbs/dispq.asp?lid=584736里面lyfwz的代码。
也是针对AR打印机的。
其中设置纸张大小如下:
//设置纸张大小
procedure printer_set;
var
Device:Array[0..256] of Char;
Driver:Array[0..256] of Char;
Port:Array[0..32] of Char;
hDMode:THandle;
pDMode:PDevMode;
begin
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode<>0 then
pDMode:=GLobalLock(hDMode);
if pDMode<>nil then
begin
pDMode^.dmPaperSize:=256;
pDMode^.dmPaperLength:=900;
pDMode^.dmPaperWidth:=2900;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERLENGTH;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERWIDTH;
end;
ResetDC(Printer.Handle,pDMode^);
GLobalUnLock(hDMode);
end;

 
接受答案了.
 
后退
顶部