写这个小结的目的是给自己提个醒,将来有一天要用的时候不用从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开始研究,另一个目的是将它放到网上去,希望得到高手的指点,搞懂没有搞清清楚的问题!
希望路过的高手指点一二!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货