一、关于包(package)
    (一)编译EXE文件的两种模式
    通常编译一个DELPHI应用程序时,生成一个EXE文件,也就是一个独立的WINDOWS应用程序。
    这个EXE文件,它有两种编译方式。选择方式:
    1、“Project | Options | Package "中,选择‘Build with runtime packages’即带包编译。
    所谓的“带包编译”,即“动态链接”,它需要运行一环境必须向EXE提供标准的动态链接库(BPL文件)。
    因此,动态链接方式不需要将(BPL)代码直接编译进EXE文件中去,运行时,通过运行加载(BPL包)。此时生成的EXE文件,比较小。
    2、“Project | Options | Package "中,取消‘Build with runtime packages’,就是非带包编译。
    所谓的“非带包编译”,就是通常说的“静态链接”就是当一个DELPHI工程被编译的时候,工程所需要的所有代码将被直接链接入你的程序执行文件。结果就是执行文件将包含程序所需要使用到的所有单元(units)。编译的结果:一是编译器将把程序运行所需要的代码直接写入你的EXE文件中,因此产生的程序可以独立运行,二是文件太大,它将全部的基本单元编译进EXE文件中,它不需要任何附属的支持文件(动态运行库BPL文件)
  (二)BPL包文件 
    所谓“包”,就是DELPHI的IDE环境中,被DELPHI应用程序共享的特殊的动态链接库。包允许我们通过多级应用将我们的程序的一部分当做一个分离的模块供其他应用程序来共享。 包大致可分为设计期包和运行期包二种。
    1、设计期包(Design-time packages)
    设计期包用来在DELPHI的IDE环境安装控件和为控件建立特殊的属性编辑器。设计期包允许包含控件、属性和控件编辑器等等,在IDE环境中,这类包是程序设计时所必需的。它
    (1)Delphi自带的设计包
     比如Delphi7的dclact70.bpl文件,它在Delphi\bin目录中,它包含的控件:TStandardColorMap、TTwilightColorMap、TXPColorMap、TActionToolBar、TActionManager、TActionMainMenuBar、TCustomizeDlg。
    (2)第三方提供的设计包
    (3)用户自行开发的设计包
    2、运行期包(Run-time packages)
    运行期包用在运行程序时,提供VCL和库函数的支持,操作上很类似标准的动态链接库。
    (1)封闭的类对象模块
    (2)封装的运行库(函数和过程)
    (3)封装Form窗体
    需要说明的是,采用带包编译,在EXE文件发布时,设计期包和运行期包都要一并发布。
  二、BPL包与DLL
    (一)DLL的核心
    DLL是WINDOWS操作系统中的动态运行库,在WINDOWS系统中,很多应用程序同时运行可能会引起了内存方面的问题,很多程序执行相似的操作任务,但各自又由不同的代码来控制并完成任务,动态运行库的作用就是将你的执行程序中的这些代码放到一个系统共享环境下的DLL中去。可能最为直观的动态链接库例子就是WINDOWS操作系统自己和它本身所带的API了。
    动态链接库通常都是用来集合过程(procedure)和函数(function)以供程序调用。它也能封装对象(Form)。
  (二)二者的异同
    1、DLL是运行期的运行库,BPL也完全担当起DLL动态链接库的功能。
    2、Dll是windows的标准运行库文件,它可以向wimdows操作系统下,运行的由其它语言编译的主程序EXE提供支持(调用)。即Delphi编译的DLL,也可以向C语言的程序提供支持使用。而BPL是Delphi的独特,只能提供缎带Delphi自身使用。
    3、BPL运行包运行时,是与主程序EXE同一线程,可以共享全局变量和类、对象(控件)。而DLL它运行时,Windows为它的线程,所以它与调用它的主程序EXE,不能共享全局变量和类、对象(控件)。
    4、在压缩程序代码上,DLL和BPL扮演着同样重要的角色,使用二者直接地减少了EXE文件尺寸。
    因此,动态运行库(DLL)是用来存储不同环境下应用程序所需要使用到的过程和函数。包不仅能够存储不同环境下应用程序所需要使用到的过程和函数,同时它包含代码单元(untits)、构件和窗体(FORM),还能包含DELPHI中的类(classes),提供引用对象向导编码(object oriented code)发挥重要功能作用。
    这此功能动态运行库(DLL)对此则无能为力了。
    三、通过BPL实现插件框架方式开发
    (一)软件结构

