填充式发票打印 ( 积分: 100 )

  • 主题发起人 主题发起人 小算盘
  • 开始时间 开始时间

小算盘

Unregistered / Unconfirmed
GUEST, unregistred user!
哪位大虾能指点一下关于超市收银税控发票的打印问题,发票上有黑标,打印机为star sp500型号,类似超市的打印机,送上100分。
 
哪位大虾能指点一下关于超市收银税控发票的打印问题,发票上有黑标,打印机为star sp500型号,类似超市的打印机,送上100分。
 
我近期也要做个类似的项目,涉及到填充式的打印,正在考虑怎么打印的问题,希望和搂主交流一下。。。
同时期待大家多多给出好的方案。。。。。
 
我有这一部分的程序,只是目前程序不在这台机器上,明天给你!
 
我认为主要是两个问题:
1、控制打印机在指定的某个位置打印内容(因为打印纸的格式已固定),就是在特定的位置开始打印字符串。
2、控制打印机走纸,就是说第一行打完,再打第二行。
不知道说的对不对,欢迎您的指教。。。。。。
 
//取得字符的高度
function change(s:string):string;
var
len,pa:integer;
begin
len:=length(s);
pa:=pos('.',s);
if (pa<>0)then
case len-pa of
1:change:=s+'0';
2:change:=s;
else
begin
messagedlg('数据输入有错,可能是小数点后的位数!',mtwarning,[mbok],0);
s:='0';
change:=s;
end;
end
else
change:=s+'.00'
end;

function charheight:word;
var
metrics:ttextmetric;
begin
gettextmetrics(printer.handle,metrics);
result:=metrics.tmHeight;
end;

//取得字符的平均宽度
function avgcharwidth:word;
var
metrics:ttextmetric;
begin
gettextmetrics(printer.canvas.handle,metrics);
result:=metrics.tmAveCharWidth;
end;

//取得纸张的物理尺寸--单位:点
function getphicalpaper:Tpoint;
var
pagesize:tpoint;
begin
//pagesize.x:纸张物理宽度-单位:点
//pagesize.y:纸张物理高度-单位:点
escape(printer.handle,GETPHYSPAGESIZE,0,nil,@pagesize);
result:=pagesize;
end;

//取得纸张的逻辑宽度-可打印区域
//取得纸张的逻辑尺寸
function paperlogicsize:tpoint;
var
apoint:tpoint;
begin
apoint.x:=printer.PageWidth;
apoint.y:=printer.PageHeight;
result:=apoint;
end;

//纸张水平对垂直方向的纵横比例
function hvlogincratio:extended;
var
ap:tpoint;
begin
ap:=paperlogicsize;
result:=ap.y/ap.x;
end;

//取得纸张的横向偏移量-单位:点
function getoffsetx:integer;
begin
result:=getdevicecaps(printer.handle,physicaloffsetx);
end;

//取得纸张的纵向偏移量-单位:点
function getoffsety:integer;
begin
result:=getdevicecaps(printer.handle,physicaloffsety);
end;

//毫米单位转换为英寸单位
function mmtoinch(length:extended):extended;
begin
result:=length/25.4;
end;

//英寸单位转换为毫米单位
function inchtomm(length:extended):extended;
begin
result:=length*25.4;
end;

//取得水平方向每英寸打印机的点数
function hpointsperinch:integer;
begin
result:=getdevicecaps(printer.handle,LOGPIXELSX);
end;

//取得纵向方向每英寸打印机的光栅数
function vpointsperinch:integer;
begin
result:=getdevicecaps(printer.handle,LOGPIXELSY);
end;

//横向点单位转换为毫米单位
function xpointtomm(pos:integer):extended;
begin
result:=pos*25.4/hpointsperinch;
end;

//纵向点单位转换为毫米单位
function ypointtomm(pos:integer):extended;
begin
result:=pos*25.4/vpointsperinch;
end;

