对于很小的票据,打印起来很难套格式,连续打印时错位会很严重,这样我们可以用黑标检测来解决这个问题,当打印机打印完一张票据时就检测黑标,这样打印机将会停在检测到的黑标后面,打印一下张时将不会跑位。
黑标打印需要的条件:
1、打印机要支持黑标发票。打印说明书中可以查到。
2、行矩要跟据打印机来定,一般打印字体一样时,不同的打印机行矩会一样的。
下面是一个示例:
unit PrintHBUnit;
interface
uses SysUtils, IniFiles, windows, Forms, Dialogs, Classes;
//定义打印的记录类型
type
TPrintObj = record
Hbsbh: string;
Dffsny: string;
Khmc: string;
Khdz: string;
Dbcbh1: string;
Jsbl1: string;
Scbm1: string;
Bcbm1: string;
Dbcbh2: string;
Jsbl2: string;
Scbm2: string;
Bcbm2: string;
Dbcbh3: string;
Jsbl3: string;
Scbm3: string;
Bcbm3: string;
YDFLBH1: string;
YDFLBH2: string;
YDFLBH3: string;
Fldl1: string;
Fldl2: string;
Fldl3: string;
Fldj1: string;
Fldj2: string;
Fldj3: string;
Shdl1: string;
Shdl2: string;
Shdl3: string;
FlDF1: string;
FlDF2: string;
FlDF3: string;
DDDF1: string;
DDDF2: string;
DDDF3: string;
HjDL: string;
HjDF: string;
Scjy: string;
Bcss: string;
Bcxz: string;
Bcjy: string;
Ssdx: string;
Cby: string;
Sky: string;
Fphm: string;
Rq: string;
sswyj: string;
dyqdf : string;
BlackMark: string;
tbdf :string;
dddf:String;//电度电费
fldf:String;
end;
var
PrintObj: TPrintObj;
MyFile: TIniFile;
I:integer;//为1时代表已取电价,否则取电价
mldjList:Tstrings;
ydflbhList:Tstrings;
procedure SetPrintObj;
procedure pdrPrintObj(zs_bz:String='0');
procedure GetBlackMark;
function JeToDx(v_je: real): String;// 报表用的金额大写转换函数
implementation
uses DB;
function JeToDx(v_je: real): String;// 报表用的金额大写转换函数
var
l,i: integer;
je_zs, je_xs, dx, dw, s, s1, dx_je: string;
bFs:boolean;
begin
If v_je=0 Then
Begin
Result:='零元整';
Exit;
End;
if v_je<0 then
begin
bFs:=True;
v_je:=(-1)*v_je;
end
else bFs:=False;
je_zs:='';
je_xs:='';
if round(v_je)*100=v_je*100 then je_zs:=FloatToStr(v_je)
else
begin
s:=FloatToStr(v_je*100);
je_zs:=Copy(s,1,length(s)-2);
je_xs:=Copy(s,length(je_zs)+1,2);
if je_zs='' then je_zs:='00';
if je_xs='' then je_xs:='00';
end;
dx:='零壹贰叁肆伍陆柒捌玖';
dw:='元拾佰仟万拾佰仟亿';
dx_je:='';
if je_zs<>'' then
begin
l:=length(je_zs);
s1:='';
for i:=1 to l do
begin
s:=Copy(dx,StrToInt(Copy(je_zs,i,1))*2+1,2);
if s<>'零' then
begin
dx_je:=dx_je+s;
dx_je:=dx_je+Copy(dw,(l-i)*2+1,2);
end
else if s1<>'零' then dx_je:=dx_je+'零';
if i=(l-4) then
begin
s:=Copy(dx_je,length(dx_je)-1,2);
if s='零' then dx_je:=Copy(dx_je,1,length(dx_je)-2);
if s<>'万' then dx_je:=dx_je+'万';
end;
s1:=s;
end;
s:=Copy(dx_je,length(dx_je)-1,2);
if s='零' then dx_je:=Copy(dx_je,1,length(dx_je)-2);
if s<>'元' then dx_je:=dx_je+'元';
end;
if je_xs='' then dx_je:=dx_je+'整'
else
begin
if Copy(je_xs,1,1)<>'0' then
begin
if Copy(je_xs,2,1)<>'0' then
begin
if length(je_xs)=1 then je_xs:='0'+je_xs;
dx_je:=dx_je+Copy(dx,StrToInt(Copy(je_xs,1,1))*2+1,2)+'角';
dx_je:=dx_je+Copy(dx,StrToInt(Copy(je_xs,2,1))*2+1,2)+'分';
end
else dx_je:=dx_je+Copy(dx,StrToInt(Copy(je_xs,1,1))*2+1,2)+'角整';
end
else
begin
dx_je:=dx_je+'零'+Copy(dx,StrToInt(Copy(je_xs,2,1))*2+1,2)+'分';
end;
end;
if copy(dx_je,1,2)='元' then dx_je:='零'+dx_je;
if bFs then dx_je:='负'+dx_je;
Result:=dx_je;
end;
procedure GetBlackMark;
var
BlackMark: string;
begin
//从INI文件中读取黑票类型
MyFile := Tinifile.create(ExtractFilePath(Application.ExeName)+'ydgl.ini');
try
BlackMark := MyFile.ReadString('Print', 'PrintType', '');
if Length(BlackMark) <> 0 then
PrintObj.BlackMark := BlackMark
else
begin
Application.MessageBox('已自动配置ydgl.ini文件,默认打印机类型为:BS-310K,请检查!', '提示', MB_OK);
MyFile.WriteString('Print', 'PrintType', 'BS-310K');
end;
finally
MyFile.Free;
end;
end;
procedure SetPrintObj;
begin
with PrintObj do
begin
Hbsbh := '0123456789';
Dffsny := '200401';
Khmc := '测试用户';
Khdz := '南昌市';
Dbcbh1 := 'A0001';
Jsbl1 := '1';
Scbm1 := '100';
Bcbm1 := '150';
Dbcbh2 := 'A0002';
Jsbl2 := '1';
Scbm2 := '10';
Bcbm2 := '110';
Dbcbh3 := '';
Jsbl3 := '';
Scbm3 := '';
Bcbm3 := '';
Fldl1 := '150';
Fldl2 := '';
Fldl3 := '';
Fldj1 := '0.50';
Fldj2 := '';
Fldj3 := '';
Shdl1 := '';
Shdl2 := '';
Shdl3 := '';
FlDF1 := '75.00';
FlDF2 := '';
FlDF3 := '';
DDDF1 := '75.00';
DDDF2 := '';
DDDF3 := '';
HjDL := '150';
HjDF := '75.00';
Scjy := '0';
Bcss := '100.00';
Bcxz := '75.00';
Bcjy := '25.00';
Ssdx := '壹佰元整';
Cby := '小王';
Sky := '小李';
Fphm := '001';
Rq := '2004-01-30';
sswyj:='0';
dyqdf:='';
dddf:='';
fldf:='';
end;
end;
procedure pdrPrintObj(zs_bz:String='0');
var
lpt: TextFile;
str,Other:String;
begin
AssignFile(lpt, 'LPT1');
try
ReWrite(lpt);
with PrintObj do
begin
BlackMark:='SP512MC';
if UpperCase(BlackMark)=UpperCase('SP512MC') then
begin
Writeln(lpt, '');
Writeln(lpt, Format(' %S', [sswyj]));
Writeln(lpt, Format(' %S %S', [Hbsbh, dffsny]));
Writeln(lpt, Format(' %S', [Khmc]));
Writeln(lpt, Format(' %S', [Khdz]));
Writeln(lpt, Format(' %-11S%-11S%-11S', [Dbcbh1,Dbcbh2,Dbcbh3]));
Writeln(lpt, Format(' %-11S%-11S%-11S', [Jsbl1,Jsbl2,Jsbl3]));
Writeln(lpt, Format(' %-11S%-11S%-11S', [Scbm1,Scbm2,Scbm3]));
Writeln(lpt, Format(' %-11S%-11S%-11S', [Bcbm1,Bcbm2,Bcbm3]));
Writeln(lpt, '');
Writeln(lpt, Format('%-11S%-11S%-11S%S', [Fldl1, Shdl1, Fldj1,
Fldf1]));
Writeln(lpt, Format('%-11S%-11S%-11S%S', [Fldl2, Shdl2, Fldj2,
Fldf2]));
Writeln(lpt, Format('%-11S%-11S%-11S%S', [Fldl3, Shdl3, Fldj3,
Fldf3]));
Writeln(lpt, Format(' %-20S%S', [Hjdl, Hjdf]));
//zs_bz:走收标致"1"为走收,"0"非走收
if zs_bz='0' then
begin
Writeln(lpt, Format(' %-20S%S', [Scjy, Bcss]));
Writeln(lpt, Format(' %-20S%S', [Bcxz, Bcjy]));
Writeln(lpt, Format(' %S', [Ssdx]));
end
else
begin
Writeln(lpt, Format(' %-20S%S', ['', Hjdf]));
Writeln(lpt, Format(' %-20S%S', [Hjdf, '']));
Writeln(lpt, Format(' %S', [JeToDx(StrToFloatDef(Hjdf,0))]));
end;
Writeln(lpt, Format(' %-15S%-15S%S', [Cby, Sky, Rq]));
Writeln(lpt, '');
Writeln(lpt, Format(' %S', [Fphm]));
Writeln(lpt, Format(' %-24S%S', [Hbsbh, dffsny]));
if zs_bz='0' then
begin
Writeln(lpt, Format(' %-24S%S', [Bcss, Bcjy]));
end
else
begin
Writeln(lpt, Format(' %-24S%S', [Hjdf+JeToDx(StrToFloatDef(Hjdf,0)), '']));
end;
Writeln(lpt, Format(' %-23S%S', [Sky, Rq]));
//发送黑标指令
Write(lpt, #12);
end
end;
finally
CloseFile(lpt);
end;
end;
end.