Delphi编程从入门到精通

  • 格式:docx
  • 大小:147.54 KB
  • 文档页数:11

Delphi Package

從這一節起,我將介紹 Delphi 3起新增特性中的Package。為什麼將Package放在這一章

呢?那是因為Package也是一種DLL。一般人對於Package的第一個印象是它可以讓 EXE

檔變小,的確如此,不過它能做的不只是這樣而已, 我們也拿它來切割應用程式。 事實上,

Package保留了「將程式碼分離出來由兩個以上的 EXE共享」的優點,但是在設計與使用

時卻又完全像是從來沒有分開過一樣。

什麼是 Package ?

i

Package是什麼?簡單來說,它是專為 Delphi量身訂製的特殊 DLL,內含VCL的元件以

及其他的函式與變數。

一切還是得從單元談起,過去到現在,單元( Unit)始終是 Delphi模組化程式的基礎,

*.PAS在編譯之後變成*.DCU,然後再編譯進EXE可執行檔中。情形從 Delphi 3開始有 些改變••.,現在,當我們編譯連結時,可以選擇:不要將已經在 Package中的程式編

譯進EXE。換句話說,現在我們可以預先將一些單元合併製作成副檔名為 .DPL的所謂

Package,然後告訴Delphi:凡是在Package中有的東西,都不用編譯進 .EXE檔,等到執 行時,再將Package裏頭的東西拿出來與 EXE 一起工作。

因此,所有應用到 Package的檔案,其EXE檔的大小都很明顯地變小。為什麼?因為這 些程式碼現在大部分都在 .DPL中。我們來親身體驗看看吧!

1. 【File / New Application】開始一個新的專案。

與Delphi同為一家公司所研發的 C++Builder,自3.0版起,也開始支援 Package副檔 名為.BPL。 當然啦! Compiler會怎麼決定,還是要看專案的設定,因此,這句話若說成:

「要不2. 【File / Save All】將專案找一個工作目錄存起來,檔名都按預設的 Unitl.pas、

Projectl.dpr,沒有關係。

3. 【Project / Build All Projects】編譯這個程式,從「檔案管理員」你可觀察到Project1.exe 這個檔案大約是175K左右。

4. 【Project / Options…】,將 Package這頁的「Build with runtime packages」Checkbox 打 上勾勾,然後點「Ok」按鈕結束。

5. 【Project / Build All Projects】重新編譯,會發現:現在Project1.exe大幅縮小,不到10K。

為什麼?因為Inprise為Delphi的VCL提供了一組.DPL檔案,其中已經含有 Delphi出貨 時VCL完整的程式碼了,我們寫作程式時,這些 VCL的程式碼過去是一再複製到我們

的.EXE檔,現在,不過是將這些程式碼獨立出來另外放而已。不過,雖說 EXE檔變小

了,在它執行時,仍然需要這些 .DPL的幫忙才能執行。

「這跟Visual Basic的VBRUNxxx.DLL 是一樣的嘛!」嗯!很像,但不完全是那樣。首

先,程式仍是編譯式的,並非 Visual Basic直譯式的作法,依然維持很高的執行效率;其

次,我們應該視Package是一種新的編譯技術,它很適合用來切割應用程式。

為何這麼說呢?還記得我們在上一節用了比較曲折的方式輸岀物件嗎?還記得之前提到

Delphi的DLL不能輸出變數嗎?現在我要告訴你,應用 Package,這些都不是問題了。因

為你現在可以將Package裏頭的單元就當成一般以 uses使用的單元那樣,可以直接參考它

2

interface中的東西,差別在於:這些東西在編譯時,由 Compiler決定 要不要出現在EXE

檔中。

用Package是我們決定的」,也是可以的製作 Package

接下來,我還是透過實例來說明如何製作與使用 Package^

1. 【File / New Application】開始一個新的專案

2. 將Form1的Name屬性改成frmAnimate,然後從元件盤的 Win32標籤選擇 TAnimate 元件放一個到Form裏頭並改名為anmtFindFile

3. 【File / Save All】將這個專案存檔,單元檔名: AniU.pas,專案檔名:Ani.dpr。同樣

的,我仍然建議你找一個特定的目錄存放,稍候實驗作完時比較方便刪除 Package的

相關檔案。

到目前為止,跟以往其他的專案並沒有什麼兩樣。

4. 【File / New】在New這個分類標籤中選擇 Package這個Icon,在上頭點二下。如圖

10-5。

命Kkw 1馆

Cancel Help

圖10-5 / 新 增一個Package 專案 5. 【File / Save],切換到剛才AniU.pas存放的目錄,將這個Package專案存檔成「pa.dpk」。

6. 滑鼠在圖10-6點一下「Options」按鈕,Description欄輸入:「Package測試專案」。

圖10-6 / Package Editor 的操作畫面

