Delphi编程从入门到精通_02(共4册).

上传人:小** 文档编号:58305128 上传时间:2022-02-27 格式:DOC 页数:11 大小:307.50KB
收藏 版权申诉 举报 下载
Delphi编程从入门到精通_02(共4册)._第1页
第1页 / 共11页
Delphi编程从入门到精通_02(共4册)._第2页
第2页 / 共11页
Delphi编程从入门到精通_02(共4册)._第3页
第3页 / 共11页
资源描述:

《Delphi编程从入门到精通_02(共4册).》由会员分享,可在线阅读,更多相关《Delphi编程从入门到精通_02(共4册).(11页珍藏版)》请在装配图网上搜索。

1、第10章 以Delphi寫作與使用 DLLDelphi Package從這一節起,我將介紹Delphi 3起新增特性中的Package。為什麼將Package放在這一章呢?那是因為Package也是一種DLL。一般人對於Package的第一個印象是它可以讓EXE檔變小,的確如此,不過它能做的不只是這樣而已,我們也拿它來切割應用程式。事實上,Package保留了將程式碼分離出來由兩個以上的EXE共享的優點,但是在設計與使用時卻又完全像是從來沒有分開過一樣。什麼是 Package ?iPackage是什麼?簡單來說,它是專為Delphi量身訂製的特殊 DLL,內含VCL的元件以及其他的函式與變數。

2、一切還是得從單元談起,過去到現在,單元(Unit)始終是 Delphi模組化程式的基礎,*.PAS在編譯之後變成*.DCU,然後再編譯進EXE可執行檔中。情形從 Delphi 3開始有 些改變.,現在,當我們編譯連結時,可以選擇:不要將已經在Package中的程式編譯進EXE。換句話說,現在我們可以預先將一些單元合併製作成副檔名為.DPL的所謂Package,然後告訴Delphi:凡是在Package中有的東西,都不用編譯進 .EXE檔,等到執 行時,再將Package裏頭的東西拿出來與 EXE 一起工作。因此,所有應用到 Package的檔案,其EXE檔的大小都很明顯地變小。為什麼?因為這

3、些程式碼現在大部分都在.DPL中。我們來親身體驗看看吧!1. 【File / New Application】開始一個新的專案。與Delphi同為一家公司所研發的C+Builder,自3.0版起,也開始支援 Package副檔名為.BPL。2. 【File / Save All】將專案找一個工作目錄存起來,檔名都按預設的Unitl.pas、Projectl.dpr,沒有關係。3. 【Project / Build All Projects】編譯這個程式,從檔案管理員你可觀察到Project1.exe 這個檔案大約是175K左右。4. 【Project / Options】,將 Package這

4、頁的Build with runtime packagesCheckbox 打 上勾勾,然後點Ok按鈕結束。5. 【Project / Build All Projects】重新編譯,會發現:現在Project1.exe大幅縮小,不到10K。為什麼?因為Inprise為Delphi的VCL提供了一組.DPL檔案,其中已經含有 Delphi出貨 時VCL完整的程式碼了,我們寫作程式時,這些VCL的程式碼過去是一再複製到我們的.EXE檔,現在,不過是將這些程式碼獨立出來另外放而已。不過,雖說EXE檔變小了,在它執行時,仍然需要這些.DPL的幫忙才能執行。這跟Visual Basic的VBRUNxx

5、x.DLL 是一樣的嘛!嗯!很像,但不完全是那樣。首先,程式仍是編譯式的,並非Visual Basic直譯式的作法,依然維持很高的執行效率;其次,我們應該視Package是一種新的編譯技術,它很適合用來切割應用程式。為何這麼說呢?還記得我們在上一節用了比較曲折的方式輸岀物件嗎?還記得之前提到Delphi的DLL不能輸出變數嗎?現在我要告訴你,應用Package,這些都不是問題了。因為你現在可以將Package裏頭的單元就當成一般以 uses使用的單元那樣,可以直接參考它2interface中的東西,差別在於:這些東西在編譯時,由Compiler決定 要不要出現在EXE檔中。當然啦!Compil

6、er會怎麼決定,還是要看專案的設定,因此,這句話若說成:要不要585第10章 以Delphi寫作與使用 DLL#第10章 以Delphi寫作與使用 DLL用Package是我們決定的,也是可以的#第10章 以Delphi寫作與使用 DLL製作 Package接下來,我還是透過實例來說明如何製作與使用Package1. 【File / New Application】開始一個新的專案2. 將Form1的Name屬性改成frmAnimate,然後從元件盤的 Win32標籤選擇 TAnimate 元件放一個到Form裏頭並改名為anmtFindFile3. 【File / Save All】將這個專

7、案存檔,單元檔名:AniU.pas,專案檔名:Ani.dpr。同樣的,我仍然建議你找一個特定的目錄存放,稍候實驗作完時比較方便刪除Package的相關檔案。到目前為止,跟以往其他的專案並沒有什麼兩樣。4. 【File / New】在New這個分類標籤中選擇 Package這個Icon,在上頭點二下。如圖10-5。命Kkw 1馆CancelHelp圖10-5 / 新 增一個Package 專案5. 【File / Save,切換到剛才AniU.pas存放的目錄,將這個Package專案存檔成pa.dpk。6. 滑鼠在圖10-6點一下Options按鈕,Description欄輸入:Package

