AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

C++ Builder 创建和编辑包

51自学网 http://www.51zixue.net
10.4 创建和编辑包
创建一个包需要指定:
· 包的一个名字。
· 新包要求使用或链接的其他包的列表。
· 包编译时包含或绑定的单元文件的列表。包实质上是这些包含已编译.BPL功能的源代码单元的封装,包含(Contains)列表是想编译进包的定制组件的源代码单元放置的地方。一个包由C++源文件(.CPP)和扩展名为.BPK的工程选项文件定义。这些文件由包编辑器生成。

10.4.1 创建包
创建包的过程如下。参见10.4.4节可获得关于这些步骤的更多信息。
1) 选择File|New,然后选择Package图标并单击“OK”。
2) 生成的包被显示在包编辑器中。
3) 包编辑器为新包显示出一个Requires节点和一个Contains节点。
4) 要把一个单元加入包含列表,点击Addtopackage快速按钮。在Addunit页的Unitfilename编辑框输入.CPP文件名,或点击Browse浏览文件,然后单击“OK”。选择的单元出现在Contains节点的包编辑器下。通过重复这个步骤增加其他单元。
5) 把一个包加入要求列表,点击Addtopackage快速按钮。在Requires页的Unitfilename编辑框输入一个.BPI文件名,或点击Browse浏览文件,然后单击OK(这将增加语句USEPACKAGE(“packageName.bpi”)到步骤1生成的CPP文件)。选择的单元出现在Requires节点的包编辑器下。通过重复这个步骤增加其他包。

6) 点击Options快速按钮,并决定想创建的包的种类。
· 创建仅用于设计时的包(不能在运行时使用的包),选择Designtimeonly单选按钮。(或增加-Gpd链接器开关到BPK文件中:LFLAGS=...-Gpd....)
· 创建仅用于运行时的包(不能被安装的包),选择Runtimeonly单选按钮。(或增加-Gpr链接器开关到BPK文件中:LFLAGS=...-Gpr....)
· 创建设计时和运行时可用的包,选择Designtimeandruntime单选按钮。
7) 在包编辑器,点击Compilepackage快速按钮编译包。

10.4.2 编辑现有的包
下面是打开和编辑一个现有的包的方法。
· 选择File|Open(或File|Reopen)并选择一个CPP或BPK文件。
· 选择Component|InstallPackages,从DesignPackages列表中选择一个包,并点击Edit按钮。
· 当包编辑器打开时,在Requires节点选择包,右击鼠标,并选择Open。编辑一个包的说明或设置使用选项时,选择包编辑器中的Options快速按钮并选择Description标签页。ProjectOptions对话框的左下角有一个Default复选框。当它被选择时单击OK,所做的选择存为新的包工程的缺省设置。要恢复原来的设置,删除或重命名DEFAULT.BPK文件。

10.4.3 包源文件和工程选项文件
包源文件带有.CPP扩展名。包工程选项文件使用XML格式创建,并带有.BPK(Borland包)扩展名。通过在包编辑器的Contains或Requires子句上右击鼠标,并选择EditOptionSource显示包的工程选项文件。
注意 C++Builder维护.BPK文件。通常不需要自行编辑它。应该使用ProjectOptions对话框的Packages标签页来修改。
一个名为MyPack的包的工程选择文件的一部分如下所示:


在这种情况下,MYPACK.CPP将包括下列代码:


MyPack的包含列表包括3个单元:MyPack本身、Unit2和Unit3。MyPack的要求列表包括VCL50和VCLDBX50。将组件打包如果使用NewComponent向导创建组件(通过选择Component|NewComponent),C++Builder在所需位置插入PACKAGE宏。但若在旧版本的C++Builder中定制组件,必须自行将PACKAGE加入两个地方。
C++Builder中一个组件的头文件声明必须包括以class引导的预定义的宏PACKAGE:
class PACKAGE Mycomponent :...

并且在组件被定义的CPP文件中,必须在Register函数的声明中包括PACKAGE宏:


PACKAGE宏扩展为语句以便允许类可输出到结果BPL文件或从文件中引入。

10.4.4 理解包的结构
“包”包括下列部分:
· 包名。
· 要求列表。
· 包含列表。

1.命名包
包名必须在工程中是唯一的。如果把一个包命名为STATS,包编辑器分别生成一个源文件STATS.CPP和工程选项文件STATS.BPK;编译器生成一个可执行文件STATS.BPL,一个二进制映象STATS.BPI和(可选)一个静态库STATS.LIB。要在应用程序中使用包,把STATS加入RuntimePackages编辑框(选择Project|Options,并点击Packages标签页后)。

2.要求列表
要求列表指定当前包使用的其他外部的包。在编译时,要求列表中列出的外部包自动链接到使用当前包和外部包的某一单元的任何应用程序。如果当前包中包含的单元文件引用其他包的单元,那个包应在当前包的要求列表中出现,或者应将它增加到要求列表中。如果它被从要求列表中省略,编译器将把它引入到包的“隐式包含单元”。

注意 你创建的大多数包将需要VCL50。任何依赖VCL单元的包(包括SysUtils)必须列出VCL50,或另外一个要求VCL50的包要在其要求列表中列出VCL50包。

(1) 避免循环的包引用
包的要求列表中包含循环的引用。这意味着:
· 包不能在它的要求列表中引用自身。
· 一个引用链终止前必须没有重引用链中的任何包。如果包A要求包B,那么之后包B就不能要求包A;如果包A要求包B,并且包B要求包C,之后包C不能要求包A。
(2) 处理重复的包引用
在包的要求列表中,或在RuntimePackages编辑框中,对包的重复引用将被编译器忽略。但为了编程清晰及可读性,应该找到并删除重复的包引用。

3.Contains列表
Contains列表指出被绑定到包的单元文件。如果编写自己的包,就应先将自己的源代码存入.CPP文件,然后将该文件加入到Contains列表当中。避免使用重复的源代码包不能出现在另一个包的Contains列表中。直接包含在Contains列表中的单元,或通过这些单元而间接包含进Contains列表中的单元,在编译的时候都会被绑定到包。

一个单元不能(直接或间接)的被同一个应用程序(包括C++Builder的IDE)所使用的一个以上的包同时包含。这意味着,如果你创建的包中包含VCL50中的一个单元,就不能把这个包装入IDE中。要使用已包含在其他包中的单元,应将该包加入到Requires列表中。

10.4.5 编译包
编译包可以通过IDE,也可以使用命令行编译。
要使用IDE编译包,
1) 选择File|Open,选择包的源文件或工程选项文件,然后点击Open。
2) 打开编辑器后,选择Project|Make或Project|Build。

可以直接在包的源代码中插入编译器描述符。详细信息,参阅下面的“与包相关的编译器描述符”。如果使用命令行编译,可以使用与包相关的几个连接器开关。更多信息,参阅下文的“使用命令行编译器和链接器”。
1. 与包相关的编译器描述符
表10-2列出了可插入包的源代码中的一些包特定的编译器描述符。


当编译时,BPI、BPL和LIB文件生成后缺省放置在由Tools|EnvironmentOptions对话框的Library页中指定的目录。可以点击包编辑器的Options快速按钮显示ProjectOptions对话框,然后在Directories/Conditionals页中修改缺省设置。

 

 

 
上一篇:C++ Builder 发布包  下一篇:C++ Builder 运行时包