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查出來,
這兩個表看起來很大,不過只要稍加對照一下元件盤上的各個分類標籤 ,大致上就沒錯了 :