轉載至:http://www.cnblogs.com/hackpig/archive/2010/02/15/1668513.html
概要介紹:
Object Pascal語言的結構比較特殊,跟C有很大的不同,但是它秉承PASCAL語言的一貫結構化的傳統,相信大家很容易就可以瞭解。
一:Program 單元
一個object Pascal程式,是由一個特殊的單元和若干個可選的單元組成的,也就是說一個最簡單的Object Pascal程式,可以只由一個特殊的單元組成,這個特殊的單元就是Program 單元。在Delphi中,Program 單元也就是Delphi的工程檔案。Program 單元從功能上講,有點像C語言中的主程式,程式再簡單,它也得有一個Main函數。Program單元也就是這樣的主程式。當然,一個程式如果只有Program單元,它也沒多大實際意義(除了一些完成特殊任務的程式外),事實上Delphi的程式至少有一個子程式,即後面要介紹的子程式單元。
下面列出一個典型的Program單元:
Program Project1;
Uses
Forms,
Unit1 in 'Unit1.pas';
{$R *.RES}
Begin
Application.Initialize;
Application.CreateForm(Tform1,Form1);
Application.Run;
End;
Program單元由以下幾個部分組成:
程式首部,由保留字Program後跟一個程式名組成,上例中是Project1。程式首部也可以帶有參數,
不過一般很少用到。
引用部分,由保留字Uses加要引用的單元名組成,上例中有兩個,分別是Forms單元和Unit1單元,
其中Unit1單元還指定在Unit1.pas檔案中。最簡單的程式可以沒有USES部分。
編譯指令,上例中,只有一個編譯指令{$R *.RES},編譯指令也是可選的。
執行部分也稱初始化部分,由保留字Begin和End括起來的一段代碼。
注意:用Delphi開發程式,除了一些特殊需要,如檢查第二個執行個體是否運行,一般很少需要手工修改Program單元,因為Delphi能夠自動建立和維護這個單元,例如當您開始一個新的工種的時候,Delphi自動建立一個Program單元和一個子程式單元。當您向工程中加入了一個新的Form或Unit,或者使用Project|Option…子命令修改了程式名,program單元將自動更新。
二:子程式單元(Unit)
子程式單元這種叫法只是為了和Program單元區別,由於大多數時候,我們幾乎不需要接觸Program單元,所以以後我們提到單元即是指子程式單元。
Object pascal的一個單元,就是一個獨立的Pascal源檔案,副檔名為.Pas。單元的結構分為以下幾個部分:
首部
介面部分
實現部分
初始化部分
終止部分
End;
1:單元首部
單元首部類似於程式單元首部,由保留字Unit加單元名組成,如:
Unit Unit1;
注意:單元首部也是一個完整的語句,因此單元名後應當跟分號,另外單元名必須符合Object Pascal關於標識符的規則,並且在同一個工程中單元名必須是唯一的。
當您儲存檔案時,您使用的儲存檔案名稱,將自動反映到這個部分。而且也會加到程式單元的USES部分中。因此,如果您工程中提示某檔案缺失,你可以檢查一下這個檔案的路徑和名稱是否改動過。DELPHI工程的檔案是不必放在同一目錄下的(但是我建議您這麼做,便於管理)。
2:Interface部分
Interface部分稱為介面部分,用於聲明引用的、常量、類型、變數、過程和函數,單元的Implementa-tion部分(實現部分)也可以聲明引用的單元、常量、類型、變數、那麼這兩者有什麼區別呢?
在Interface部分聲明的引用單元、常量、類型、變數、過程和函數對整個程式是公用的,也就是對所有引用該單元的單元來說,這些聲明都是可見的、可訪問的,例如引用該單元的單元就可以調用在Interface聲明的過程和函數。Interface部分相當於類類型的Public部分。
Interface部分從保留字Interface開始到保留字Implementation前結束。
在Interface部分,過程和函數只需寫出它們的首部,具體的定義是在下面的Implementation(實現部分)給出的。
Interface部分本身又可以由幾個可選的部分組成,分別是單元引用部分(Uses)、常量聲明部分、型別宣告部分、變數聲明部分、過程和函式宣告部分。
單元引用部分(uses)用於列出該單元要引用的標準單元和其它單元。單元引用的概念有點類似於C語言中的INCLUDE,用於把外部的已聲明過的常量、類型、變數、過程或函數引入到本單元中使用,其中標準單元是指Object Pascal預定義好的單元,例如Windows單元、SysUtils單元、Forms單元等,您也可以把其它非標準單元加到Uses,這樣該單元也就能引用這些單元中的常量、類型、變數過程和函數等。當您往一個表單上加入控制項時,該控制項的單元將自動加到該部分,如果你還看不到,存檔就可以看到了。
下面是一個樣本:
Unit Unit1;
Interface
Uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Diglogs;
Type
Tform1=Class(Tform)
Private
Public
End;
Var
Form1:Tform1;
Implementation
{$R *.DFM}
End.
這是一個典型的Delphi自動產生的單元,它僅給出這個表單的結構。在Uses部分,引入了Windows,Messages,SysUtils,Classes,Graphics等單元,這樣就可以直接調用這些單元中的常式,而無需加入單元引用名。例如:
MessageBeep(0);
而不需要這麼寫:
Windows.MessageBeep(0);
儘管這個常式是在Windows單元中聲明的。
注意:如果Interface部分有Uses部分,Uses保留字必須緊跟在保留字Interface後面,儘管可以不在同一行。
上例中,引用的單元都是標準單元,其中有的標準單元幾乎是所有的單元都要用到的,因此Delphi自動把這些加到您的單元的Uses 部分,不過一些不太常用的單元,如果您的程式中要引用,您就必須自已手工把它們加到Uses部分。例如,在程式如果你需要使用sndPlaySound函數來播放一個WAV檔案,而這個函數是在mmsystem單元中聲明的,因此,你需要在Uses 部分加入mmsystem,記得在加入在分號之前,與其他單元用逗號隔開。
加入到Uses單元的順序一般是無關緊要的,但是有的單元如ShareMem單元必須放在第一個。
最後強調一點,就是如果Interface 部分同時有這幾個部分,一定要按照單元引用、常量聲明、型別宣告、變數聲明、過程和函數的順序排列。
3:Implementation部分
Implementation部分分為兩大塊,一塊是聲明部分,包括單元引用、常量、類型、變數、過程和函數的聲明,這一點跟Interface部分相似,所不同的是,在Implementation部分聲明的單元引用、常量、類型、變數、過程和函數只對本單元是公用的、可見的,其它單元即使引用了該單元,也不能訪問它們。另一個不同點是,在Implementation部分聲明的過程和函數,不需要遵循先聲明後定義的規則,而只要直接寫出過程或函數的定義。
Implementation部分的另一大塊是在Interface部分聲明的過程和函數的定義,程式樣本如下:
Unit Unit1;
Interface
Uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Diglogs;
Type
Tform1=Class(Tform)
Procedure FormCreate(Sender:Tobject);
Private
Public
End;
Var
Form1:Tform1;
Implementation
{$R *.DFM}
Procedure Beep;
Begin
MessageBeep(0);
End;
Procedure Tform1.FormCreate(Sender:Tobject);
Begin
Beep;
End;
End.
4:Initialization部分
單元中可以有Initialization部分,這個部分也稱為初始化部分,用於對該單元進行初始化。例如給變數賦初值,分配資源等,不過一般很少用到。
Initialization部分由保留字Initialization加一些語句構成,語句可以是單個語句,也可以是複合陳述式,如果是複合陳述式,應當用Begin和End括起來。
如果有多個單元含有Initialization部分,它們的執行順序和這些單元在Program單元的Uses 部分出現的順序是一致的。
5:Finalization部分
如果單元有Initialization 部分,這個單元才能有Finalization,終止部分的文法和初始化的部分是相似的,是由保留字Fnialization加一些語句構成的,語句可以是單個語句,也可以是複合陳述式,如果是複合陳述式,應當用Begin和End括起來。
如果有多個單元含有Finalization部分,它們的執行順序跟Initialization執行的順序正好相反。
注意:Finalization部分的代碼應當能考慮到這樣一種情況,就是單元的Initialization部分在執行過程中可能會被意外終止,也就是說可能會出現這麼一種情況,就是有些指標的值是nil,那麼在相應地終止,應當避免出現對這些指標的引用。
本章把object Pascal程式的結構全部講述完畢。從下一章開始我將要講述object Pascal語言的“類類型及類引用”,它將是Object Pascal物件導向編程的基礎。
★注意:從下一章開始所講述的內容將涉及到是Object Pascal語言的進階部分,建議朋友們把我講述的前面
六章節的內容重新溫習一遍,否則有可能造成後面章節內容上的理解困難。