8、測試專案。圖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安裝進Delphi9. 關掉圖10-7的Package Editor並回答需要存檔。現在,如果你用檔案管理員去看的話,應該會發現在AniU.pas那個目錄,多了一個叫pa.DPL的檔案,這個就是所謂的 Packag

9、e了。同時,經由【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 pro

10、cedure TForm1.Button1Click(Sender: TObject);#0002 var#0003 frmAnimate: TfrmAnimate;#0004 begin#0005 frmAnimate := TfrmAnimate.Create(Application);#0006 with frmAnimate do#0007 begin#0008 anmtFindFile.CommonAVI := aviFindFile;#0009 anmtFindFile.Active := True;#0010 Show;#0011 end;#0012 end;12. 在uses句

11、子中加入 AniU, ComCtrls這兩個單元名稱。因為aviFindFile這個列舉型態是 定義在ComCtrls這個單元中的;而 TfrmAnimate被我們寫在 AniU.pas這個單元。13. 【File / Save All】,將試用的專案與剛才Package存在一起。14. 以【Run / Run】執行看看。聰明的你一定發現這個試用的專案跟一般的專案完全沒有兩樣嘛!不過只是用了uses句子參考到AniU.pas這個單元的內容而已啊!沒錯,即使等一下使用了Package之後,程式的內容也完全一樣。15. 【Project / Options 】,在 Package這頁,選取 Bui

12、ld 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 / 卸除

13、Package接下來,就是使用檔案總管實際將這些磁碟中的檔案動手刪掉了。此外,安裝元件與Package時,Delphi為了日後方便找到這些檔案,因此會自動的在【 Tool / Environment Options/ Library】的Library path中幫我們附加上搜尋目錄的名稱,這欄的內容也請一併 將其中不必要的路徑去掉。所以啦!下次當你要製作Package或者安裝元件時,不妨考慮將它們統一安裝在同一個目錄以便於管理,免得到處東一個西一個的,這個使用的經驗也一併提供給你參考。了解 PackagePackage的確是一個DLL檔,但不只是 DLL而已。我個人覺得最神奇好用的一點是:它

14、提供了 DLL將程式碼分離岀來由兩個以上的 EXE共享的優點,但是在設計與使用時卻又 完全像是從來沒有分開過一樣。對於Package中的各個單元而言,不管是類別、物件、函式、型態、常數、變數,凡是寫 在單元interface中的,完合符合過去使用單元的經驗與原則,作法習慣上是統一的。比較 需要注意的是以下兩件事:【Project / Option / Package】這頁中,Build with runtime Packages 的選項要選,在它 下方填入專案用到的 Package名稱,告知Delphi在編譯這個專案時,只將自己寫的 程式碼編進EXE檔中即可,同時,也記錄未來這個EXE在執行時

15、曉得該找到哪些Package 一同工作。除了 EXE,你還必須一併交給使用者額外的DPL,就如同EXE用到DLL時你必須一併附上DLL是一樣的。接下來的問題是:到底我該交出哪些DPL給使用者呢?以剛才的例子來說,在Build withruntime Packages的選項下方我填的是 vcl30;pa,可是這個輸入盒原本列了一大堆的 Package名稱,我的專案每一個都用得到嗎?關於這點,你可以從表10-9、10-10查出來,這兩個表看起來很大,不過只要稍加對照一下元件盤上的各個分類標籤,大致上就沒錯了 :表 10-9 / Delphi 3 VCL Runtime Package一覽表Pack

16、age 名稱單元或元件名稱VCL30.DPLAxCtrls, Buttons, Classes, Clipbrd, Comctrls, Commctrl,Commdlg, Comobj, Comstrs, Consts, Controls, Ddeml, Dialogs,Dlgs, Dsgnintf, Dsgnwnds, Editintf, Exptintf, Extctrls,Extdlgs,Fileintf,Forms, Graphics, Grids, Imm, IniFiles,Isapi,Isapi2,Istreams,Libhelp,Libintf,Lzexpand, Mapi,

17、Mask, Math,Menu, Messages, Mmsystem, Nsapi, Ole2I, Oleconst, Olectnrs,Olectrls,Oledlg, Penwin, Printers,Proxies,Registry,Regstr,Richedit, Shellapi, Shlobj, Stdctrls, Stdvcl, Sysutils,Tlhelp32, Toolintf, Toolwin, Typinfo, Vclcom, Virtintf,Windows, Wininet, Winsock, Winspool, WinsvcVCLX30.DPLChecklst,

18、 Colorgrd, Ddeman, Filectrl, Mplayer, Outline, Tabnotbk, TabsVCLDB30.DPLBde, Bdeconst, Bdeprov, Db, Dbcgrids, Dbclient, Dbcommon,Dbconsts, Dbctrls, Dbgrids, Dbinpreq, Dblogdlg, Dbpwdlg,Dbtables, Dsintf, Provider, SMintfVCLDBX30.DPLDSS30.DPLDblookup, ReportMxarrays, Mxbutton, Mxcommon, Mxconsts, Mxdb