7. 點一下「Add」按鈕,在 Unit filename中,透過「Browse」按鈕選擇 AniU.pas,完成 後,情況應如圖10-7的Package Editor操作畫面。

圖10-7 / Package Editor 的操作畫面

8. 在圖10-7的Package Editor操作畫面,點一下「Install」按鈕,將pa.dpk安裝進Delphi

9. 關掉圖10-7的Package Editor並回答需要存檔。

現在,如果你用檔案管理員去看的話,應該會發現在 AniU.pas那個目錄,多了一個叫

pa.DPL的檔案,這個就是所謂的 Package了。同時,經由【Project / Options】,在Package 那頁,會發現在「Design Packages」中出現了「Package測試專案」這個選項。

一般Delphi專案的副檔名是.DPR,編譯連結後產生.EXE或.DLL ;而Package專案檔的 副檔名是.DPK,編譯產生的成品是.DPL。

使用 Package

好了,現在我們有了一個 Package 了,接下來要示範怎麼用。請繼續以下的步驟:

10. 【File / New Application】開始一個新的專案。

11. 在Form1上放置一個TButton按鈕,寫作 Button1的OnClick事件處理程序如下:

#0001 procedure TForm1.Button1Click(Sender: TObject);

#0002 var

#0003 frmAnimate: TfrmAnimate;

#0004 begin

#0005 frmAnimate := TfrmAnimate.Create(Application);

#0006 with frmAnimate do

#0007 begin

#0008 monAVI := aviFindFile;

#0009 anmtFindFile.Active := True;

#0010 Show;

#0011 end;

#0012 end;

12. 在uses句子中加入 AniU, ComCtrls這兩個單元名稱。因為aviFindFile這個列舉型態是 定義在ComCtrls這個單元中的;而 TfrmAnimate被我們寫在 AniU.pas這個單元。

13. 【File / Save All】,將試用的專案與剛才 Package存在一起。

14. 以【Run / Run】執行看看。

聰明的你一定發現這個試用的專案跟一般的專案完全沒有兩樣嘛!不過只是用了 uses句

子參考到AniU.pas這個單元的內容而已啊!沒錯,即使等一下使用了 Package之後,程式

的內容也完全一樣。

15. 【Project / Options 】,在 Package這頁,選取 Build with runtime package,並且將「Add」 左方的輸入盒改成「VCL30;pa」,點按「Ok」按鈕關閉對話盒。 16. 重新以【Project / Build All Projects】編譯連結程式。

好了,這個例子進行到此告一段落了,最後,這個測試檔案大約只有 10K左右,其他的都

在Package檔裏頭了。接下來,我先簡單說明一下這個實驗性的 Package怎麼移除,然後

繼續Package的討論。

卸除 Package

卸除Package的操作程序是【Component / Install Package】,如圖10-8,選擇希望刪除的

項目,然後點一下「Remove」按鈕。

圖 10-8 / 卸除 Package

接下來,就是使用「檔案總管」實際將這些磁碟中的檔案動手刪掉了。此外,安裝元件與

Package時,Delphi為了日後方便找到這些檔案,因此會自動的在【 Tool / Environment Options…/

Library】的Library path中幫我們附加上搜尋目錄的名稱,這欄的內容也請一併 將其中不必要的路徑去掉。 所以啦!下次當你要製作 Package或者安裝元件時,不妨考慮將它們統一安裝在同一個目

錄以便於管理,免得到處東一個西一個的,這個使用的經驗也一併提供給你參考。

了解 Package

Package的確是一個DLL檔,但不只是 DLL而已。我個人覺得最神奇好用的一點是:它 提供了 DLL將程式碼分離岀來由兩個以上的 EXE共享的優點,但是在設計與使用時卻又 完全像是從來沒有分開過一樣。

對於Package中的各個單元而言,不管是類別、物件、函式、型態、常數、變數,凡是寫 在單元interface中的,完合符合過去使用單元的經驗與原則,作法習慣上是統一的。比較 需要注意的是以下兩件事:

【Project / Option / Package】這頁中,Build with runtime Packages 的選項要選,在它 下方填入專案用到的 Package名稱,告知Delphi在編譯這個專案時,只將自己寫的 程式碼編進EXE檔中即可,同時,也記錄未來這個 EXE在執行時曉得該找到哪些

Package 一同工作。

除了 EXE,你還必須一併交給使用者額外的 DPL,就如同EXE用到DLL時你必須

一併附上DLL是一樣的。

接下來的問題是:到底我該交出哪些 DPL給使用者呢?以剛才的例子來說,在 Build with

runtime Packages的選項下方我填的是「 vcl30;pa」,可是這個輸入盒原本列了一大堆的 Package名稱,我的專案每一個都用得到嗎?關於這點,你可以從表 10-9、10-10查出來,

這兩個表看起來很大,不過只要稍加對照一下元件盤上的各個分類標籤 ,大致上就沒錯了 :