转载:http://www.cnblogs.com/gxch/archive/2011/04/23/bpl.html

为什么要使用包?

答案很简单:因为包的功能强大。设计期包(design-time package)简化了自定义组件的发布和安装;而运行期包(run-time package)则更是给传统的程序设计注入了新鲜的力量。一旦把可重用的代码编译为运行期库中,你就可以在多个应用程序中共享它们。所有应用程序都可以通过包访问标准组件,Delphi自己就是这么干的。因为应用程序不必在可执行文件中单独复制一份组件库,这样就大大节省了系统资源和磁盘空间。此外,包还可以减少花费在编译上的时间,因为你只需编译应用程序特有的代码。

如果可以动态的使用包,那么我们还可以获得更多的好处。包提供了一种新颖的模块化方法来开发应用程序。有些时候你也许想把某些模块作为应用程序的可选部件,例如一个记帐系统附带一个可选的HR模块。某些情况下,你只需安装基本的应用程序,而在另外一些情况下你就可能需要额外安装HR模块。这种模块化的方法可以通过包技术很容易的实现。在过去,这只能通过动态装载DLL实现,但是使用Delphi的包技术,你就可以把应用程序的各个模块类型分别打“包”成捆。特别是从包中创建的类对象则属于应用程序所有,因此可以与应用程序中的对象交互。

运行期包与应用程序

许多开发者只把Delphi包看作放组件的地方,事实上包可以(而且也应该)应用于模块化应用程序设计。

为了演示如何用包来模块化你的应用程序,我们创建一个例子:

1、 新建一个具有两个窗体的Delphi程序:Form1和Form2;

2、 将Form2从自动创建窗体列表中移除(Project |Options | Forms);

3、 在Form1上放一个按钮,并且在按钮的OnClick事件处理器中输入如下代码:

with TForm2.Create(Application) do

begin

ShowModal;

Free;

End;

4、记住添加Unit2到Unit1的uses子句中;

5、 保存并运行工程。

我们创建了一个简单的应用程序,它显示一个带按钮的窗体,点击这个按钮则会创建并显示出另一个窗体。

但是如果想将上述例子中的Form2包含在一个可重用模块中,并使它依然可以正常工作,我们该怎么办呢?

答案是:包!

要为Form2创建包需要以下工作:

1、 打开工程管理器(View | Project Manager);

2 、右击Project Group,选择“Add NewProject...”;

3、在“New”项目列表中选择“Package”;

4、 现在你应该可以见到包编辑器;

5、选择“Contains”项目,然后点击“Add”按钮;

6、 然后点击“Browse...”按钮,并选择“Unit2.pas”;

7、现在包中应该包含了“Unit2.pas”单元;

8、 最后保存并编译包。

现在我们完成了这个包。在你的Project\BPL目录中应该有一个名叫“package1.bpl”的文件。(BPL是Borland Package Library的缩写,DCP是Delphi CompiledPackage 的缩写。)

这个包已经完成了。现在我们需要打开包选项开关

并重新编译原先的应用程序。

1、 在工程管理器中双击“Project1.exe”以选中该工程;

2、 右击并选择“Options...”(你也可以从菜单中选择Project | Options...);

3、 选中“Packages”选项页;

4、 选中“Build with runtime packages”检查框;

5、 编辑“Runtime packages”编辑框:“Vcl50;Package1”,并点击“OK”按钮;

6、 注意:不要从应用程序中移除Unit2;

7、 保存并运行应用程序。

应用程序会象从前一样运行,不过区别可以从文件的大小上看出来。

Project1.exe现在只有14K大小,而从前则是293K。如果你用资源浏览器查看EXE和BPL文件的内容,你就会发现Form2的DFM和代码现在都保存在包中。

===============

可以更改包的输出路径,和exe对包的引用路径。 例子:G:\D7\delphi7-2015-2\BPL包

