天天看點

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裡頭了;

繼續閱讀