Delphi Package 無痛使用
作者:Deven Tzu
日期:Sep-3-2001
日期:Sep-3-2001
相信很多使用Delphi的人都有想過將自己的應用系統分割成好幾個Package, 這樣的好處是可以只更新單一的Package (.BPL)就可以了, 而且.BPL還有一個.DLL沒有的好處, 所有的.BPL 可以有一份大家共用的記憶區塊(變數, function, procedure 等), 使用上就很方便了, 但是事實上很多人都因為Package使用上的限制而放棄(我曾經就是一個), 現在我就來介紹Delphi Package的使用方法(不過實際處理方式請參考程式碼, 本說明不多作說明):
簡介
Package 和 "斯斯" 一樣分為二種:
靜態載入:
一般大家在用Delphi時都是使用『靜態載入』, 像VCL的Package就是這個方式, 這個方式的
好處是設計者不用去理會Package 的載入及釋放, 其實設計者根本感覺不到有使用這項技術; 當然您也可以手動將Package掛上系統(project->Options-1111>Packages->Build with runtime packages中加入, 記得Package Name彼此的分隔符號是『;』)
動態載入:
至於『動態載入』當然就和『靜態載入』相反, 不論是載入及釋放都要自己來處理, 看起來好像『動態載入』一無是處, 其實也不是這樣, 『動態載入』可以作到要使用時才載入, 有點像 PnP (隨插即用)的功能, 這是『靜態載入』作不到的.
當然如果您高興的話二種混用也是很好的方式, 也算是各取其優點來使用(本範例就是使用此方式)
當然如果您高興的話二種混用也是很好的方式, 也算是各取其優點來使用(本範例就是使用此方式)
限制
1. 有些情形下使用Package只能間接參考的方式取得資料(變數, 元件, 物件 …).
2. Package Name 不能重覆.
3. Contains 中的 Unit Name 不能在『所有』的Package中重覆出現(只能出現一次).
4. PackageA有使用到PackageB必需要在Requires中引用其 .dcp 檔(Unit及Package的 Head File, C++使用 .DLL不是也要 Include Head File嗎 ?), 但是PackageA及PackageB不能彼此循環引用.
範例說明
本範例主要目的是要讓程式可以像 "獨立執行檔" (就是系統程式都是在一個Proejct中未分割)一樣, 在設計時可以直接引用參考另一個單元(Unit)的東西, 和原來的寫法沒有什麼不同, 不過最好是作成二個 Project 一個是 Design Time 版本(不分割系統), 一個是分發版本(分割系統), 這樣Debug會比較方便些; 本範例是改自 蔡煥麟 先生所寫pkgdemo2.zip
首先要使用Package必需將project->Options->Packages->Build with runtime packages的選項勾選, 再將共用的Package Name 加入(如圖一)
首先要使用Package必需將project->Options->Packages->Build with runtime packages的選項勾選, 再將共用的Package Name 加入(如圖一)
(圖一)
然後在 Requires 中引用使用到的Package dcp 檔(如圖二)
(圖二)
選Options->Description->Runtime only (如圖三), 因為我們是將系統分割不用Design Time Package , 如果選 Designtime and runtime也可以不過會在系統上留一堆Design Time package並沒有意義, 而且會比較佔用記憶體; 至於 Designtime only 就不用說了吧! 您的應用系統應該是要run的吧!
(圖三)
Package1 有使用到Appaddin及PkgDATA所以在Requires 中引用(如圖四)
圖四)
Package1 中只有一個TForm1(可以放很多的TForm就不用我多說了吧), 內容如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
Label1: TLabel;
btnForm2: TButton;
Edit1: TEdit;
DBGrid1: TDBGrid;
btnGetField: TButton;
btnGetVar: TButton;
procedure btnForm2Click(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure btnGetFieldClick(Sender: TObject);
procedure btnGetVarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses PkgUtils, DATA;
{$R *.DFM}
{ The following call Registers the addin with the application. Once
this occurs the application can create instances of this form. }
procedure TForm1.btnForm2Click(Sender: TObject);
begin
inherited;
LoadAddinPackage('Package2', 'Package2.bpl');
ShowModalFormByClassName('TForm2');
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
COMPANY_NO := Edit1.Text; // 對共用變數處理
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Edit1.Text := COMPANY_NO; // 對共用變數處理
end;
procedure TForm1.btnGetFieldClick(Sender: TObject);
var
A: TTable;
begin
// 以下這二行是用間接參考方式對TDataModule1處理, 比較麻煩
// A := FindTable('Table1');
// Edit1.Text := A.FieldByName('CustNo').AsString;
// 對TDataModule1處理
Edit1.Text := DataModule1.Table1.FieldByName('CustNo').AsString;
end;
procedure TForm1.btnGetVarClick(Sender: TObject);
begin
DataModule1.COMPANY_NAME := Edit1.Text;
end;
initialization
RegisterClass(TForm1); // 記得要用GetClass取得需在此註冊(提供RTTI資訊delphi app)
end.
當然如果您實在懶得處理Package的載入及釋放, 也可以全部的Package全部使用『靜態載入』由Delphi幫您處理.Delphi的『動態載入』和『靜態載入』似乎處理的方法不同, 『靜態載入』可以和系統整合的很好(像本例), 但『動態載入』是使用LoadPackage 處理, 但是共用的部份卻無法直接參考, 但是用『靜態載入』卻可以, 我還查不出為何有此差異.
下載範例:PkgDemo4.zip
Delphi Package 學習筆記(含討論信件精華)
作者: 蔡煥麟
日期: Mar-29-2000, Sep-3-2001
日期: Mar-29-2000, Sep-3-2001
在實作 package 時,我遇到了一些問題,承蒙DelphiChat多位熱心朋友的幫忙解決小弟許
多疑惑,因此當傅兄(James Fu)提議將討論信件整理出來並配合範例供大家參考時,我也很贊同,並且將平常的筆記及範例程式稍作整理一番,於是有了這份文件。
如果你正在考慮要不要將 package 實際運應用在專案裡面,你可以先看看 package 的優點及缺點。想要進一步了解package 如何使用,建議您先閱讀參考資料裡面的一些文章,然後下載範例自己動手做看看。
參考資料
市面上已經有很多現成的資源,包括書籍,雜誌,網際網路上面都有介紹 package 的基礎知識,所以我並不想在這裡重複這些東西,我將這些資源列出來供需要的人參考:
∙ Delphi Package 無痛使用 by Deven Tzu。
∙ Delphi 學習筆記 (Win32 基礎篇) by 錢達智,碁峰出版。
∙ Object Packages Enable Highly Modular Applications by James Heyworth
Presented to the Inprise Asia-Pacific Conference, 10-13-1998
Presented to the Inprise Asia-Pacific Conference, 10-13-1998
∙ The Builder Pattern
Extending Frameworks - Building Add-in Packages
by Xavier Pacheco
Extending Frameworks - Building Add-in Packages
by Xavier Pacheco
∙ Dynamically loaded package demo
PkgDemo.zip (Created 10/29/97, Size 13,217 bytes)
This application and associated package demonstrates how you can use the packages feature in Delphi 3 to partition your applications. The example illustrates loading a package and instantiating a form class from the package. Additionally, it provides tips on successfully unloading packages.
PkgDemo.zip (Created 10/29/97, Size 13,217 bytes)
This application and associated package demonstrates how you can use the packages feature in Delphi 3 to partition your applications. The example illustrates loading a package and instantiating a form class from the package. Additionally, it provides tips on successfully unloading packages.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论