急,票据打印问题。(100分)

  • 主题发起人 主题发起人 dqwalen
  • 开始时间 开始时间
D

dqwalen

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个汽车客运程序时遇到问题,打印车票的连续走纸不准确,我用的是D5编程,四通5530票据专用打印机,车票的规格为121X70(宽度为121mm,长度为70mm)。我试过用TPrinter和QuickReport做打印,但都失败了。只放一张票打印可以很精确地打印在指定位置,但装上连续发票纸后,走纸就不同了,如果长度设为70mm,每多打印一张车票就向上移动2-3mm,这样多打印几张车票就乱了,请各位高手指点。可以的话将源码或例子发送给我。Email:walen@21cn.com
 
你是调用Tprinter打印吗?对字体和大小有没有要求?我也有这样的问题,希望有高手能解答
 
我试过调用Tprinter类打印,同QR打印的效果都差不多,使用连续走纸打印时都有较大的偏差,我在考虑是否需要控制打印机来控制走纸量,但我不知怎么做,我听说有人曾经解决过这样的问题,为什么现在不见出现的呢?
 
你用QR也能打印吗?想请教一下如何设置?操作系统是什么?‘有人曾经解决过这样的问题‘吗?好像不能改变字体吧?其余好像倒是可以实现!迫切想知道!!!
 
To wzpwb:
我用的是Win98系统,先建立一个QR的窗体框架,程序调用打印时用Create建立,控件在运行时动态生成,通过设置Font.Size和Font.Name可以独立设置每一个打印项,具体的源代码我一时没有在身边,过些时候再贴上来或Email给你。
 
dqwalen:兄
小弟也非常非常需要这个源代码!能否也给小弟一份Email:qw1970@163.com.小弟先谢了!
 
我做过这样的打印方法,我是直接控制Printer的,但中间加了一个偏差变量,因为偏差是少不了的,只能用偏差变量去控制它。
 
直接打印,write....
 
参考一下:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2003505
 
WIN98下的設置我沒有用過,可是在WIN2000下,我用自定億的方式可以實現。
不會走位的。
 
你可以把纸张的大小调整到合适的高度。
 
在win98下好解决,将打印机的纸张设置为自定义,然后调整到最大值,无法打印区域都为0,另外可以可以将打印机设置为自动进纸的功能。
如果还不行,可以采取变通的方式,设计两张报表,一张的位置为走纸长一点,另一张为走纸短点的,两张交替使用。
 
hds6400:
我也试过你提供的方法,但还是走纸不准确,打印超过4张票就有较明显的偏差(或上移;或下移),不知道是不是我的打印机有问题,我用的是四通CS5530票据打印机。
 
下面是我参考别人的资料后编写的单元文件,通过当中的设置纸张大小和定位输出可以做到较精确的打印,但连续的票据打印就可能有问题,到目前为止我还没有解决,希望各位高手指点。
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:PDeviceMode;
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等几个属性的值。
 
以前遇到过用FR打印连续纸的问题
打印机有个最小走纸,EpsonLQ300K好象是90mm
看看说明书
 
后退
顶部