Printer 直接调用打印机问题

问题:

var
   i, j: Integer;

   top, left: Integer;
   //x, y: Integer;
   PageHeight, linespace: Integer;


   PDMode:PDevMode;  
begin  
   top:= 150;   //Top 起始行的位置,比如设置 Top := 20;
   left:= 20; //Left 左边的起始位置,比如设置:Left := 20;
   PageHeight := 2600;//A4得纸张大概是这么多,我既不太清,你可以通过某个过程先得到这个数据,

   y:= top;
   x:= left;
   linespace:= 20;   //行间距

   try
     Printer.GetPrinter(Device, Driver, Port, AdevMode);
     Edit2.Text:= Device;
     Edit3.Text:= Driver;
     Edit7.Text:= Port;

     if AdevMode <> 0 then
       begin
         PDMode:= GlobalLock(AdevMode);
         if PDMode <> nil then
           begin
           case pDMode.dmPaperSize of

           DMPAPER_USER:    showmessage('纸张类型:自定义');

           DMPAPER_A3:    showmessage('纸张类型:A3');

           DMPAPER_A4:    showmessage('纸张类型:A4');

           DMPAPER_A5:    showmessage('纸张类型:A5');

           DMPAPER_B4:    showmessage('纸张类型:B4');

           DMPAPER_B5:    showmessage('纸张类型:B5');

           else
           showmessage('纸张类型:其它'); 
           end;

           GlobalUnLock(AdevMode);
           Printer.PrinterIndex:= Printer.PrinterIndex;
           end;
       end;

     Printer.BeginDoc;
     Printer.Canvas.Font.Size:= 15;
     Printer.Canvas.Font.Style:= [fsBold];   //字体粗体

     {Printer.Canvas.TextOut(x, 10, PrinterText[1]);
     Printer.Canvas.TextOut(x, 30, PrinterText[2]);
     Printer.Canvas.TextOut(x, 50, PrinterText[3]);
     Printer.Canvas.TextOut(x, 70, PrinterText[4]);
     Printer.Canvas.TextOut(x, 90, PrinterText[5]);
     Printer.Canvas.TextOut(x, 110, PrinterText[6]);
     Printer.Canvas.TextOut(x, 130, PrinterText[7]);
     Printer.Canvas.TextOut(x, 150, PrinterText[8]);
     Printer.Canvas.TextOut(x, 170, PrinterText[9]);   }

     for i := 1 to 9 do
       begin
         Printer.Canvas.TextOut(x, y, PrinterText[i]);
         y := y + LineSpace;
         if(y > PageHeight - Top) then
           begin
           Printer.NewPage;
           y := Top;
           end;
       end;

     //Printer.Canvas.TextOut(StrToInt(Edit8.Text), StrToInt(Edit10.Text), print_text);
     Printer.EndDoc;

     for j:= 1 to 9 do PrinterText[j]:= '';
     y:= top;
     x:= left;
   except
     ShowMessage('没有发现打印机的存在, 请检查是否有安装打印机');
   end;

为什么打印的时候都挤在一起. 而且只有一行显示.(x,y 是全局变量), 为什么没有按我的一行加上间距一行的打印呢?

 

复:

打印机分辨率不一样,不要给定具体值,必须通过API获得具体打印参数。

linespace:=Printer.Canvas.TextHeight('行高');// 获得当前打印机行高度,可能远远大于20。

 

你先更改这两个地方再打印试试。

      Printer.Canvas.TextOut(x, 10, PrinterText[1]);
     Printer.Canvas.TextOut(x, 30, PrinterText[2]);
     Printer.Canvas.TextOut(x, 50, PrinterText[3]);
     Printer.Canvas.TextOut(x, 70, PrinterText[4]);
     Printer.Canvas.TextOut(x, 90, PrinterText[5]);
     Printer.Canvas.TextOut(x, 110, PrinterText[6]);
     Printer.Canvas.TextOut(x, 130, PrinterText[7]);
     Printer.Canvas.TextOut(x, 150, PrinterText[8]);
     Printer.Canvas.TextOut(x, 170, PrinterText[9]);  

你这是要干嘛,如果喷墨激光打印机,肯定打在一起了,若你要分行打,可以改成

n:=1 to 9

要打成一列,改成类似这样

Printer.Canvas.TextOut(x, y+linespacen*(n-1), PrinterText[n]);

要打成一行,改成类似这样

 Printer.Canvas.TextOut(x+(n-1)*20,y, PrinterText[n]);

 

转载于:https://www.cnblogs.com/fyen/archive/2010/12/18/1909741.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值