19、, Mxdcube, Mxdssqry, Mxgraph, Mxgrid, Mxpivsrc, Mxqedcom, Mxqparse, Mxqryedt, Mxstore, Mxtables, MxqvbINET30.DPLCgiapp, Copyprsr, Httpapp, Isapiapp, Masks, Scktcomp,Syncobjs, WebconstINETDB30.DPLQRPT30.DPLDbwebQr2const, Qrabout, Qralias, Qrctrls, Qrdatasu, Qrexpbld, Qrextra, Qrprev, Qrprgres, Qrprnt

20、r, Qrqred32, QuickrptTEE30.DPLArrowcha, Bubblech, Chart, Ganttch, Series, Teeconst, TeeFunci, TeEngine, Teeprocs, TeeshapeTEEDB30.DPLIBEVNT30.DPLDbchart, QrteeIbctrls, Ibevnts, Ibproc32, Ibreg表 10-10 / Delphi 4 VCL Runtime Package一覽表Package 名稱單元或元件名稱VCL40.BPLAx, Buttons, Classes, Clipbrd, Comctrls,

21、Commctrl, Commdlg,Comobj, Comstrs, Consts, Controls, Ddeml, Dialogs, Dlgs,Dsgnintf, Dsgnwnds, Editintf, Exptintf, Extctrls, Extdlgs,Fileintf,Forms, Graphics,Grids, Imm, IniFiles,Isapi,Isapi2,Istreams,Libhelp,Libintf,Lzexpand, Mapi, Mask, Math, Menu,Messages, Mmsystem, Nsapi, Ole2I, Oleconst,Olectnrs

22、,Olectrls,Oledlg, Penwin, Printers,Proxies,Registry,Regstr, Richedit,Shellapi, Shlobj, Stdctrls, Stdvcl, Sysutils, Tlhelp32,Toolintf,Toolwin, Typinfo, Vclcom, Virtintf,Windows, Wininet,Winsock, Winspool, Winsvc(續)表 10-10 / Delphi 4 VCL Runtime Package一覽表VCLX40.BPLChecklst, Colorgrd, Ddeman, Filectrl

23、, Mplayer, Outline, Tabnotbk, TabsVCLDB40.BPLBde, Bdeconst, Bdeprov, Db, Dbcgrids, Dbclient, Dbcommon,Dbconsts, Dbctrls, Dbgrids, Dbinpreq, Dblogdlg, Dbpwdlg,Dbtables, Dsintf, Provider, SMintfVCLDBX40.BPLDSS40.BPLDblookup, ReportMxarrays, Mxbutton, Mxcommon, Mxconsts, Mxdb, Mxdcube, Mxdssqry, Mxgrap

24、h, Mxgrid, Mxpivsrc, Mxqedcom, Mxqparse, Mxqryedt, Mxstore, Mxtables, MxqvbQRPT40.BPLQr2const, Qrabout, Qralias, Qrctrls, Qrdatasu, Qrexpbld, Qrextra, Qrprev, Qrprgres, Qrprntr, Qrqred32, QuickrptTEE40.BPLArrowcha, Bubblech, Chart, Ganttch, Series, Teeconst, Teefunci, Teengine, Teeprocs, TeeshapeTEE

25、DB40.BPLTEEUI40.BPLDbchart, QrteeAreaedit, Arrowedi, Axisincr, Axmaxmin, Baredit, Brushdlg, Bubbledi, Custedit, Dbeditch, Editchar, Flineedi, Ganttedi, Ieditcha, Pendlg, Pieedit, Shapeedi, Teeabout, Teegally, Teelisb, Teeprevi, TeexportVCLSMP40.BPLSampreg, Smpconst除了標準元件之外,專案若是還另外應用了一些網路上抓回來的元件,這些元件

26、如果已經是.DPL型式了,那麼,元件的.DPL也是要一併交出去的。若是元件只提供 .PAS的單元檔,這些元件經由【Component /Install Components】預設 會安裝到 Delphi 3 目錄的 Libdclusr30.dpk 這個 Delphi Users Component 的 Package專案 中,因此,Delphi 3安裝目錄下的Libdclusr30.dpl也是一併要給出去的。當然,現在你已經親身經歷過Package的製作了,應該可以考慮自行將某些元件另外放到某個特定的Package中,免得所有外製元件都擠在同一個Package裏頭。操作步驟請參考剛才製作pa.dpl的作法,只不過,現在要將這些元件的單元,在圖10-7的Package Editor視為AniU.pas,加進Package專案檔。在這一章中,我採用由淺入深漸進的說明方式,寫出了以Delphi發展與使用DLL時的觀念與技術,最後,也提到了自Delphi 3起支援的Package,在研讀過這篇文章的內容後,相信你已經具備了以Delphi發展與應用DLL所必備的知識。期待這篇文章的內容,對於日後閱讀其他的技術文件以及程式的撰寫帶來幫助。593

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!