捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
Delphi Package 演示
关键字:Package 包 BPL
来 自:原创
平 台:Win9x,Win2k/NT 下载所需:0 火柴
深浅度:中级 完成时间:2001/9/3
发布者:lycnew 发布时间:2003/11/28
编辑器:DELPHI5 语  种:繁体中文
分 类:系统 下载浏览:2168/18766
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
Delphi Package 

相信很多使用Delphi的人都有想過將自己的應用系統分割成好幾個Package, 這樣的好處是可以只更新單一的Package (.BPL)就可以了, 而且.BPL還有一個.DLL沒有的好處, 所有的.BPL 可以有一份大家共用的記憶區塊(變數, function, procedure 等), 使用上就很方便了, 但是事實上很多人都因為Package使用上的限制而放棄(我曾經就是一個), 現在我就來介紹Delphi Package的使用方法(不過實際處理方式請參考程式碼, 本說明不多作說明):

簡介
Package 和 "斯斯" 一樣分為二種:

靜態載入:

一般大家在用Delphi時都是使用『靜態載入』, 像VCL的Package就是這個方式, 這個方式的好處是設計者不用去理會Package 的載入及釋放, 其實設計者根本感覺不到有使用這項技術; 當然您也可以手動將Package掛上系統(project->Options->Packages->Build with runtime packages中加入, 記得Package Name彼此的分隔符號是『;』)

動態載入:

至於『動態載入』當然就和『靜態載入』相反, 不論是載入及釋放都要自己來處理, 看起來好像『動態載入』一無是處, 其實也不是這樣, 『動態載入』可以作到要使用時才載入, 有點像 PnP (隨插即用)的功能, 這是『靜態載入』作不到的.

當然如果您高興的話二種混用也是很好的方式, 也算是各取其優點來使用(本範例就是使用此方式)


限制
有些情形下使用Package只能間接參考的方式取得資料(變數, 元件, 物件 …). 
Package Name 不能重覆. 
Contains 中的 Unit Name 不能在『所有』的Package中重覆出現(只能出現一次). 
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 加入(如圖一)

(斑竹加:图片未加载)  

然後在 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資訊)

end.
當然如果您實在懶得處理Package的載入及釋放, 也可以全部的Package全部使用『靜態載入』由Delphi幫您處理.Delphi的『動態載入』和『靜態載入』似乎處理的方法不同, 『靜態載入』可以和系統整合的很好(像本例), 但『動態載入』是使用LoadPackage 處理, 但是共用的部份卻無法直接參考, 但是用『靜態載入』卻可以, 我還查不出為何有此差異.

Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
如何在包(Package)内部的子窗口中控制主程序
ctu 2006/12/11 下+1969/浏+10991 评+3
BPL 的简单使用 (带接口的窗体)
zbluecn 2006/9/9 下+2359/浏+17457 评+11
BPL 使用的例子程式
hsgrass 2005/12/10 下+3247/浏+14586 评+3
Delphi Package 使用集锦
lycnew 2004/4/24 下+4884/浏+16941 评+2
Delphi Package 演示
lycnew 2003/11/28 下+2168/浏+18767 评+2
相关评论
共有评论2条 当前显示最后2条评论
tim001 2004/8/27 13:42:30
Look
hsgrass 2005/11/28 15:54:52
谢谢,正需要:)
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2012 V3.01 沪ICP备05001939号 更新RSS列表