//取得字符的平均宽度
function AvgCharWidth(p:Tprinter):Word;
var
Metrics:TTextMetric;
begin
gettextmetrics(p.Canvas.Handle,metrics);
result:=metrics.tmAveCharWidth;
end;
//取得字符的高度
function CharHeight(p:Tprinter):Word;
var
Metrics:TTextMetric;
begin
gettextmetrics(p.Canvas.Handle,metrics);
result:=metrics.tmAveCharWidth;
end;
//取得打印机的x分辨率
function Getpix(p:Tprinter):Integer;
begin
result:=getdevicecaps(p.Handle,LOGPIXELSX);
end;
//取得打印机的y分辨率
function Getpiy(p:Tprinter):Integer;
begin
result:=getdevicecaps(p.Handle,LOGPIXELSY);
end;
//*****************************************
//设定纸张高度
//***************************************
procedure setpaperheight(val:double;p:Tprinter);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:Thandle;
pdmode:PDEVMODE;
begin
if val<127 then val:=127;
if val>427 then val:=427;
p.PrinterIndex:=p.PrinterIndex;
p.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:=round(val*10);
pdmode^.dmFields:=pdmode^.dmFields or DMBIN_MANUAL;
pdmode^.dmDefaultSource:=DMBIN_MANUAL;
globallock(hdmode);
end;
end;
p.PrinterIndex:=p.PrinterIndex;end;
//*****************************************
//设定纸张宽度
//***************************************
procedure setpaperwidth(val:double;p:Tprinter);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:Thandle;
pdmode:PDEVMODE;
begin
if val<76 then val:=76;
if val>216 then val:=216;
p.PrinterIndex:=p.PrinterIndex;
p.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_PAPERWIDTH;
pdmode^.dmPaperSize:=DMPAPER_USER;
pdmode^.dmPaperWidth:=round(val*10);
pdmode^.dmFields:=pdmode^.dmFields or DMBIN_MANUAL;
pdmode^.dmDefaultSource:=DMBIN_MANUAL;
globallock(hdmode);
end;
end;
p.PrinterIndex:=p.PrinterIndex;
end;
//设定纸的大小
procedure setpaper(w,h:double;p:Tprinter);
begin setpaperwidth(w,p);
setpaperheight(h,p);end;
//设定字体
procedure setfont(size:integer;str:string;p:Tprinter);
begin
p.Canvas.Font.Name:=trim(str);
p.Canvas.Font.Size:=size;
end;
procedure Tsale.tui_print_invoice(flag:integer;p_model:integer);
var
m,i:integer;
charh:integer;
s:string;
query1:tquery;
sql:string;
dmount:double;
fukuan_danwei:string;
begin
query1:=Tquery.Create(nil);
query1.DatabaseName:='dbname';
query1.Close ;
query1.SQL.Clear ;
sql:='select * from invoice_item where inv_id='''+s_invoice_no+'''';
query1.SQL.Add(sql);
query1.Open ; m:=query1.RecordCount;
fukuan_danwei:=trim(combobox2.Text );
printer.Canvas.TextOut(round(toxy(inv_fk_xy).x),round(toxy(inv_fk_xy).y), fukuan_danwei); //打印付款单位
setpaper(150,67,printer); //设置纸张大小 这里的设置不起作用,不知道为什么???????
printer.BeginDoc;
charh:=CharHeight(printer);
printer.Canvas.TextOut(round(toxy(taxregistry_no).x),round(toxy(taxregistry_no).y), s_taxregistry_no);
if inv_daima_p=false then
printer.Canvas.TextOut(round(toxy(inv_daima).x),round(toxy(inv_daima).y),s_inv_daima); printer.Canvas.TextOut(round(toxy(invoice_no).x),round(toxy(invoice_no).y),s_invoice_no); s_payee:=trim(combobox1.Text );
printer.Canvas.TextOut(round(toxy(payee).x),round(toxy(payee).y),s_payee);
// printer.Canvas.TextOut(round(toxy(payer).x),round(toxy(payer).y),s_payer); for i:=0 to m-1 do
begin
s_sitem_name:=leftstr(query1.fieldbyname('plu_name').AsString,inv_xm_name_l);
dmount:=query1.fieldbyname('plu_total').asfloat / query1.fieldbyname('plu_many').asfloat; ; s_sitem_price:=leftstr( formatfloat('0.00',dmount),inv_xm_price_l);
s_sitem_num:=leftstr(query1.fieldbyname('plu_many').AsString,inv_xm_num_l); s_sitem_amount:=leftstr(query1.fieldbyname('plu_total').AsString,inv_xm_jine_l);
query1.Next; printer.Canvas.TextOut(round(toxy(sitem_name).x),round(toxy(sitem_name).y)+i*charh+i*inv_xm_jianju,s_sitem_name);
if inv_xm_price_p=false then
printer.Canvas.TextOut(round(toxy(sitem_price).x),round(toxy(sitem_price).y)+i*charh+i*inv_xm_jianju,s_sitem_price);
if inv_xm_num_p=false then
printer.Canvas.TextOut(round(toxy(sitem_num).x),round(toxy(sitem_num).y)+i*charh+i*inv_xm_jianju,s_sitem_num); if inv_xm_jine_p=false then
begin
if flag=1 then
printer.Canvas.TextOut(round(toxy(sitem_amount).x),round(toxy(sitem_amount).y)+i*charh+i*inv_xm_jianju,'-'+s_sitem_amount)
else printer.Canvas.TextOut(round(toxy(sitem_amount).x),round(toxy(sitem_amount).y)+i*charh+i*inv_xm_jianju,s_sitem_amount);
end;
end; //for i:=0 to m-1 query1.Free ; if before_inv_p=false then
if s_before_inv<>'00000000' then
printer.Canvas.TextOut(round(toxy(before_inv_no).x),round(toxy(before_inv_no).y),s_before_inv);
printer.Canvas.TextOut(round(toxy(dateuissued).x),round(toxy(dateuissued).y),s_dateuissued);
if shoukuany_p=false then
printer.Canvas.TextOut(round(toxy(shoukuany).x),round(toxy(shoukuany).y),s_shoukuany);
printer.Canvas.TextOut(round(toxy(mach_no).x),round(toxy(mach_no).y),s_mach_no);
printer.Canvas.TextOut(round(toxy(total_d).x),round(toxy(total_d).y),s_total_d);
printer.Canvas.TextOut(round(toxy(total_x).x),round(toxy(total_x).y),s_total_x);
if p_model=1 then
printer.Canvas.TextOut(round(toxy(shuikm).x),round(toxy(shuikm).y),s_shuikm);
printer.EndDoc; //每次打印完毕后总是要走几行纸,奇怪???????
end;
function AvgCharWidth(p:Tprinter):Word;
var
Metrics:TTextMetric;
begin
gettextmetrics(p.Canvas.Handle,metrics);
result:=metrics.tmAveCharWidth;
end;
//取得字符的高度
function CharHeight(p:Tprinter):Word;
var
Metrics:TTextMetric;
begin
gettextmetrics(p.Canvas.Handle,metrics);
result:=metrics.tmAveCharWidth;
end;
//取得打印机的x分辨率
function Getpix(p:Tprinter):Integer;
begin
result:=getdevicecaps(p.Handle,LOGPIXELSX);
end;
//取得打印机的y分辨率
function Getpiy(p:Tprinter):Integer;
begin
result:=getdevicecaps(p.Handle,LOGPIXELSY);
end;
//*****************************************
//设定纸张高度
//***************************************
procedure setpaperheight(val:double;p:Tprinter);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:Thandle;
pdmode:PDEVMODE;
begin
if val<127 then val:=127;
if val>427 then val:=427;
p.PrinterIndex:=p.PrinterIndex;
p.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:=round(val*10);
pdmode^.dmFields:=pdmode^.dmFields or DMBIN_MANUAL;
pdmode^.dmDefaultSource:=DMBIN_MANUAL;
globallock(hdmode);
end;
end;
p.PrinterIndex:=p.PrinterIndex;end;
//*****************************************
//设定纸张宽度
//***************************************
procedure setpaperwidth(val:double;p:Tprinter);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:Thandle;
pdmode:PDEVMODE;
begin
if val<76 then val:=76;
if val>216 then val:=216;
p.PrinterIndex:=p.PrinterIndex;
p.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_PAPERWIDTH;
pdmode^.dmPaperSize:=DMPAPER_USER;
pdmode^.dmPaperWidth:=round(val*10);
pdmode^.dmFields:=pdmode^.dmFields or DMBIN_MANUAL;
pdmode^.dmDefaultSource:=DMBIN_MANUAL;
globallock(hdmode);
end;
end;
p.PrinterIndex:=p.PrinterIndex;
end;
//设定纸的大小
procedure setpaper(w,h:double;p:Tprinter);
begin setpaperwidth(w,p);
setpaperheight(h,p);end;
//设定字体
procedure setfont(size:integer;str:string;p:Tprinter);
begin
p.Canvas.Font.Name:=trim(str);
p.Canvas.Font.Size:=size;
end;
procedure Tsale.tui_print_invoice(flag:integer;p_model:integer);
var
m,i:integer;
charh:integer;
s:string;
query1:tquery;
sql:string;
dmount:double;
fukuan_danwei:string;
begin
query1:=Tquery.Create(nil);
query1.DatabaseName:='dbname';
query1.Close ;
query1.SQL.Clear ;
sql:='select * from invoice_item where inv_id='''+s_invoice_no+'''';
query1.SQL.Add(sql);
query1.Open ; m:=query1.RecordCount;
fukuan_danwei:=trim(combobox2.Text );
printer.Canvas.TextOut(round(toxy(inv_fk_xy).x),round(toxy(inv_fk_xy).y), fukuan_danwei); //打印付款单位
setpaper(150,67,printer); //设置纸张大小 这里的设置不起作用,不知道为什么???????
printer.BeginDoc;
charh:=CharHeight(printer);
printer.Canvas.TextOut(round(toxy(taxregistry_no).x),round(toxy(taxregistry_no).y), s_taxregistry_no);
if inv_daima_p=false then
printer.Canvas.TextOut(round(toxy(inv_daima).x),round(toxy(inv_daima).y),s_inv_daima); printer.Canvas.TextOut(round(toxy(invoice_no).x),round(toxy(invoice_no).y),s_invoice_no); s_payee:=trim(combobox1.Text );
printer.Canvas.TextOut(round(toxy(payee).x),round(toxy(payee).y),s_payee);
// printer.Canvas.TextOut(round(toxy(payer).x),round(toxy(payer).y),s_payer); for i:=0 to m-1 do
begin
s_sitem_name:=leftstr(query1.fieldbyname('plu_name').AsString,inv_xm_name_l);
dmount:=query1.fieldbyname('plu_total').asfloat / query1.fieldbyname('plu_many').asfloat; ; s_sitem_price:=leftstr( formatfloat('0.00',dmount),inv_xm_price_l);
s_sitem_num:=leftstr(query1.fieldbyname('plu_many').AsString,inv_xm_num_l); s_sitem_amount:=leftstr(query1.fieldbyname('plu_total').AsString,inv_xm_jine_l);
query1.Next; printer.Canvas.TextOut(round(toxy(sitem_name).x),round(toxy(sitem_name).y)+i*charh+i*inv_xm_jianju,s_sitem_name);
if inv_xm_price_p=false then
printer.Canvas.TextOut(round(toxy(sitem_price).x),round(toxy(sitem_price).y)+i*charh+i*inv_xm_jianju,s_sitem_price);
if inv_xm_num_p=false then
printer.Canvas.TextOut(round(toxy(sitem_num).x),round(toxy(sitem_num).y)+i*charh+i*inv_xm_jianju,s_sitem_num); if inv_xm_jine_p=false then
begin
if flag=1 then
printer.Canvas.TextOut(round(toxy(sitem_amount).x),round(toxy(sitem_amount).y)+i*charh+i*inv_xm_jianju,'-'+s_sitem_amount)
else printer.Canvas.TextOut(round(toxy(sitem_amount).x),round(toxy(sitem_amount).y)+i*charh+i*inv_xm_jianju,s_sitem_amount);
end;
end; //for i:=0 to m-1 query1.Free ; if before_inv_p=false then
if s_before_inv<>'00000000' then
printer.Canvas.TextOut(round(toxy(before_inv_no).x),round(toxy(before_inv_no).y),s_before_inv);
printer.Canvas.TextOut(round(toxy(dateuissued).x),round(toxy(dateuissued).y),s_dateuissued);
if shoukuany_p=false then
printer.Canvas.TextOut(round(toxy(shoukuany).x),round(toxy(shoukuany).y),s_shoukuany);
printer.Canvas.TextOut(round(toxy(mach_no).x),round(toxy(mach_no).y),s_mach_no);
printer.Canvas.TextOut(round(toxy(total_d).x),round(toxy(total_d).y),s_total_d);
printer.Canvas.TextOut(round(toxy(total_x).x),round(toxy(total_x).y),s_total_x);
if p_model=1 then
printer.Canvas.TextOut(round(toxy(shuikm).x),round(toxy(shuikm).y),s_shuikm);
printer.EndDoc; //每次打印完毕后总是要走几行纸,奇怪???????
end;
解决方案 »
- delphi中使用rmreport控件打印dbgrid中的数据
- DELPHI中三维立体显示的控件在哪?
- delphi,access数据库,ado连接,出现个奇怪问题。有倒数第一条和第二条记录,现在要修改倒数第二条必须在修改问保存后再修改保存一下倒数第一条,倒数第二条的数据才会保存下来。不然退出再进入会发现数据没有被修改?这是什么问题呢?并且最后一条数据不论怎
- 讨论:关于提高文本文件导入数据库的效率问题
- 关于静态变量的定义
- 在程序中获得系统的ODBC名
- 请教各位大侠,如何修改系统的时间!!!
- delphi有注释工具吗
- PageControl的问题
- 小弟求教sql查询!!
- 有什么方法可将 jpg图像从数据库中提取并显示,而不使用临时文件
- 抢分问题,先到先得
http://delphi.ktop.com.tw/TOPIC.ASP?TOPIC_ID=18838 自动走纸,撕纸设置
这个只能针对打印机...
如何精确控制打印机的进退纸。
印机看看
打印机分辨率:
Vx:水平
Vy:垂直
设置打印机的纸张大小(比如实际的纸张的length=40cm,width=25cm)
vl := length/2.53*vx
vw := width/2.53*vy
其他和你的程序一样你看看可以不?
pdmode^.dmFields:=pdmode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH;
pdmode^.dmPaperSize:=DMPAPER_USER;
pdmode^.dmPaperWidth:=vw ;
pdmode^.dmPaperLength=vl
pdmode^.dmFields:=pdmode^.dmFields or DMBIN_MANUAL;
pdmode^.dmDefaultSource:=DMBIN_MANUAL;
globallock(hdmode);