procedure setpaperheight(value:integer);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:thandle;
pdmode:pdevmode;
begin
//自定义纸张最小高度127mm
if value<27 then
value:=27;
//自定义纸张最大高度432mm
if value>432 then
value:=432;
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(device,driver,port,hdmode);
if hdmode<>0 then
begin
pdmode:=globallock(hdmode);
if pdmode<>nil then
begin
pdmode^.dmFields:=pdmode^.dmFields or dm_papersize or
dm_paperlength;
pdmode^.dmPaperSize:=dmpaper_user;
pdmode^.dmPaperLength:=value*10;
pdmode^.dmFields:=pdmode^.dmFields or dmbin_manual;
pdmode^.dmDefaultSource:=dmbin_manual;
globalunlock(hdmode);
end;
end;
printer.PrinterIndex:=printer.PrinterIndex;
end;

//设置纸张宽度-单位:mm
procedure setpaperwidth(value:integer);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:thandle;
pdmode:pdevmode;
begin
//自定义纸张最小宽度70mm
if value<70 then
value:=70;
//自定义纸张最大宽度216mm
if value>216 then
value:=216;
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(device,driver,port,hdmode);
if hdmode<>0 then
begin
pdmode:=globallock(hdmode);
if pdmode<>nil then
begin
pdmode^.dmFields:=pdmode^.dmFields or dm_papersize or
dm_paperlength;
pdmode^.dmPaperSize:=dmpaper_user;
//将毫米单位转换为0.1mm单位
pdmode^.dmPaperLength:=value*10;
pdmode^.dmFields:=pdmode^.dmFields or dmbin_manual;
pdmode^.dmDefaultSource:=dmbin_manual;
globalunlock(hdmode);
end;
end;
printer.PrinterIndex:=printer.PrinterIndex;
end;

//在(xmm,ymm)处按指定配置文件信息和字体输出字符串
procedure printtext(x,y:extended;txt:string;configfilename:string;fontsize:integer=12);
var
orx,ory:extended;
px,py:integer;
ap:tpoint;
fn:tstrings;
filename:string;
offsetx,offsety:integer;
begin
//打开配置文件,横向和纵向偏移量
try
fn:=tstringlist.Create;
filename:=extractfilepath(application.exename)+configfilename;
if fileexists(filename) then
begin
fn.LoadFromFile(filename);
//横向偏移量
offsetx:=strtoint(fn.values['x']);
//纵向偏移量
offsety:=strtoint(fn.values['y']);
end
else
begin
//如果没有配置文件,则生成
fn.Values['x']:='0';
fn.Values['y']:='0';
fn.SaveToFile(filename);
end;
finally
fn.Free;
end;
x:=x+offsetx;
y:=y+offsety;
px:=round(round(x*hpointsperinch*10000/25.4)/10000);
py:=round(round(y*vpointsperinch*10000/25.4)/10000);
py:=py+getoffsety;//因为是绝对坐标,因此,不用换算成相对于Y轴坐标
px:=px+2*avgcharwidth;
printer.canvas.Font.Name:='楷体_GB2312';
printer.Canvas.Font.Size:=fontsize-2;
//printer.canvas.font.color:=clgreen;
printer.Canvas.TextOut(px,py,txt);
end;
var
x,y,f:integer;
begin

//下面程序询问是否打印单据
if messagedlg('是否打印单据?',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
x:=20;//横坐标
y:=7;//纵坐标
f:=15;//字体
//setpaperheight(260);
//setpaperwidth(160);
printer.begin
Doc;

printtext(x,y-1,edit7.Text,'config.txt',f);//ID
printtext(x,y+8,e_date.Text,'config.txt',f);//日期

printer.EndDoc;
end;
注意:
1、纸张大小在98中能用,在XP和2K中不能用,如大家解决此问题,请给我发个E:wszyysss@126.com
2、记得在USES处加入PRINTERS
3、此程序非我原创,作者忘记是谁了,在此向大富翁致谢,向此程序的作者致谢!
 
to wszysystem:
为什么要设置偏移量?
还有,你这个什么意思?
py:=py+getoffsety;//因为是绝对坐标,因此,不用换算成相对于Y轴坐标
px:=px+2*avgcharwidth;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部