回覆列表
  • 1 # 倩倩99196

    關於包,主要有一下幾個問題:

    包的建立,包的安裝,包的使用;

    1、包的建立:

    file->new->other->package,好,就這樣,一個包的雛形就建立好了,現在你就可以往裡頭新增東西了,主要包括兩個方面的東西,一個是requires 一個是contains,其中:

    #requires:用來指定這個包需要使用到的一些外部包的名字;

    #contains:指定這個包需要包含的unit的名字;

    2、包的安裝:

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

  • 中秋節和大豐收的關聯?
  • 小房間要如何裝修與收納呢?