1、 建立软件体系的工程组,由主程序(通常是EXE程序),与各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。

2、让各自的模块,如主程序,插件(DLL或BPL),建立独立的工程(件)。

优点:合起来就是一个系统,分开来,也是独立的工程。方便整个工程的分组开发。

(二) 编译,主程序和各插件工程时,全部采用“BUILD WITH RUNTIME PACKAGE”方式。
    四、建立和使用运行期包
    (一)建立一个新的运行期包
    1.启动DELPHI,并选择File | Close All关闭默认的工程。
    2.选择File | New...,在"New items"对话框中的"new"页面中双击Package图标,就会出现包裹编辑器。包裹编辑器包含2个文件夹:Contains和Requires。
    3、选择Contains文件夹,点击Add按钮,可以增加一个单元文件(构件或是一个简单的代码单元文件)。注意:你添加的是PAS源码文件而不是编译后的DCU文件。当你添加单元文件的同时,包中的单元的名字就显示在包裹编辑器的Contains文件夹中了。
    4.选择Requires文件夹,展开的列表表示包裹所需要的包的DCP文件,包裹文件最基本的就需要引用含有绝大部分标准可视控件的vcl70.dcp文件。
    5.当你添加完单元文件,单击Options按钮,在Description面板中的Usage options组中你需要选择包裹种类:
    (1)Description only(仅设计期包)。
    (2)Runtime only(仅运行期包),其他包的使用者将无法将图示2个构件安装到IDE环境中去。
    (3)Description and Runtime 设计期包和运行期包。
    6.使用File | Save保存包工程文件(DPK),然后保存包文件,如MyVCL22,包裹文件的命名将很重要。
    7.在包裹器中,单击Compile按钮来编译包。
    8.如果不出什么意外,编译包后将建立一个包裹文件(BPL文件),期间你可能还要确定你必须增加的其他包裹(例如MyVCL01),这些包都将在Requires文件夹中列出。
    9.完成,Borland package library文件已经成功建立,就等着使用了。
    在包裹编辑器中有一个Install按钮,就是用来将当前包裹安装成一个设计期包的。如果包裹是run-time only(仅运行期包),那Install按钮将无法使用。
    (二)相关文件
    1、单元源码文件
    2、DPK文件,是包的源文件。
    3、BPL文件,是生成的包文件。注意:生成的*.BPL文件,$(DELPHI)\Projects\Bpl目录中。 
    4、DCP文件,是包中所包含单元文件的编译文件(DCU)的标识信息的集合。
    五、使用运行期包设计程序
    开始使用动态链接编写应用程序时,不需要写代码去加载运行期包裹,只需要在Project | Options中做相关设置,选择在Packages页的Runtime Packages编辑框中的包裹列表,编译程序时将自动链接。应用程序要使用到一个运行期包时,使用ADD按钮来增加包裹文件。
    注意:尽管一个应用程序被链接到运行期包,程序的USES子句所列出的单元文件也必须都是存在的,编译运行期包裹只是告诉应用程序哪里可以找到构件代码而已。
    六、程序发布
    (一)需发布那些BPL文件
     在IDE中编译运行程序后,打开菜单“project-information for ”。你可以看到当前项目所使用的所有的包的名字。
    (二)编译生成的包文件存在哪
    1、系统盘的 windows\system32 目录。
    2、Delphi默认的包的安装路径:$(DELPHI)\Projects\Bpl 目录。
    3、$(DELPHI)\Bin 目录。
    4、安装第三方的组件的目录。
    (三)包文件发布的目录
    1、系统盘的 windows\system32 目录。
    2、与EXE文件相同目录。

特别提示:本人在开发的过程中,发现使用Dll封装Form中,带有数据库读写的控件(如DBGrid)。在嵌入到TabSheet中,出现焦点问题,一时不好解决。特别影响用户的体验,如果使用BPL作为封装Form,就不存在此类问题。

