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

posted @ 2006-09-24 16:34  拿走不谢  阅读(1478)  评论(0编辑  收藏  举报