写这个小结的目的是给自己提个醒,将来有一天要用的时候不用从0开始研究,另一个目的是将它放到网上去,希望得到高手的指点,搞懂没有搞清清楚的问题!
希望路过的高手指点一二!   
   
 
   最近研究一些日子的delphi打印问题,但效果并不很好,现总结如下:
   根据一些书上总结,delphi打印要解决两个问题,一个是预览,在屏幕上输出,一个是在纸上输出,这两上是有区别的。dlephi中打印可以分为三类,一类是图形的打印,一类是文字的打印,一类是报表的打印。
一、图形的打印相对要简单一些。
     打印预览实际上是根据所设的纸的尺寸和设置的边距,在预览窗口中“画”出来,然后通Image1.Canvas.StretchDraw(Rect,Form1.Image1.Picture.Graphic) 输出到屏幕上。   (Form2是显示预览的窗口,有image1组件一个,下面代码是在其调用窗口中的“打印预览”按钮内容)    //定位imamge1的位置和大小
    Form2.Image1.Left:=5;
    Form2.Image1.Top:=5;    Form2.Image1.Width:=Trunc(pagewidth/2.54*96/3)+30;    //pagewidth,pageheigth是设置纸的大小
    Form2.Image1.Height:=Trunc(pageHeight/2.54*96/3)+30;
    //将image1涂白
    Form2.Image1.Canvas.Pen.Mode:=pmWhite;
    Form2.Image1.Canvas.Rectangle(5,5,Trunc(pagewidth/2.54*96/3)+30,Trunc(pageHeight/2.54*96/3)+30);    //显示黑色
    Form2.Image1.Canvas.Pen.Mode:=pmBlack;
    Form2.Image1.Canvas.Rectangle(25,25,Trunc(pagewidth/2.54*96/3)+15,Trunc(pageHeight/2.54*96/3)+15);     //画灰纸框
    Form2.Image1.Canvas.Pen.Color:=clGray;
    Form2.Image1.canvas.Pen.Mode:=pmcopy;
    Form2.Image1.Canvas.Pen.Style:=psSolid;
    Form2.Image1.Canvas.Rectangle(10,10,Trunc(pagewidth/2.54*96/3),Trunc(pageHeight/2.54*96/3));      //计算当前显示图片的大小
    ImageWidth:=Trunc(Image1.Picture.Width/3);    //按缩小3倍进行显示
    ImageHeight:=Trunc(Image1.Picture.Height/3);    //定义输出图片的rect
    rect.Left:=Trunc(dLeft/2.54*96/3);           //根据设置的页距反应到屏幕上
    rect.Top:=Trunc(dtop/2.54*96/3);
    rect.Right:=Trunc(pagewidth/2.54*96/3);
    rect.Bottom:=Trunc(pagewidth/2.54*96/3);    Form2.Image1.Canvas.StretchDraw(Rect,Form1.Image1.Picture.Graphic);    Form2.show;    这只是图形在屏幕上输出。(win2000+delphi 7通过)
    在打印机上输出道理差不多,只不过将image1.canvas换成printer.canvas了,程序如下:
   
    //取得当前打印机的打印分辨率
     PPIX:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
     PPIY:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);      //计算当前显示图片的大小
    ImageWidth:=Image1.Picture.Width;
    ImageHeight:=Image1.Picture.Height;
    ImageWidth:=Trunc(ImageWidth/96/3)*PPIX;
    ImageHeight:=Trunc(ImageHeight/96/3)*PPIY;
    //定义输出图片的rect
    showmessage(inttostr(dleft));
    rect.Left:=Trunc(dleft/2.54/3)*PPIX;
    rect.Top:=Trunc(DTop/2.54/3)*PPIY;    rect.Right:=ImageWidth;
    rect.Bottom:=ImageHeight;    Printer.BeginDoc;
    printer.Title:=FOrm1.OpenDialog1.FileName;
    Printer.Canvas.StretchDraw(Rect,Image1.Picture.Graphic);
    printer.EndDoc;
  
   关键是rect大小的定义,它决定了输出的图像大小和位置。上面这些代码打印输出的效果并不很好(存在一些问题)。
二、文字的打印。
    文字的打印预览,我没有解决(郁闷!!!),在打印机上输出也没有解决好!
    下面将自己收集一些打印代码拿出来一起看一看,希望大学给予指导!
     文字的打印有两种方式,一种借助文件方式,一种是用printer.canvas.textout()来实现。
   第一种方式使用不多,因为不好控制。
     var
       f:Textfile;
   begin
      assignprn(f);
      rewrite(f);
      writeln(f,'中国,我爱你!');
      closefile(f);
   end;   第二种方式能实现精确打印(但我没有研究透)
    
   Printer.BeginDoc;
   printer.canvas.textout(10,10,'中国,我爱你!')
   printer.EndDoc;   没有解决问题:
       (1)、怎样根据设置好的的纸的大小、边距来设计打印预览窗口?
       (2)、文字有字体和大小,怎样反应到打印预览中去?
       (3)、文字有字体和大小不同,这就决定在同一个纸的大小和边距设置上一行字数的多少会有不同,怎样得到字的大小,怎样算出一行字数的多少?
       (4)、textout(x,y,string)中,(10 ,10)这一个坐标是纸上什么位置,是以mm为单位?像素点为单位?不是很清楚!三、报表打印
    这个问题在dephi 7中得到了很好的解决,RAV组件基本上能够完成99%的报表处理任务,并且打印也得到了很好的解决。
      
delphi中提供了一些与打印有关的打印组件,是我们在设计打印程序中有很大的帮助!  写这个小结的目的是给自己提个醒,将来有一天要用的时候不用从0开始研究,另一个目的是将它放到网上去,希望得到高手的指点,搞懂没有搞清清楚的问题!
希望路过的高手指点一二!