Delphi BPL包的运用相关推荐

  1. Delphi BPL包合并图文教程 IDEWiz tangram-plugin-framework

    Delphi BPL包合并图文教程  Framework IDEWiz tangram-plugin-framework elphi IDE 本身就是一个插件模式的工具,插件的好处不用多说.运行包的B ...

  2. Delphi Bpl包编译Dcp,Bin,Dcu路径设置

    https://www.cnblogs.com/Herge/p/5633152.html  Delphi Bpl包学习 实战截图 -- 对于BPL包,我个人理解是:就是一种封装方式,和DLL,EXE类 ...

  3. Delphi Bpl包学习

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

  4. delphi bpl包窗体继承

    1. BPL手工修改窗体继承时,怎样让其父类的所有控件显示(在设计时)? 在包文件上点击鼠标右键 bplxiexingBom.bpl -> AddNew -> VclForm,新建一个fo ...

  5. 用Delphi制作BPL包

    2019独角兽企业重金招聘Python工程师标准>>> 背景 GCM3构造时间长的问题由来已久.伴随着时间的流逝,系统功能越来越强大,模块越来越多,目前仅GCM一项,需要编译的客户端 ...

  6. delphi Bpl 学习杂记

    bpl包其实就是dll,不过它只能被delphi调用. bpl包分设计器包和运行期包 两种 包可以包含pas和dfm文件,就把它当dll看待就是了. 要调用bpl中的函数需要这样: 由此看出: 如下借 ...

  7. 充分发挥bpl包的作用

    充分发挥包的作用 本章要点: n        为何要用包 n        为何不用包 n        包的类型 n        包文件 n 使用运行期包 n        把包安装到Delph ...

  8. 合并BPL包图文教程

    Delphi IDE 本身就是一个插件模式的工具,插件的好处不用多说.运行包的BPL,其实就是众多单元的集合,因此可以再次重新组合,只要你将各个BPL包用到的单元再组合一次! 本文以  http:// ...

  9. Delphi中BPL包的使用,个人经验

    用包可以分模块编写功能,方便开发阶段的组织,同时也便于后期的升级维护,使升级的粒度越来越少(也是用了C#的类库之后的感悟).下面写几点经验 一.不要用Delphi本身的bpl,把delphi自身的包中 ...

最新文章

  1. Linux 黑话解释:什么是定时任务
  2. python语言单行注释符_Pyhton 单行、多行注释符号使用方法及规范
  3. JFoenix: JavaFX与Google Material Design
  4. C#透明窗体实现方法
  5. java 1m_Java编程测试1M内存可用来缓存多少对象
  6. [转载]帮你入门 详解JRE和JDK的区别
  7. xampp 配置虚拟主机
  8. Android开发笔记(二十七)对象序列化
  9. REMOTE HOST IDENTIFICATION HAS CHANGED!
  10. ctypes库的使用整理
  11. 网络系统设计的一般步骤
  12. JavaScript事件串连执行多个处理过程的方法
  13. android学习之展示图片资源
  14. 打开应用商店显示服务器出错了,Win10应用商店提示“我们这边出错了”的三种解决方法...
  15. 关闭Xshell系统提示音 Tab键 Backspace键
  16. AWK awk xxx xxx
  17. SQL实现分组排序和组内排序(相同分数并列排名)
  18. Docker -- 2 -- 利用docker部署网站和数据库
  19. 车易加加油优惠卡|油价上涨“45元/吨”,由跌变涨
  20. 『杭电1713』相遇周期

热门文章

  1. for example: not eligible for auto-proxying 解决
  2. CF #669 (Div. 2)D. Discrete Centrifugal Jumps(线段树/单调队列优化dp)
  3. Spark SQL 编程初级实践
  4. Power bi 1.5连接Oracle
  5. 软件项目管理 6.10.成本预算
  6. #include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); }
  7. GitHub 上 1400星的 Git 魔法书火了
  8. 2022电大国家开放大学网上形考任务-教育心理专题非免费(非答案)
  9. 【软路由】esxi 配合UPS停电自动关机,网络异常自动重启openwrt虚拟机
  10. 深度探索C++对象模型第2章 构造函数语义学