Delphi文本和图形的打印

原创 2005年04月25日 20:22:00

 对于每一个Windows应用程序开发者来说,打印功能的实现都是极为棘手的,因为要涉及到相当多的代码,而且常常是相当复杂,但是在Delphi中实现文本和图像的打印功能却是非常容易的。

文本的打印功能
    Delphi中文本的打印功能就如同在DOS中一样容易,需要做的只是取得打印参数,打开打印机,然后发送文本的每一行内容。在Delphi中提供了一个printers程序单元,它说明了一个tprinter对象,封装了Windows打印工作和输出打印机之间的接口,并提供常用的属性和方法。其中画布canvas是一个非常有用的属性,它代表了当前打印文件的表面,是以图形方式来工作的,整个打印输出工作仅仅是将打印的内容输出到tprinter的属性canvas上,当全部输出工作完成以后,打印对象(tprinter)把canvas的属性值送到打印机上去。
     下面举例来说明如何通过Delphi实现文本内容的打印。在Delphi中提供了printdialog 、printersetupdialog两个控件允许我们进行打印机以及其他影响打印输出的选择,此外最重要的一点是要想实现打印功能必须在编译程序以前将printers加入到interface或者impl ementation的UESE语句当中,因为printer单元包括assignprn和其他控制打印机的过程。
    首先在From当中加入memo、printdialog、printersetupdialog和两个BUTTON控件,两个 BUTTON的CAPTION分别为"打印设置"和"打印"。然后编写BUTTON的事件驱动程序。本例比较简单,只要单击"打印"按钮时便可以在打印机上输出文件0S2.TXT。代码如下:

implementation
uses printers;
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
printersetupdialog1.execute;
//选择输出的打印机以及其他打印控制选项
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
lines:integer;
prntext:system.text;
//将PRNTEXT声明为一个在SYSTEM程序单元当中定义的文本文件
begin
if printdialog1.execute then
assignprn(prntext); //将PRNTEST分配给打印机
rewrite(prntext); //调用REWRITE函数,为输出打开已分配的文件
printer.canvas.font:=memo1.font;
//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性
for lines:=0 to memo1.lines.count-1 do
writeln(prntext,memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext); //关闭打印文件
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.loadfromfile(‘c:/dos/os2.txt’);
//在FORM建立时读入C:/DOS/S2.TXT文件
end;
end.

图形的打印功能
    简单的图形打印功能也如打印文本一样容易,只是告诉打印机对象(tprinter)开始打印 ,把图形复制到打印机上去,最后告诉打印机结束打印工作。
    举例说明:将上面的例子中的memo控件换成image控件,再经过一些简单修改,图形打印的代码如下:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if printdialog1.execute then
begin
printer.begindoc;
printer.canvas.draw(0,0,image1.picture.graphic);
printer.enddoc;
end;
end;

    在这种情况下,使用的是打印机的分辨率,图形在页面的左上角开始打印输出,打出的图形很小,通常不能符合要求。但是利用打印机画布canvas的stretchdraw方法,我们可以对图形进行灵活处理,canvas的stretchdraw方法声明为:

procedure StretchDraw(const Rect: TRect; Graphic: TGraphic);

    其中的Rect参数代表图形输出区域的大小,Trect的类型声明为:

TRect = record
case Integer of 
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
end;

    因此我们只要调整RECT的大小及其在打印页面上的位置,进而达到满意的效果,下面不断放大图形,充满我们定义的矩形区域,并将其定位在打印机画布(canvas)的中央然后输出。代码如下:

procedure TForm1.Button1Click(Sender: TObject);
VAR
strect:Trect; //定义打印输出矩形框的大小
temhi,temwd:integer;
begin
if printdialog1.execute then
begin
temhi:=image1.picture.height;
temwd:=image1.picture.width;
while (temhi<printer.pageheight div 2)and //将图形放大到打印页面的1/2
(temwd<printer.pagewidth div 2) do
begin
temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;
with strect do //定义图形在页面上的中心位置输出
begin
left:=(printer.pagewidth -temwd) div 2;
top:=(printer.pageheight-temhi) div 2;
right:=left+temwd;
bottom:=top+temhi;
end;
with Printer do
begin
begindoc; //将放大的图形向打印机输出
canvas.stretchdraw(strect,image1.picture.graphic);
enddoc;
end;
end;
end; 

    通过这些小例子,相信大家对于在Delphi中打印图形和文本有了一定的了解。同样通过打印机的画布(canvas)属性也可以实现数据库表单的打印 ,在这里不一一赘述,如果大家有兴趣不妨一试。

Delphi 打印实例

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, ...
  • lailai186
  • lailai186
  • 2013年05月16日 14:20
  • 2790

Delphi 打印 Tprinter(1)

打印          打印对于许多 Windows 程序员来说是十分棘手的问题。         Delphi 简化了打印时用户所必须了解的大部分内容。用户可以很轻松地写出简单的打印程序来输出...
  • lailai186
  • lailai186
  • 2013年04月08日 14:35
  • 13617

delphi 实现打印预览和打印过程

  • 2011年10月12日 15:22
  • 26KB
  • 下载

delphi直接打印jpg文件

procedure TSDIAppForm.Button2Click(Sender: TObject); var pxprint,pyprint:Integer; rect:Trect; ...
  • masofeng
  • masofeng
  • 2012年06月12日 10:30
  • 2873

DELPHI调用打印机打印图片的例子

  • 2010年09月27日 15:01
  • 212KB
  • 下载

Delphi 10 Seattle小票打印控件TQ_Printer

TQ_Printrer控件让开发人员在开发跨平台项目相关打印控制时更加方便快捷。控件支持Android、iOS以及WIN32/64的开发,可控制兼容ESC/POS的小票打印机。目前控件已在多个Andr...
  • tanqth
  • tanqth
  • 2016年08月31日 22:55
  • 2445

Delphi 调用BarTender打印条码

之前没有使用过Delphi调用BarTender打印条码,在网上搜索了一下,很多都是介绍导入ActiveX组件,其实完全没有必要。用OLE控件完全可以解决。但需要注意所使用的BarTender必须是正...
  • qq_19784269
  • qq_19784269
  • 2016年01月23日 16:15
  • 1873

delphi开发学习五:QuickReoprt报表控件使用实例

报表是数据库应用程序设计中非常重要的一部分,数据库应用程序通常都要生成报表,并且打印出来。      在Delphi7.0中,默认情况下没有直接使用的QuickReport组件,使用时需先进行手工安装...
  • u011846249
  • u011846249
  • 2015年08月20日 21:46
  • 2583

delphi 取得本机打印机列表及打印机详细信息

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls...
  • delphi308
  • delphi308
  • 2013年08月07日 17:17
  • 2377

获取打印机状态Delphi

  • 2009年05月15日 13:13
  • 179KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi文本和图形的打印
举报原因:
原因补充:

(最多只允许输入30个字)