天天看点

package的创建安装和使用

关于包,主要有一下几个问题:

包的创建,包的安装,包的使用;

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里头了;

继续阅读