對於每一個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)屬性也可以實現資料庫表單的列印 ,在這裡不一一贅述,如果大家有興趣不妨一試。