悟透delphi 第五章 包

來源:互聯網
上載者:User
第五章          包

我們在日常生活中會用到各式各樣的包,錢包、公事包、背包、書包……,包裡面都裝有經常要用的東西。一旦你那天要出門遠行,帶上該帶的包就可以了。不用再考慮包裡面具體的東西,儘管包裡有的東西用得著而有的東西用不著。有了這些包,你就可以一身輕鬆地旅遊。當然,打包打得不好或者包太多也會成為累贅。
同樣,在DELPHI中,你可以將常用的程式和資料放到包裡,讓這些包伴隨你的程式發布和運行。這時候,程式可以變得很短小而輕盈,輕鬆一身。特別是在包可以被多個應用程式模組共同使用的情況下,可以讓應用程式的分發與管理變得更加方便自如。
第一節  包是什麼
包是一種特殊的動態串連庫,它是以.BPL(Borland Package Library)為副檔名的可執行模組。這種動態串連庫被應用於DELPHI應用程式或DELPHI的IDE。在DELPHI中,有僅用於運行時的包(Runtime Only Packages)、僅用於設計時的包(Designtime Only Packages)以及可同時用於運行時和設計時的包(Runtime and Designtime Packages)。
運行時包為應用程式提供特定的功能,是應用程式所依賴的運行庫。而設計時包用於將元件安裝到DELPHI的IDE環境中,建立諸如僅在IDE中使用的屬性編輯器等輔助設計項目,以及擴充IDE功能的設計專家和嚮導程式等。一個包可以同時具有設計時和運行時的功能,而設計時包也一般都會調用運行包。
與其他運行庫一樣,包中包含有應用程式可共用程式碼和資料。在DELPHI6中,最常用的包可能應該算是VCL60.BPL。按包模式編譯的應用程式一般都會用到VCL60.BPL,除非你的應用程式不使用DELPHI的元件庫。按包模式編譯時間,引用某個包的可執行模組,如EXE、DLL或其BPL模組,只會包含對該包中的資料和代碼的引用,而不會包含這些代碼體和資料體。
想要在DELPHI中將程式編譯成使用包的形式是非常簡單的。只要開啟Project Options對話方塊Packages頁面的Build with runtime packages選項,並在其下面的編輯框中輸入想要是用得包,然後編譯器即可。
 
用包編譯模式編譯的執行檔案尺寸往往比正常編譯的執行檔案小一個數量級。這是因為,正常編譯出來的執行檔案中,本身就包含了程式所用到的DELPHI控制項、過程和函數等一大堆的資料和代碼。正常編譯的執行檔案通常可以獨立運行,不需要其它支援。而用包編譯模式編譯出來的執行檔案中,是不包含DELPHI控制項、過程和函數等資料和代碼的。不過它的運行是需要包檔案支援的,即需要*.BPL檔案(Borland Package Library)的支援。
編寫使用包的程式與編寫不使用包的程式沒有任何的不同。都是use相關的單元,然後使用該單元中的資料、對象、過程、函數和方法。最後,只需要要在編譯時間決定是否使用包模式,這就是DELPHI的方便性和簡潔性。
在DELPHI中,包也是IDE賴以進行可視化程式設計的基本核心。幾乎所有的DELPHI元件都存在於包之中。在DELPHI的設計開發環境中使用的包是設計包,元件面板上的各種元件就是它提供的。
一個包可以是專門用於可視化設計 環境中(設計包),也可以是專門用於運行環境中(運行包),或者兩種環境下都可以用的(設計和運行包)。什麼東西都可以放到包裡,常量、變數、過程、函數、類、元件……,真的可以說是包羅永珍。
你也可以建立你自己的包,並將常用的程式單元放到包中去。

