各位前辈:
我要实现打印票据的功能,票据的大小是:250mmX70mm,我在打印机设置里已经把纸张大小设为了250mmX70mm,可是打印机在走纸的时候只走68mm,这样我就实现不了精确打印了。但是很奇怪的是,我把大小设置成250mmX72mm,打印机竟然走纸正确,恰好是72mm,我就奇怪了,可是我不可能改票据大小啊。
希望熟悉delphi打印的高人帮我看下这个问题,给点建议怎么解决啊?或者说这是打印机的问题?
我现在的解决办法是每打一张,打印的位置就做相应的改变,但是问题又来了,连续打印多张票据的话,打印位置会超过票据设定好的大小,导致打印失败。 谢谢各位!
我要实现打印票据的功能,票据的大小是:250mmX70mm,我在打印机设置里已经把纸张大小设为了250mmX70mm,可是打印机在走纸的时候只走68mm,这样我就实现不了精确打印了。但是很奇怪的是,我把大小设置成250mmX72mm,打印机竟然走纸正确,恰好是72mm,我就奇怪了,可是我不可能改票据大小啊。
希望熟悉delphi打印的高人帮我看下这个问题,给点建议怎么解决啊?或者说这是打印机的问题?
我现在的解决办法是每打一张,打印的位置就做相应的改变,但是问题又来了,连续打印多张票据的话,打印位置会超过票据设定好的大小,导致打印失败。 谢谢各位!
解决方案 »
- 怎么得到dll图标数量
- 奇怪,窗体问题?
- 我不知道integer型转换为Char的函数是什么?请告知!!!!谢谢
- 精通串口通信的朋友请进
- stringgrid和dbcombobox的问题
- 使用Tquery进行查询,出现错误:When GROUP BY exists, every simple field in projectors must be in GROUP BY.这是怎么回事?
- 想自己写一个小型数据库的基本功能---因为在软件的数据库初始化很有用....But.....
- 怎样利用ShBrowseForFolder获取网络上其他机器的名称?
- installshield express for delphi5 打包的问题。
- ado的dataset为什么不能正常的close
- 怎么样向Excel表写数据
- 动态显示窗体的问题!
在程序里
if PageNum mod i =0 then
pageLength:=72
else
pageLength:=68 ;
就这样一页长一点,一页短一点,给客户测试,结果几百页就打出去没问题了
有位高人对TPrinter做封装 TRawprinter,可以在windows下连续进纸,贴出来给你参考。unit Rawprinter;interfaceuses printers,windows;type
TRawprinter =class(TPrinter)
public
dc2 : HDC;
procedure startraw;
procedure endraw;
procedure write(const s : string);
procedure writeln;
end;implementationuses sysutils,forms;function AbortProc(Prn: HDC; Error: Integer): Bool; stdcall;
begin
Application.ProcessMessages;
Result := not Printer.Aborted;
end;
type
TPrinterDevice = class
Driver, Device, Port: String;
constructor Create(ADriver, ADevice, APort: PChar);
function IsEqual(ADriver, ADevice, APort: PChar): Boolean;
end;
constructor TPrinterDevice.Create(ADriver, ADevice, APort: PChar);
begin
inherited Create;
Driver := ADriver;
Device := ADevice;
Port := APort;
end;
function TPrinterDevice.IsEqual(ADriver, ADevice, APort: PChar): Boolean;
begin
Result := (Device = ADevice) and (Port = APort);
end;
procedure TRawprinter.startraw;
var
CTitle: array[0..31] of Char;
CMode : Array[0..4] of char;
DocInfo: TDocInfo;
r : integer;
begin
StrPLCopy(CTitle, Title, SizeOf(CTitle) - 1);
StrPCopy(CMode, 'RAW');
FillChar(DocInfo, SizeOf(DocInfo), 0);
with DocInfo do
begin
cbSize := SizeOf(DocInfo);
lpszDocName := CTitle;
lpszOutput := nil;
lpszDatatype :=CMode;
end;
with TPrinterDevice(Printers.Objects[PrinterIndex]) do
begin
DC2 := CreateDC(PChar(Driver), PChar(Device), PChar(Port), nil);
end;
SetAbortProc(dc2, AbortProc);
r:=StartDoc(dc2, DocInfo);
end;
procedure TRawprinter.endraw;
var r : integer;
begin
r:=windows.enddoc(dc2);
end;
type passrec = packed record
l : word;
s : Array[0..255] of char;
end;
var pass : Passrec;
procedure TRawprinter.write(const s : string);
begin
pass.l:=length(s);
strpcopy(pass.s,s);
escape(dc2,PASSTHROUGH,0,@pass,nil);
end;
procedure TRawprinter.writeln;
begin
pass.l:=2;
strpcopy(pass.s,#13#10);
escape(dc2,PASSTHROUGH,0,@pass,nil);
end;end.
分毫不差!!!不过打印机要有硬字库!!