当前位置:文档之家› 在DELPHI中如何实现打印功能

在DELPHI中如何实现打印功能

在DELPHI中提供了一个PRINTERS程序单元,它说明了一个TPRINTER对象,封装了WINDOWS打印工作和输出打印机之间的接口,并提供常用的属性和方法,其中画布CANVAS是一个非常有用的属性,它代表了当前打印文件的表面,是以图形方式来工作的,整个的打印输出工作仅仅是将你打印的内容输出到TPRINTER的属性CANVAS上,当全部的输出工作完成以后,打印对象(TPRINTER)把CANVAS的属性值送到打印机上去。

下面举例来说明如何通过DELPHI实现文本内容的打印。

在DELPHI 中提供了PRINTDIALOG、PRINTERSETUPDIALOG两个控件允许我们进行打印机以及其他影响打印输出的选择,此外最重要的一点是要想实现打印功能必须在编译程序以前将PRINTERS加入到INTERFACE或者IMPLEMENTATION的UESE语句当中,因为PRINTER单元包括ASSIGNPRN和其他控制打印机的过程。

首先在FORM当中加入MEMO、PRINTDIALOG、PRINTERSETUPDIALOG和两个BUTTON控件,两个BUTTON的CAPTION分别为“打印设置”和“打印”。

然后编写BUTTON的事件驱动程序(代码在下面),这个简单的例子中只要单击“打印”按钮时便可以在打印机上输出文件0S2.TXT,打印事件的清单如下:
implementation
usesprinters;
{$R*.DFM}
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
printersetupdialog1.execute;//选择输出的打印机以及其他打印控制选项
end;
procedureTForm1.BitBtn2Click(Sender:TObject);
var
lines:integer;
prntext:system.text;
//将PRNTEXT声名为一个在SYSTEM程序单元当中定义的文本文件begin
ifprintdialog1.executethen
assignprn(prntext);//将PRNTEST分配给打印机
rewrite(prntext);//调用REWRITE函数,为输出打开已分配的文件printer.canvas.font:=memo1.font;
//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性forlines:=0tomemo1.lines.count-1do
writeln(prntext,memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext);//关闭打印文件
end;
procedureTForm1.FormCreate(Sender:TObject);
begin
memo1.lines.loadfromfile('c:\dos\os2.txt');
//在FORM建立时读入C:\DOS\OS2.TXT文件
end;
end.
2、图形的打印功能,简单的图形打印功能也如打印文本一样的容易,只是告诉打印机对象(TPRINTER)开始打印,把图形简单的复制到打印机上去,最后告诉打印机结束打印工作。

举例说明:将上面的例子的MEMO控件换成IMAGE控件,再经过一些简单的修改,图形打印的代码如下:
procedureTForm1.BitBtn1Click(Sender:TObject);
begin
ifprintdialog1.executethen
begin
printer.begindoc;
printer.canvas.draw(0,0,image1.picture.graphic);
printer.enddoc;
end;
end;
在这种情况下,使用的是打印机的分辨率,图形在页面的左上角开始打印输出,打出的图形很小,在很多的情况下不能符合要求,但是打印机画布CANVAS的STRETHDRAW的方法,可以让我们对图形进行灵活的处理,画布(CANVAS)的STRETCHDRAW方法声名为:
procedureStretchDraw(constRect:TRect;Graphic:TGraphic);
其中的RECT参数代表图形输出区域的大小,TRECT的类型声名为:TRect=record
caseIntegerof
0:(Left,Top,Right,Bottom:Integer);
1:(TopLeft,BottomRight:TPoint);
end;
因此我们只要调整RECT的大小及其在打印页面上的位置,进而达到自己满意的效果,下面的代码是不断的放大图形,充满我们定义的矩
形区域,并将其定位在打印机画布(CANVAS)的中央进行输出。

代码如下:
procedureTForm1.Button1Click(Sender:TObject);
VAR
strect:Trect;//定义打印输出矩形框的大小
temhi,temwd:integer;
begin
ifprintdialog1.executethen
begin
temhi:=image1.picture.height;
temwd:=image1.picture.width;
while(temhiprinter.pageheightdiv2)and
//将图形放大到打印页面的1/2大小
(temwdprinter.pagewidthdiv2)do
begin
temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;
withstrectdo//定义图形在页面上的中心位置输出
begin
left:=(printer.pagewidth-temwd)div2;
top:=(printer.pageheight-temhi)div2;
right:=left+temwd;
bottom:=top+temhi;
end;
withprinterdo
begin
begindoc;
//将放大的图形向打印机输出
canvas.stretchdraw(strect,image1.picture.graphic);
enddoc;
end;
end;
end;
以上代码在DELPHI2.0上编译通过,通过这些小小的例子,相信大家对于在DELPHI中打印图形和文本有一定的了解,同样通过打印机的画布(CANVAS)属性也可以实现数据库表单的打印,在这里不一一赘述,如果大家有兴趣不妨一试。

相关主题