套打证件时打印机进纸太多,如何在程序中控制打印机退纸(100分)

  • 主题发起人 主题发起人 beamgx
  • 开始时间 开始时间
B

beamgx

Unregistered / Unconfirmed
GUEST, unregistred user!
由于打印机类型太杂,不能直接用assign(filepoint,'lpt')来调用打印机的专用指令,
能不能用API解决问题?
 
不可以。
建议最好用同一品牌的printer
 
能告诉我吗,我也正在为这问题大伤脑筋!
 
增加一个打印选项:上边距。每台工作站可以自己调整,将调整后的值写入一个
INI文件或者注册表中,下次打印时再调用不就行了。
 
好像不可以吧。
 
to qingzhong
我不是这个意思。我想要的是:在DELPHI中用WINDOWS API控制打印机退纸。
因为在证件打印中,就算你把边距设为0,而在某些打印机进纸时也会把纸张走的太多。
而你总不能把边距设为负数吧。
 
是针式打印机的话直接使用控制码来控制进纸、换行、换页。
 
我为这事前天一休没睡, 不过现在搞出来了,给你看看源代码, 我用了好多方法, 问过不少人了没解决,
后来我自己只得通过控制码来控制, 你的打印机有控制码, 不同的打印机有不同的方法,稍等一下我需复制源代码
 
unit bb;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, QuickRpt, QRCtrls, jpeg,printers,winspool,StdCtrls,strutils;
type
TForm5 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form5: TForm5;
implementation
uses Unit1;
var
PrnHwnd:THandle;
// chs0=$1B,$26,$03,$57,0;//中文(普通)
// chs1=$1B,$26,$03,$57,1;//中文(四倍)
// eng=$1C,$2E,$1C,$57,0;//英文(普通)
// eng=$1C,$2E,$1C,$57,1;//英文(四倍)
// cut=$1B,$69;//切纸
// hl=$0A;//换行
// cr=$0D];//回车
// sp=$1B,$21,2;//字间间隔
// lsp=$1B,$32;//行间间隔
// hom=$1B,$3C;//行首
{$R *.dfm}
procedure OpenLptPrn(hp:string);
begin
PRNHwnd:=CreateFile(Pchar(hp), GENERIC_READ or GENERIC_WRITE,0,nil, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if PRNHwnd=INVALID_HANDLE_VALUE then
Exception.Create('无效并行口');
end;

procedure delay(n:integer);//延时
var t:Tdatetime;
begin
t:=time;
repeat
//
until time>=t+n/24/60/60/1000;
end;

procedure SendToPrinter(SendBuf:array of byte);overload
var
tem:cardinal;
begin
WriteFile(PRNHwnd,SendBuf,High(SendBuf)+1,tem,nil);
end;

procedure SendToPrinter0(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf)do
begin
if a=0 then
begin
if (ord(SendBuf)>0)and(ord(SendBuf)<128) then
begin
SendToPrinter([$1C,$2E,ord(SendBuf)]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf),ord(SendBuf[i+1])]);
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$1C,$2E,ord(' '),$0A]);
end;

procedure TForm1.Button1Click(Sender: TObject);
//点击就打印
var i,Linesl,Linedel:integer;
begin
Form1.ADOTable3.First;
OpenLptPrn('LPT1:');
SendToPrinter0(' 人事管理系统 ');
SendToPrinter0('-----------------------------');
SendToPrinter0(' 日期:'+datetostr(date())+gwb1);
SendToPrinter0(' 时间:'+timetostr(now())+' Tel:66200871');
For i:=1 to 8do
sendtoprinter([$0A]);
//8行回车
fileclose(PRNHwnd);
end;

end.
 
谢谢各位!我已经说服领导把所有打印机换成统一的型号了!
 
结果是社会工程学的胜利,讽刺啊!
 
换成统一的型号好啊
不用为不同的打印机控制码写不同的代码
只用ESC/P就OK
省心
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
571
import
I
后退
顶部