第二節  包的原理
我們知道包編譯後產生的BPL檔案實際上就是一個DLL檔案。但是,我們在程式中使用包中的過程或函數時,既不需要在包中引出(exports)這些過程和函數,也不需要在引用的程式將這些過程和函式宣告為外部的(external)。而使用DLL中的過程或函數則必須這樣做。雖然,與DLL一樣,這些過程和代碼在進程空間中都是共用的,但包中的過程或函數使用起來更方便直觀。更為驚奇的是,包中聲明的全域變數是可以直接存取的,而且在包中定義的一個全域變數,在整個程式空間中有且只有一個該變數。既不會象DLL中的變數那樣不可以直接存取,又不象非包編譯的各個可執行模組那樣各自有一份該變數的副本。
這是為什麼呢?
原來,這是DELPHI施的魔法。
第三節  調試包
以前,我曾讀到一本講開發DELPHI元件的好書,寫的很精彩,讓我受益頗多。不過其中談到:由於沒有辦法在來源程式基礎上調試包中的元件,所以開發元件一定要特別認真仔細的寫好元件的代碼。的確,用DELPHI單獨開啟一個*.DPK檔案,DELPHI的Run(F9)、Step Over(F8)、Track Into(F7)等Debug命令全部無效。自己再想想,DELPHI的IDE又與設計時包檔案有著非常密切的關係。在載入了包的IDE運行環境中要調試包本身,似乎有點像邏輯學上的自反悖論。後來,我就一直相信包是不能在來源程式基礎上調試的。
然而,包是可以直接在DELPHI的IDE環境內調試原代碼的!不但可以調試運行時刻的包(Runtime Package),而且還可以調試設計時刻包(Designtime Package)!
在一次偶然中,我硬是強行將我的包加入到DELPHI的項目組(Project Group)中。這時,我驚奇地發現運行程式的工具按鈕是有效。當時,我真不敢相信自己的眼睛!特別是有那本權威書籍在我腦海中形成的根深蒂固的印象。
隨後的實踐證明,只要包檔案處在一個項目組中,就可以象調試DLL項目一樣調試它。只需要在運行參數(Run Paramenters)中設定相應的主應用程式(Host Application),即可開始調試。當然,主應用程式一定要是按包編譯(Build with runtime packages)的。
為什麼會這樣呢?
我想,DELPHI的一個專案檔編譯之後最終都會形成一個可執行模組,要麼是EXE檔案,要麼是DLL檔案。其實,包編譯後的BPL檔案也是一個DLL檔案,一個可執行模組。因此,DPK檔案也相當於是一個專案檔。只是,用DELPHI開啟DPK檔案時沒有被當作項目開啟,不知何故。而在項目組中,DELPHI把每一個加入的項都當作項目來啟用。要知道,一個典型的應用系統常常是由EXE、DLL和BPL共同組成。因此,包作為項目加入到項目組中也是合情合理的,DELPHI也因該是這樣處理。
要調試一個單獨的包,可以這樣操作。首先,關閉DELPHI開啟的所有項目,即用File/Close All功能表命令。然後,用View/Project Manager功能表命令開啟專案管理器。接著,在專案管理器中按滑鼠右鍵,選擇Add Existing Project命令。在彈出的開啟檔案視窗中,應該選擇開啟*.DPK的檔案。找到你要調試的包檔案之後,即可將包檔案加入當前項目組中。這時,DELPHI的Run(F9)、Step Over(F8)、Track Into(F7)等Debug命令都是有效。最後,只需要設定主應用程式(Host Application),即可開始調試包。
如果要調試Designtime Package,或者要調試你開發的元件在IDE環境中的錯誤,該怎麼辦呢?
很簡單,只需要將Host Application設定為Delphi32.exe即可。當然Delphi32.exe的具體位置要看你安裝DELPHI的具體目錄,典型的是:C:/Program Files/Borland/Delphi5/Bin/目錄。這樣,你就可隨心所欲地調試包在IDE環境下的行為了。不過,不要忘記一定要首先將你的包安裝到IDE環境中,否則Delphi32.exe啟動時並不會載入未安裝的包。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.