1、 文 本 的 打 印 功 能。DELPHI 中 文 本 的 打 印 功 能 就 如 同 在DOS 中 實 現 文 本 的 打 印 功 能 一 樣 容 易, 需 要 做 的 一 切 只 是 取 得 打 印 參 數, 打 開 打 印 機, 然 後 發 送 文 本 的 每 一 行 內 容。 在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
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\OS2.TXT文件
end;
end.
2、 圖 形 的 打 印 功 能, 簡 單 的 圖 形 打 印 功 能 也 如 打 印 文 本 一 樣 的 容 易, 只 是 告 訴 打 印 機 對 象(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 的STRETHDRAW 的 方 法, 可 以 讓 我 們 對 圖 形 進 行 靈 活 的 處 理, 畫 布(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;
以 上 代 碼 在DELPHI2.0 上 編 譯 通 過, 通 過 這 些 小 小 的 例 子, 相 信 大 家 對 於 在Delphi 中 打 印 圖 形 和 文 本 有 一 定 的 了 解, 同 樣 通 過 打 印 機 的 畫 布(CANVAS) 屬 性 也 可 以 實 現 數 據 庫 表 單 的 打 印, 在 這 裡 不 一 一 贅 述, 如 果 大 家 有 興 趣 不 妨 一 試。