bpl 包的编写和引用的更多相关文章

  1. Delphi Bpl包学习

    对于BPL包,我个人理解是:就是一种封装方式,和DLL,EXE类似,把代码放到包(package)里面保存而已. 一.先说说如何创建BPL包 1.   打开delphi IDE(delphi7 为例) ...

  2. Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFo ...

  3. Intellij Idea系列之导Jar包与编写单元测试(二)

     Intellij Idea系列之导Jar包与编写单元测试(二) 一.初衷 对于很多的初学者来说,Intellij如何导入jar包感到很迷惑,甚至在网上搜过相关文章之后还是云里雾里,本博客通过图文并茂 ...

  4. maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题

    maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题  子类在引用时候 不需要加上版本号

  5. Java中带包(创建及引用)的类的编译

    Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.jav ...

  6. eclipse项目从编程到打jar包到编写BashShell执行

    eclipse项目从编程到打jar包到编写BashShell执行 一.创建Java项目,并编写项目(带额外jar包) 二.打jar包 三.编写BashShell执行 其中一以及二可以参考我的博客 Ec ...

  7. Delphi 调试BPL包中引用另外的BPL的方法。

    在实际程序中,遇到1.bpl 引用了2.bpl中的方法,2.bpl的方法进入后又引用了3.bpl ,刚开始挺蒙,怎么调试呢,  其实bpl就是dll, 故, 1.我在Delphi的run->pa ...

  8. (翻译)使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用

    本文翻译自Scott Hanselman博客: https://www.hanselman.com/blog/WritingSmarterCrossplatformNETCoreAppsWithThe ...

  9. 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

     1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( id int primary keyaut ...

随机推荐

  1. HTML 表格垂直对齐方式

    HTML表格标记教程(25):行的垂直对齐属性VALIGN在垂直方向上,可以设定行的对齐方式,分别有居上.居中.居下3种.基本语法<TR VALIGN="TOP">&l ...

  2. 多线程编程4 - NSOperationQueue

    一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...

  3. uitableviewcell cell.accessoryType 右箭头

    实现右侧的小灰色箭头  只要将cell的accessoryType属性设置为 UITableViewCellAccessoryDisclosureIndicator就可以了. 代码为:cell.acc ...

  4. Codeforces Round #371 (Div. 2)(set\unique)

    B. Filya and Homework time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. 浅析 - Storyboard / Xib

    大家都知道纯代码写应用的成本是很高的,特别是涉及到UI界面的实现,相当耗费时间.之前自己写应用时有了解过Storyboard,也简单使用过,但随着最近深入了解它之后,发现自己低估了它的作用和影响力,因 ...

  6. 警告 - no rule to process file 'WRP_CollectionView/README.md' of type net.daringfireball.markdown for architecture i386

    warning: no rule to process file '/Users/mac/Downloads/Demo/Self/WRP_CollectionView/WRP_CollectionVi ...

  7. Swift - 让程序挂起后,能在后台继续运行任务

    1,程序的挂起和退出 由于iOS设备资源有限.当用户点击了home键,或者另一个应用程序启动了.那么原先那个程序便进入后台被挂起,不是退出,只是停止执行代码,同时它的内存被锁定.当应用程序恢复时,它会 ...

  8. HTTP协议/RTSP协议/RTMP协议的区别

    RTSP. RTMP.HTTP的共同点.区别 共同点: 1:RTSP RTMP HTTP都是在应用应用层. 2: 理论上RTSP RTMPHTTP都可以做直播和点播,但一般做直播用RTSP RTMP, ...

  9. 谈谈我的编程之路---WAMP(二)

    WAMP的一些配置与使用心得(MYSQL) 刚开始接触数据库的时候,我一直认为数据库操作工具和数据库是同一种东西,它们是一体的,后来我才明白,数据库它是一个独立的仓库,用官方点的话来解释 数据库(Da ...

  10. sql server 时间小汇

    SQL server DATE函数 (1)getdate   返回当前系统的日期和时间,精确到3毫秒 要求:获得系统的当前时间 语句:SELECT getdate() 执行结果: 注:getutcda ...