//取得字符的平均宽度
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;

解决方案 »

  1.   

    zhiyd(长弓) 老兄,不是这个问题,好像纸张定义根本就没有起作用!
      

  2.   

    zhiyd(长弓) 老兄,不是这个问题,好像纸张定义根本就没有起作用!
      

  3.   

    很多报表工具都不是很适合,所以我只能用自己做, nice0934(nice0934) 老兄,我用的就是本地打印机
      

  4.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=20182 控制进退纸
    http://delphi.ktop.com.tw/TOPIC.ASP?TOPIC_ID=18838 自动走纸,撕纸设置
    这个只能针对打印机...
      

  5.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=20182
    如何精确控制打印机的进退纸。
      

  6.   

    俺决定不用以上这些函数了,直接采用api,想怎么控制就怎么控制,免得受这么多约束!
      

  7.   

    quickreport 可以自定义,98内的针式打印机也可自定义,2000就麻烦一点,更换一下打
    印机看看
      

  8.   

    随便说说:
        打印机分辨率:
                   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);