關於包,主要有一下幾個問題:
包的建立,包的安裝,包的使用;
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");
上面的程式碼的uses語句中包含了ForTestUses單元;
程式碼3:
unit ForTestUses;
SysUtils,Dialogs;
TForTestUses = class(TObject)
procedure Show;
********************************* TForTestUses *********************************
procedure TForTestUses.Show;
showmessage("in am contained indirectly");
然後我們對package進行編譯並安裝,發現雖然ForTestUses沒有明確的出現在package的contains裡頭,但是它也一樣的被編譯進了package;下面我們透過一個小程式來驗證一下;
程式的程式碼如下:
unit Unit1;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,FortestPackage,Fortestuses;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
{ Public declarations }
var
Form1: TForm1;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
ForTestUses:TForTestUses;
ForTestpackage:TForTestPackage;
ForTestUses:=TForTestUses.Create;
ForTestUses.Show;
ForTestUses.Free;
fortestpackage:=TForTestpackage.Create;
ForTestpackage.show;
Fortestpackage.Free;
如果ForTestUses沒有被編譯進package裡頭,那麼在unit1的uses語句中新增ForTestUses應該是會出錯的,可是現在沒有,說明它確實是被新增到IAmTestingPackage這個package裡頭了;
關於包,主要有一下幾個問題:
包的建立,包的安裝,包的使用;
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裡頭了;