|
CnPack 开源软件项目 2007-11-05 15:14:55 |
CnPackTip#8 什么是运行期包与设计期包 参与讨论: JingYu, Passion, 小夏 整理: SkyJacker 2007.10.16, 2007.11.05 http://www.cnpack.org CnPack III QQ Group:32712412 CnPack IV QQ Group: 130970 转载请保持完整并注明出处。 ====================================================================== 本文档深入明了的阐述了什么是运行期包、设计期包 同时解释了产生 DesignIntf 错误的原因 ====================================================================== 本文以 CnPack.dpk (运行期包)、dclCnPack.dpk (设计期包)为例说明。这两个包,一个是运行期包,另一个是设计期包,设计期包包含有组件编辑器。 组件包通常按运行期包和设计期包两个包来发布,其中运行期包中包含了应用程序编译实际需要的单元,而组件编辑器、属性编辑器这些专门为 IDE 设计期编写的代码在应用程序的 exe 中是不需要的,所以组件源码中会将这些设计编辑器的代码放到单独的 pas 文件中,这些包含设计期 pas 的单元只在设计期包的 dpk 中包含,甚至于那些向 IDE 中注册组件的 Register 函数也可以不放在组件单元中。 设计期包引用了运行期包, Delphi 的包技术是基于 unit 的,实际上build with runtime package 时,是在连接期,将对程序引用到的单元的连接变成对运行包的外部引用。 这样来说吧,我们要编写一个在 IDE 中可以安装使用的组件,需要有一个 TMyComp 组件的实现,然后有一个 Register 函数将组件注册到 IDE 控件面板。 如果这个组件的属性需要编辑器,或者组件本身有编辑器,还需要写一些编辑器的代码。这些在 IDE 中用来编辑组件及其属性的代码,对应用程序来说是没有意义的注册组件,编辑器的 Register 函数对应用程序也是没有意义的,而且这些编辑器是依赖于 IDE 的 ToolsAPI、DesnIntf 等 OTA 单元。 这些 pas 都包含在运行期包的 dpk 文件中。运行期包在工程选项中,是设置为 Runtime only 模式。只能用于运行期,不能进行安装。所以我们在 IDE 中打开 CnPack_D7.dpk 文件,点 Install 是会提示错误的组件的注册、编辑器这些内容,很显然是要引用到组件本身的代码的。 如果只是注册组件,由于 RegisterComponents 在 Classes 中定义,所以没什么问题,但是如果要注册属性编辑器 RegisterPropertyEditor ,则是在DesignIntf 中定义的。DesignIntf 这个单元对应用程序来说根本没有用处的只是 IDE 提供的设计期接口。如果将 Register 函数放在组件实现代码中,间接引用到单元,就可能导致用户在安装编译组件时出现找不到DesignIntf 的错误,因为 DesignIntf 等单元默认是不在 IDE 的搜索路径中的。 从 D6 开始,有个设计期的单元没有放出源码来(Proxies.dcu),在 D6 以上版本的 DesignEditor.pas 中,实现部分引用到了这个单元,而 Borland 没有提供源码,导致大量组件运行期编译不过。 所以我们提倡设计期包与运行期包分开,基本上正规点的组件包都是按这个方法做的。 下面是一个关于 CnPack.dpk (运行期包)、dclCnPack.dpk 的安装顺序例子: Error: 2、如果直接安装 dclCnPack 就不会有这个问题。 |