无痛使用Delphi Package

Package的优点

  • 应用程序可以被高度的模块化 , 而且可以逐渐交付完成的功能给客户
  • 维护方便 , 可以只更新单一的模块功能
  • 提升程序的载入速度
Package的缺点
  • 有些情形下使用Package只能间接參考的方式取得资料(变量, 类 …).
  • Package Name 不能重复.
  • Contains 中的 Unit Name 不能在所有的Package中重复出现 , 只能出现一次
  • PackageA有使用到PackageB必需要在Requires中引用 但是PackageA及PackageB不能彼此循环引用.
Package种类当用户运行应用程序时 , 运行时程序包提供功能 。设计时程序包用于在IDE中安装组件并为自定义组件创建特殊的属性编辑器 。单个包可以在设计时和运行时均起作用 , 并且设计时包经常通过在其require子句中引用运行时包来工作 。
  • 设计期包(Designtime only) -用来在DELPHI的IDE环境安装控件和为控件建立特殊的属性编辑器 。 设计期包允许包含控件、属性和控件编辑器等等 ,
  • 运行期包(Runtime only)-当运行程序时提供VCL和库函数的支持 , 操作上很类似标准的动态链接库 。 Install按钮无法使用 。
  • 设计和运行期包(Designtime and Runtime ):设计与运行时都能用

无痛使用Delphi Package文章插图
Package文件说明BPL 英文全称 Borland Package library, 是一种特殊的DLL文件 , 用于代码重用和减少可执行文件 。 编译bpl时 , 仅需要添加相应功能的pas文件 , 如果有窗体 , 则需要添加dfm文件 。 既然是DLL文件 , 那就是在运行时所需要的文件 。 BPL相当于C++中的DLL
DCP 英文全称:delphi compiled package , 是 package 编译时跟 bpl 一起产生出来的 , 记录着 package 中公开的 class、procedure、function、variable、const.... 等等的名称和相对位置 。 如果 某个控件包 A 引用了 控件包 B , 当 控件包 A 编译时 , 需要 控件包 B.dcp , 若 控件包 B 有修改 , 更改了公开的界面 , 则 控件包 A 必须在 控件包 B 编译之后重新编译 , 以引用新的 B.dcp 。 否则 , 当 控件包 A 执行时 , 执行到引用自 控件包 B 的内容时 , 就会出现错误 。 DCP相当于C++中的Lib , 编译时需要 。
【无痛使用Delphi Package】DCU 英文全称:Delphi Compiled Unit File , 是delphi单元文件.pas文件编译后产生的文件 , 感觉没有太大用处 。
Package加载方式Package中的代码
unit Unit2;interfaceuses Vcl.Dialogs;//函数案例function add(Num1, Num2: Integer): Integer; stdcall;//过程案例procedure ShowMsg(Str: String); stdcall;type//类的案例TUser = classpublicfunction ShowString(): string;end;// 需要像DLL一样声明导出函数的列表 , 如果是静态导入此项可以省略exports add, ShowMsg;implementationprocedure ShowMsg(Str: String);beginshowmessage(Str);end;function add(Num1, Num2: Integer): Integer;beginResult := Num1 + Num2;end;{ TUser }function TUser.ShowString: string;beginResult := 'HelloWorld';end;end.静态加载一般大家在用Delphi時都是使用『静态载入』, 像VCL的Package就是这种方式, 这种方式的好处是设计者不用去理会Package 的载入和释放, 其实设计者根本感觉不到设用这项技术; 当然也可以手动将Package加入到项目中『project->Options->Packages->Build with runtime packages中加入Package Name彼此的分隔符是分号』
无痛使用Delphi Package文章插图
无痛使用Delphi Package文章插图


推荐阅读