请教:在delphi中如何发送打印机控制码?在我的打印机操作面板上有一个功能按钮——换行,执行后打印机向前走纸0.5cm,我想在程序中调用这个换行功能,请高手指点如何实现?windows提供的escape可以给打印机发送控制码,其定义如下:
int Escape(
HDC hdc, // 打印机的handle
int nEscape, // escape 函数
int cbInput, // 输入结构的大小
LPCSTR lpvInData, // 输入结构的指针
LPVOID lpvOutData // 输出结构的指针
);
在这个定义中,第二个参数nEscape,我不清楚要传什么呢?说明文档说提到,这个参数必须是一个预先定义好的,windows下提供了如下的几个定义:ABORTDO;ENDDOC;GETPHYSPAGESIZE;GETPRINTINGOFFSET;GETSCALINGFACTOR;NEWFRAME;NEXTBAND;PASSTHROUGH;SETABORTPROC;STARTDOC;其中好像没有我需要的,用于换行的。在win32api的说明文档中也提到,对于常用的print escape都已经定义对应的方法,如:AbortDoc,EndDoc等,没有对应的用于换行的方法。同时也了解到,如果需要发送一些私有的print escape 需要用到extEscape函数,该函数的定义如下:int ExtEscape(
HDC hdc, //设备Handle
int nEscape, // escape function
int cbInput, // number of bytes in input structure
LPCSTR lpszInData, // pointer to input structure
int cbOutput, // number of bytes in output structure
LPSTR lpszOutData // pointer to output structure
);同样的,在这个函数的定义中,我不知道需要都要传入那些参数呢??
我的环境是delphi7.0/winXP/EPSON LQ-1600KIII请高手们关注。
int Escape(
HDC hdc, // 打印机的handle
int nEscape, // escape 函数
int cbInput, // 输入结构的大小
LPCSTR lpvInData, // 输入结构的指针
LPVOID lpvOutData // 输出结构的指针
);
在这个定义中,第二个参数nEscape,我不清楚要传什么呢?说明文档说提到,这个参数必须是一个预先定义好的,windows下提供了如下的几个定义:ABORTDO;ENDDOC;GETPHYSPAGESIZE;GETPRINTINGOFFSET;GETSCALINGFACTOR;NEWFRAME;NEXTBAND;PASSTHROUGH;SETABORTPROC;STARTDOC;其中好像没有我需要的,用于换行的。在win32api的说明文档中也提到,对于常用的print escape都已经定义对应的方法,如:AbortDoc,EndDoc等,没有对应的用于换行的方法。同时也了解到,如果需要发送一些私有的print escape 需要用到extEscape函数,该函数的定义如下:int ExtEscape(
HDC hdc, //设备Handle
int nEscape, // escape function
int cbInput, // number of bytes in input structure
LPCSTR lpszInData, // pointer to input structure
int cbOutput, // number of bytes in output structure
LPSTR lpszOutData // pointer to output structure
);同样的,在这个函数的定义中,我不知道需要都要传入那些参数呢??
我的环境是delphi7.0/winXP/EPSON LQ-1600KIII请高手们关注。
解决方案 »
- 一个很难解决的问题
- 扫描仪取页数和合并图片并且分页显示.
- 急!如何暂时掩盖纹身?
- dll导入的问题,急,请高手相助.在线等
- 关于将截断字符串或二进制数据
- 是高手就來領教一下吧
- ************************* 警钟长鸣,不忘国耻*******************************
- Virtual Treeview的用法(如何让它每支来勾选,或者遍历checkbox并判断是否打勾)---看了好几天都没搞好,郁闷之极!
- 救命啊,我实在没办法了,TABLE的问题!!!!!!
- xe8 连接用dbexpress连接sql2005报错
- delphi菜鸟求教~~~
- 帮侄子起名!!!!!!!!顶者有分!
这是票据打印一段代码(Epson LQ300K),仅供参考:
procedure PrintTicket(AStation,Achannel,Auserid,ATicketNo,
AMoney,APntdate,APnttime:string);stdcall;
var
F:TextFile;
...
begin
....
Assignfile(f,'LPT1');
rewrite(f);
{初始化打印机}
Write(f,chr(27)+'@'); //Chr(27)+'@' 即ESC @ 指令
{设置汉字显示方式}
write(f,chr(28)+chr(ord('&'))); //Chr(28) 即 FS
{设定打印相对水平位置}
Write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
//设置高速打印
//write(f,chr(28)+chr(ord('x'))+chr($01)); Writeln(f,PrintChannel+space(16)+Auserid+space(12)+carType);
Writeln(f);
write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
Write(f, AMoney);
Writeln(f,Space(26)+PrntTicketno);
Writeln(f);
write(f,chr(27)+chr(ord('\'))+chr($CF)+chr($00));
//Writeln(f);
Writeln(f,Apntdate+Space(12)+ApntTime);
//顺时针走纸控制
Writeln(f,chr(27)+chr(ord('J'))+chr($FF));
Writeln(f,chr(27)+chr(ord('J'))+chr($20)); flush(f);
Closefile(f);end;不同的打印机控制码会有所不同,具体参考打印机手册。》怎么让打印机在打印前后退2行,设定纸张的大小
将打印机纸张类型设为自定义,自定义纸张大小,
这类代码很多,搜索一下,以上也有给出了一些
至于,打印前后退2行,先将纸张在打印机装好,控制好
其装纸位置(可微调打印机),打印后重要的是走纸的控制,
最好是用控制码控制,实在没办法的话,你也可以用
writeln(f)
writeln(f)
这样的折行控制。>>//顺时针走纸控制
>>Writeln(f,chr(27)+chr(ord('J'))+chr($FF));
>>Writeln(f,chr(27)+chr(ord('J'))+chr($20));这个是我根据打印机控制码指令
执行n/180英寸顺方向走纸 Esc J n (1<=n<=255)
以及打印票据纸张的高度,来调整打印连续纸时的走纸长度。
另外,这里还有一些LQ300K的一些打印位置控制码指令:
设定高速打印 FS x n (n=0,1)
设定绝对水平打印位置 Esc ¥ nL nH (0<=nH<=127
0<=nL<=255)
设定相对水平打印位置 Esc \ nL nH (同上)供参考。具体你可以查看你的打印机手册。
方法就如你所说的,我都试了,和你代码唯一的区别是,你使用 Assignfile(f,'LPT1'); 打开打印机端口,而我使用
assignprn(f) 来打开打印机端口的,而实际上我的计算机因为是笔记本,所以打印机是通过usb口和打印机联系起来的,所以我想直接的操作 lpt1估计不行吧??
>>Writeln(f,chr(27)+chr(ord('J'))+chr($20));这两句代码中 J,和 $FF或者$20分别代表了什么阿??
从我的打印机手册中查到 ,换行是两个指令即:ESC + LF,对应的十进制编码也就是 27,10。
为什么你这里 中间会多一个 值呢??难道是打印机型号不同所致??
我的是 EPSON LQ-1600KIII