关于包,主要有一下几个问题:
包的创建,包的安装,包的使用;
1、包的创建:
file->new->other->package,好,就这样,一个包的雏形就创建好了,现在你就可以往里头添加东西了,主要包括两个方面的东西,一个是requires 一个是contains,其中:
#requires:用来指定这个包需要使用到的一些外部包的名字;
#contains:指定这个包需要包含的unit的名字;
2、包的安装:
在编辑好包的requires和contains的条目之后,先点击compile,再点击install按钮,ok,你已经在ide中安装了一个你自己的包;
3、包的使用:
参考下面的 代码3
需要注意的地方:
a.一个包不能出现另外一个包的contains里头;
b.在编译的时候,被包含在contains里头的单元,以及被这些包含在contains里头的单元uses的单元都会被编译进这个包里头;当然了,这里指的是用户自定义的单元;
c.如果有多个package将要被同一个应用application(包括delphi ide)使用,那么些package里头不应该有相同的unit,无论他们是被直接的还是间接的(所谓的间接就是b中的那种情况)被包含进去的;这就是说,如果你的创建一个package,这个contains了一个vcl里头的unit,那么你就不能将这个package安装到ide里头去。那么如果你一定要用到一个已经被打包的unit的话,你可以将这个unit所在的package加入到requires中去;
下面是一个例子:
我们新建一个包,这个包的代码如下:
代码1
package IAmTestingPackage;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $40000000}
{$IMPLICITBUILD OFF}
requires
rtl,
vcl;
contains
ForTestPackage in 'ForTestPackage.PAS';
end.
我们看到包里头contains了一个叫做ForTestPackage 的单元;
代码2:
unit ForTestPackage;
interface
uses
SysUtils,Dialogs,ForTestUses;
type
TForTestPackage = class(TObject)
public
procedure show;
end;
implementation
{
******************************* TForTestPackage ********************************
}
procedure TForTestPackage.show;
begin
showmessage('i am in the package,i am contains directly');
end;
end.
上面的代码的uses语句中包含了ForTestUses单元;
代码3:
unit ForTestUses;
interface
uses
SysUtils,Dialogs;
type
TForTestUses = class(TObject)
public
procedure Show;
end;
implementation
{
********************************* TForTestUses *********************************
}
procedure TForTestUses.Show;
begin
showmessage('in am contained indirectly');
end;
end.
然后我们对package进行编译并安装,发现虽然ForTestUses没有明确的出现在package的contains里头,但是它也一样的被编译进了package;下面我们通过一个小程序来验证一下;
程序的代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,FortestPackage,Fortestuses;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ForTestUses:TForTestUses;
ForTestpackage:TForTestPackage;
begin
ForTestUses:=TForTestUses.Create;
ForTestUses.Show;
ForTestUses.Free;
fortestpackage:=TForTestpackage.Create;
ForTestpackage.show;
Fortestpackage.Free;
end;
end.
如果ForTestUses没有被编译进package里头,那么在unit1的uses语句中添加ForTestUses应该是会出错的,可是现在没有,说明它确实是被添加到IAmTestingPackage这个package里头了;