Delphi入門基礎(chǔ)教程:ObjectPascal中文參考手冊(可打印版)_第1頁
Delphi入門基礎(chǔ)教程:ObjectPascal中文參考手冊(可打印版)_第2頁
Delphi入門基礎(chǔ)教程:ObjectPascal中文參考手冊(可打印版)_第3頁
Delphi入門基礎(chǔ)教程:ObjectPascal中文參考手冊(可打印版)_第4頁
Delphi入門基礎(chǔ)教程:ObjectPascal中文參考手冊(可打印版)_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ObjectPascal參考手冊(Ver0.1ezdelphi@OverviewOverview(概述Usingobjectpascal(使用objectpascalObjectPascal是一種高級編譯語言,具有強類型(對數(shù)據(jù)類型的檢查非常嚴格特性,支持結(jié)構(gòu)化和面向?qū)ο缶幊獭K膬?yōu)點包括代碼的易讀性、快速編譯,以及支持多個單元文件從而實現(xiàn)模塊化編程。ObjectPascal具有一些特性以支持Borland組件框架和RAD(快速應(yīng)用程序開發(fā)環(huán)境。在很大程度上,本語言參考的說明和示例假定你使用Borland公司的開發(fā)工具,如Delphi和Kylix。絕大多數(shù)使用Borland開發(fā)工具的開發(fā)者是在IDE(集成開發(fā)環(huán)境環(huán)境下編寫代碼并進行編譯。Borland開發(fā)工具幫助我們設(shè)置工程和源文件的許多細節(jié),比如維護單元的依賴信息。并且,使用這些工具在程序的組織上還有一些限制,嚴格說來,這不是ObjectPascal語言規(guī)范的一部分。比如,Borland開發(fā)工具遵循某些文件和程序的命名約定,若你在IDE以外編寫代碼并使用命令行來編譯,你可以避開這些限制。這些幫助主題假設(shè)你在IDE環(huán)境下工作,并且使用VCL(可視化組件庫和/或CLX(跨平臺組件庫創(chuàng)建應(yīng)用程序。但有時候,Borland一些特定的規(guī)則和ObjectPascal的通用規(guī)則并不相同。Programorganization(程序組織Programorganization:Overview(概述應(yīng)用程序通常被分成多個源代碼模塊,我們稱它們?yōu)閱卧?unit。每個程序以一個程序頭(heading開始,它為程序指定一個名稱。在程序頭之后是一個可選的uses子句,然后是一個由聲明和命令語句組成的塊(block。uses子句列出了那些鏈接到程序的單元,這些單元可以被不同的程序共享,并且通常有自己的uses子句。uses子句給編譯器提供各模塊間的依賴信息,因為這些信息是存于模塊自身的,所以,ObjectPascal程序不需要makefile文件、頭文件以及include預處理指令(這些概念你可能要參考C語言。每當一個工程調(diào)入IDE時,ProjectManager創(chuàng)建一個makefile,但只有在包含多個工程的工程組中才保存這些文件。關(guān)于程序結(jié)構(gòu)和依賴關(guān)系的更多內(nèi)容,請參考程序和單元。Pascalsourcefiles(Pascal源文件編譯器期望在以下三種文件中取得Pascal源代碼:?單元源文件(文件擴展名為.pas?工程文件(文件擴展名為.dpr?包源文件(文件擴展名為.dpk單元源文件包含程序代碼的主要部分,每個程序包含一個工程文件和多個單元文件。工程文件相當-1-Overview于傳統(tǒng)Pascal語言的‘主’程序文件,它把各單元文件組織成一個程序。Borland開發(fā)工具自動為每一個應(yīng)用程序維護一個工程文件。如果從命令行編譯一個程序,你可以把所有源代碼放在單元文件(.pas中,但如果用IDE創(chuàng)建程序,則必須有一個工程文件(.dpr。包源文件類似于工程文件,但它們用來創(chuàng)建稱為包的特殊的動態(tài)鏈接庫(DLL。關(guān)于包的更多信息,請參考動態(tài)鏈接庫和包。Otherfilesusedtobuildapplications(創(chuàng)建程序所需的其它文件除了源代碼文件,Borland工具還需要幾種非Pascal文件來創(chuàng)建程序。它們是自動維護的,包括以下文件:?窗體文件,擴展名為.dfm(Delphi或.xfm(Kylix?資源文件,擴展名為.res(已經(jīng)編譯的資源文件?工程選項文件,擴展名為.dof(Delphi或.kof(Kylix窗體文件或者是一個文本文件,或者是一個編譯的資源文件,資源文件能包含位圖、字符串等等。每個窗體文件表示一個窗體,通常對應(yīng)于程序中的一個窗口或?qū)υ捒颉DE允許以文本方式察看和編輯窗體文件,并且能以文本或二進制格式保存它。雖然默認是以文本方式保存窗體,但通常不要手動編輯它,更常用的方式是使用Borland提供的可視化設(shè)計工具。每個工程至少有一個窗體,每個窗體有一個關(guān)聯(lián)的單元文件(.pas,默認情況下,單元的文件名和窗體文件名相同。除了窗體文件,每個工程使用一個資源文件(.res保存位圖作為程序的圖標。默認情況下,這個文件和工程文件(.dpr同名。要改變程序的圖標,可使用ProjectOptions對話框。工程選項文件(.dof或.kof包含編譯器和鏈接器設(shè)置、搜索路徑以及版本信息等等。每個工程對應(yīng)一個選項文件,它和工程文件同名。通常情況下,文件中的選項是通過ProjectOptions對話框來完成的。IDE中的許多工具保存其它類型的文件。桌面設(shè)置文件(.dsk或.desk包含窗口的排列信息及其它設(shè)置項目。桌面設(shè)置或者特定于一個工程(和某個工程相關(guān),或者作用于整個環(huán)境(environment-wide(不是特定于某個工程,對所有工程都有效。這些文件對編譯沒有影響。Compiler-generatedfiles(編譯器生成的文件在第一次生成一個程序或一個標準DLL時,編譯器為工程中所使用的每個新單元創(chuàng)建一個編譯(過的單元文件.dcu(Windows或.dcu/.dpu(Linux。工程中所有的.dcu文件(Windows或.dcu/.dpu文件(Linux被鏈接到一個單獨的可執(zhí)行文件或共享庫中;當?shù)谝淮紊梢粋€包時,編譯器為包所包含的每個新單元創(chuàng)建一個.dcu文件(Windows或.dpu文件(Linux,然后創(chuàng)建.dcp文件和包文件(關(guān)于庫和包的更多信息,請參考庫和包。若使用–GD開關(guān),鏈接器生成一個map文件和.drc文件,.drc文件包含字符串資源,能被編譯進資源文件中。當重新生成一個工程(程序、庫或者包時,除非自上次編譯后單元文件(.pas發(fā)生了改變、或者沒發(fā)現(xiàn).dcu文件(Windows和.dcu/.dpu文件(Linux、或者明確告訴編譯器重新編譯它,否則,單元文件不會被重新編譯。實際上,只要編譯器能找到編譯(過的單元文件(.dcu或.dpu,單元源文件不是必需的。-2-OverviewExampleprograms(實例程序Aboutexampleprograms(關(guān)于實例程序下面的實例演示ObjectPascal編程的基本特點,它們是一些簡單的ObjectPascal程序,不能在IDE下編譯,你可以從命令行編譯它們。Asimpleconsoleapplication(一個簡單的控制臺程序下面是一個簡單的控制臺程序,你可以從命令行編譯并運行它。programGreeting;{$APPTYPECONSOLE}varMyMessage:string;beginMyMessage:='Helloworld!';Writeln(MyMessage;end.第一行聲明程序叫做Greeting;{$APPTYPECONSOLE}指示字告訴編譯器,這是一個控制臺程序,它要從命令行運行;接下來的一行聲明了一個變量MyMessage,它存儲一個字符串(ObjectPascal包含真正的字符串類型。程序把字符串”Helloworld!”賦給變量MyMessage,然后使用Writeln例程把MyMessage的內(nèi)容送到標準輸出設(shè)備(Writeln在System單元聲明,編譯器在每個程序中自動包含這個單元。你可以把這個程序(源代碼輸入到一個叫Greeting.pas或Greeting.dpr的文件中,然后在控制臺輸入如下命令編譯它:對于Delphi:DCC32Greeting對于Kylix:dccGreeting執(zhí)行的結(jié)果是輸出信息”Helloworld!”。除了簡單,上面這個例子和我們在Borland開發(fā)工具下寫的程序有幾個重要的不同:首先,這是一個控制臺程序,Borland開發(fā)工具通常創(chuàng)建圖形界面的程序,因此,你不大可能調(diào)用Writeln(GUI程序不能調(diào)用Writeln;而且,整個程序只有一個文件。在一個典型的程序中,程序頭,也就是例子中的第一行,將被放在一個單獨的工程文件中。工程文件通常不包含實際的程序邏輯,而只是調(diào)用在單元文件中定義的方法。Amorecomplicatedexample(一個稍微復雜的程序下面的實例程序被分成兩個文件:一個工程文件,一個單元文件。工程文件可以存為Greeting.dpr,它看起來這樣:-3-Overview-4-programGreeting;{$APPTYPECONSOLE}usesUnit1;beginPrintMessage('HelloWorld!';end.第一行聲明程序叫做Greeting,它同樣是個控制臺程序。usesUnit1;子句告訴編譯器,Greeting包含(引用一個叫做Unit1的單元。最后,程序調(diào)用PrintMessage過程,并把字符串”Helloworld!”傳遞給它。請注意,PrintMessage過程是從哪里來的?它是在Unit1單元定義的。下面是Unit1單元的源代碼,你能把它保存在一個叫Unit1.pas的文件中:unitUnit1;interfaceprocedurePrintMessage(msg:string;implementationprocedurePrintMessage(msg:string;beginWriteln(msg;end;end.Unit1單元定義一個叫做PrintMessage的過程,它接收一個字符串作為參數(shù),并把它送到標準輸出設(shè)備(在Pascal中,沒有返回值的例程叫過程,有返回值的例程叫函數(shù)。請注意,PrintMessage在Unit1中聲明了兩次,第一次是在關(guān)鍵字interface的下面,這使得它對于引用Unit1單元的其它模塊(比如Greeting是可用的;第二次聲明是在關(guān)鍵字implementation的下面,它實際定義PrintMessage過程?,F(xiàn)在你可以在控制臺輸入如下命令編譯Greeting。對于Delphi:DCC32Greeting對于Kylix:dccGreeting沒必要在命令行參數(shù)中包含Unit1。當編譯器處理Greeting.dpr時,它自動查找Greeting程序所依賴(引用的單元文件。程序的執(zhí)行結(jié)果和前面的實例相同,它輸出信息”Helloworld!”。Anativeapplication(在IDE下設(shè)計程序我們的下一個實例程序是在IDE下用VCL或CLX組件生成的,它使用自動產(chǎn)生的窗體文件和資源文件,因此,你不能僅僅使用源代碼來編譯它。它闡明了ObjectPascal的重要特點。除包含多個單元外,這個程序還使用了類和對象。Overview-5-程序包含一個工程文件和兩個單元文件。首先是工程文件:programGreeting;{注釋寫在一對大括號中}usesForms,{在Linux下改為QForms}Unit1in'Unit1.pas'{Form1所在的單元},Unit2in'Unit2.pas'{Form2所在的單元};{$R*.res}{這個指示字鏈接工程的資源文件}begin{對Application的調(diào)用}Application.Initialize;Application.CreateForm(TForm1,Form1;Application.CreateForm(TForm2,Form2;Application.Run;end.我們的程序還是叫Greeting。它引用了三個單元:一個是Forms單元,它是VCL和CLX的一部分;二是Unit1單元,它和程序的主窗體(Form1相關(guān)聯(lián);三是Unit2單元,它和另一個窗體(Form2相關(guān)聯(lián)。這個程序調(diào)用Application對象的一系列方法。Application是類TApplication的一個實例,它在Forms單元定義(每個工程自動生成一個Application對象。這些調(diào)用中有兩個調(diào)用了TApplication的CreateForm方法,第一個CreateForm創(chuàng)建Form1,它是類TForm1(在Unit1單元定義的一個實例;第二個CreateForm創(chuàng)建Form2,它是類TForm2(在Unit2單元定義的一個實例。Unit1單元看起來像下面的樣子:unitUnit1;interfaceuses{下面這些單元是VCL的一部分}Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;{在Linux下,uses子句看起來像這樣:uses{下面這些單元是CLX的一部分}SysUtils,Types,Classes,QGraphics,QControls,QForms,QDialogs;}typeTForm1=class(TFormButton1:TButton;procedureButton1Click(Sender:TObject;end;varOverview-6-Form1:TForm1;implementationusesUnit2;{這是Form2定義的地方}{$R*.dfm}{這個指示字鏈接Unit1的窗體文件}procedureTForm1.Button1Click(Sender:TObject;beginForm2.ShowModal;end;end.Unit1單元創(chuàng)建了類TForm1(繼承自TForm和它的一個實例Form1。TForm1包含一個按鈕Button1,它是TButton的一個實例;還包含一個過程TForm1.Button1Click,在運行時,當用戶按下Button1時它將被執(zhí)行。TForm1.Button1Click隱藏Form1并顯示Form2(調(diào)用Form2.ShowModal,Form2在Unit2單元定義:unitUnit2;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;{在Linux下,uses子句看起來像這樣:usesSysUtils,Types,Classes,QGraphics,QControls,QForms,QDialogs;}typeTForm2=class(TFormLabel1:TLabel;CancelButton:TButton;procedureCancelButtonClick(Sender:TObject;procedureFormClose(Sender:TObject;varAction:TCloseAction;end;varForm2:TForm2;implementationusesUnit1;Overview{$R*.dfm}procedureTForm2.CancelButtonClick(Sender:TObject;beginForm2.Close;end;end.Unit2單元創(chuàng)建了類TForm2和它的一個實例Form2。TForm2包含一個按鈕(CancelButton,TButton的一個實例和一個標簽(Label1,TLabel的一個實例。Label1將顯示”Helloworld!”標題,但從源代碼中你不能看到這一點。標題是在Form2的窗體文件Unit2.dfm中定義的。Unit2單元定義了一個過程。在運行時,當用戶點擊CancelButton時,TForm2.CancelButtonClick將被調(diào)用,它關(guān)閉Form2。這個過程(以及Unit1單元的TForm1.Button1Click是作為事件句柄,因為它們響應(yīng)程序運行時發(fā)生的事件。事件句柄通過窗體文件(Windows下是.dfm,Linux下是.xfm賦給指定的事件(事件是一種特殊的屬性。當Greeting程序啟動時,顯示Form1而隱藏Form2(默認情況下,只有工程文件中最先創(chuàng)建的窗體是可見的,它稱為主窗口。當用戶點擊Form1上的按鈕時,Form1消失而被Form2取代,后者將顯示”Helloworld!”信息。當用戶關(guān)閉Form2(點擊CancelButton按鈕或窗口標題欄上的關(guān)閉按鈕后,Form1重新顯示。-7-ProgramsandunitsProgramsandunits(程序和單元Programsandunits:Overview(概述一個程序由稱為單元的源代碼模塊構(gòu)成。每個單元保存在一個單獨的文件中并分別進行編譯,編譯后的單元被鏈接到程序中。單元允許你?把一個大的程序分成多個模塊,它們可單獨進行編輯?創(chuàng)建可以在程序間共享的庫?不必提供源代碼就可以向其它開發(fā)者分發(fā)共享庫在傳統(tǒng)的Pascal編程中,所有源代碼,包括主程序都存儲在.pas文件中。Borland工具使用一個工程文件(.dpr來存儲‘主’程序,而大部分源代碼則保存在單元文件(.pas中。每個程序(或工程包含一個工程文件和一個或多個單元文件(嚴格說來,你不必在一個工程中明確引用任何單元,但所有程序自動引用System單元。要生成程序,編譯器需要每個單元的源代碼(.pas或編譯單元(.dcu等。Programstructureandsyntax(程序的結(jié)構(gòu)和語法Programstructrueandsyntax:Overview(概述一個程序包括?一個程序頭(programheading?一個uses子句(可選,和?一個包含聲明和命令語句的塊(block程序頭指定程序的名稱;uses子句列出了程序引用的單元;塊包含聲明和命令語句,當程序運行時,這些命令將被執(zhí)行。IDE期望在一個工程文件(.dpr中找到以上三種元素。下面的實例顯示了一個叫做Editor的程序:1programEditor;23uses4Forms,{在Linux下改成QForms}5REAboutin'REAbout.pas'{AboutBox},6REMainin'REMain.pas'{MainForm};78{$R*.res}910begin11Application.Title:='TextEditor';12Application.CreateForm(TMainForm,MainForm;13Application.Run;14end.-9-第1行包含程序頭;uses子句從第3行到第6行;第8行是編譯器指示字,它把工程的資源文件鏈接到程序中;第10行到第14行包含命令塊,程序運行時將執(zhí)行它們;最后,和所有源文件一樣,工程文件以一個句點(.結(jié)束。實際上,這是一個典型的工程文件。工程文件通常很短,因為絕大部分的程序邏輯位于單元文件中。工程文件是自動產(chǎn)生并自動維護的,很少需要手工編輯。Theprogramheading(程序頭程序頭指定程序的名稱。它以關(guān)鍵字program開始,后面跟一個有效標志符(指定程序名,并以分號結(jié)束。標志符必須和工程文件名相同,在上例中,因為程序叫Editor,工程文件應(yīng)該是EDITOR.dpr。在標準Pascal中,可在程序名的后面包含參數(shù):programCalc(input,output;BorlandObjectPascal編譯器忽略這些參數(shù)。Theprogramusesclause(程序的uses子句uses子句列出了共同構(gòu)成程序的單元,這些單元可能包含自己的uses子句。關(guān)于uses子句,請參考單元引用和uses子句。Theblock(塊塊包含一個簡單語句或結(jié)構(gòu)語句,程序運行時將執(zhí)行它。在大多數(shù)程序中,塊包含一個復合語句,它(復合語句由關(guān)鍵字begin和end括起來,其中的命令只是簡單調(diào)用Application對象的方法(每個工程都有一個Application變量,它是TApplication、TWebApplication或TServiceApplication的一個實例。塊也可以包含常量、類型、變量、過程和函數(shù)的聲明,它們必須位于(塊中命令語句的前面。Unitstructureandsyntax(單元的結(jié)構(gòu)和語法Unitstructureandsyntax:Overview(概述一個單元由類型(包括類、常量、變量以及例程(函數(shù)和過程構(gòu)成,每個單元由它自己的單元文件(.pas定義。一個單元以單元頭(unitheading開始,后面跟interface、implementation、initialization和finalization部分,后面兩個部分是可選的。一個單元的基本結(jié)構(gòu)看起來這樣:unitUnit1;interfaceuses{這里是單元列表}{這里是接口部分}implementationuses{這里是單元列表}{這里是實現(xiàn)部分}initialization{這里是初始化部分}finalization{這里是結(jié)束化部分}end.單元必須以end后跟一個句點結(jié)束(end.。Theunitheading(單元頭單元頭指定單元的名稱。它以關(guān)鍵字unit開始,后面跟一個有效標志符(指定單元名,并以分號結(jié)束。使用Borland工具創(chuàng)建的程序,標志符必須和單元文件名相同。所以,單元頭unitMainForm;必須出現(xiàn)在源文件MAINFORM.pas中,編譯后的單元文件將是MAINFORM.dcu。在一個工程中,單元名必須是獨一無二的,兩個同名的單元不能用在同一個程序中,即使它們的單元文件位于不同的路徑下。Theinterfacesection(接口部分單元的接口部分從關(guān)鍵字interface開始,直到實現(xiàn)部分的開頭。接口部分聲明常量、類型、變量、過程和函數(shù),所有這些對單元的客戶(也就是引用此單元的程序或其它單元是可用的。在接口部分聲明的實體被稱為‘公用’的,因為它們對客戶來說,就像自己聲明的一樣。在接口部分聲明的過程或函數(shù)只是一個例程頭,它們的代碼塊(block在實現(xiàn)部分定義。所以,在接口部分聲明過程和函數(shù)就像使用forward指示字,雖然這里它并沒有出現(xiàn)。在接口部分聲明一個類時,必須包含它的所有成員。接口部分可以包含自己的uses子句,它必須緊跟在關(guān)鍵字interface之后。關(guān)于uses子句,請參考單元引用和uses子句。Theimplementationsection(實現(xiàn)部分單元的實現(xiàn)部分從關(guān)鍵字implementation開始,直到初始化部分的開頭;或者,如果沒有初始化部分的話,就直到單元的結(jié)束。實現(xiàn)部分定義接口部分聲明的過程和函數(shù),在這里,你能以任何順序定義和調(diào)用它們。并且,你也可以省略過程和函數(shù)的參數(shù)列表,但如果包括它們的話,就必須和在接口部分的聲明完全相同。除了定義公用的過程和函數(shù),實現(xiàn)部分可以定義單元的私有內(nèi)容,包括常量、類型(包括類、變量、過程和函數(shù),它們對客戶(請參考接口部分是不可見的。實現(xiàn)部分可以包含自己的uses子句,它必須緊跟在關(guān)鍵字implementation之后。關(guān)于uses子句,請參考單元引用和uses子句。Theinitializationsection(初始化部分初始化部分是可選的。它從關(guān)鍵字initialization開始,直到結(jié)束化部分的開頭;或者,如果沒有結(jié)束化部分的話,就直到單元的結(jié)束。初始化部分所包含的命令,將在程序啟動時按它們出現(xiàn)的順序開始執(zhí)行。舉例來說,如果你定義了需要初始化的結(jié)構(gòu),你可以在初始化部分來完成。對于一個單元(稱為客戶引用的各個單元,它們的初始化將按客戶單元中uses子句引用它們的順序開始執(zhí)行。(也就是說,uses子句中列在前面的單元先初始化Thefinalizationsection(結(jié)束化部分結(jié)束化部分是可選的,并且只有當一個單元具有初始化部分時才能包含它。結(jié)束化部分從關(guān)鍵字finalization開始,直到單元的結(jié)束。結(jié)束化部分所包含的命令,將在主程序結(jié)束時被執(zhí)行。使用結(jié)束化部分來釋放在初始化部分分配的資源。結(jié)束化部分的執(zhí)行順序和初始化執(zhí)行的順序相反。例如,如果你的程序以A、B、C的順序進行初始化,結(jié)束化時的順序則是C、B、A。只要初始化部分的代碼開始執(zhí)行,在程序結(jié)束時相應(yīng)的結(jié)束化部分就一定要執(zhí)行。因此,結(jié)束化部分必須能夠處理沒有完全初始化的數(shù)據(jù),因為,如果發(fā)生運行時錯誤,初始化部分的代碼可能沒有完全執(zhí)行。Unitreferencesandtheusesclause(單元引用和uses子句Unitreferencesandtheusesclause(單元引用和uses子句uses子句列出了被程序、庫或單元引用的單元(關(guān)于庫,請參考庫和包。一個uses子句可以出現(xiàn)在:?程序或庫的工程文件?單元的接口部分,和?單元的實現(xiàn)部分大多數(shù)工程文件包含一個uses子句,大多數(shù)單元的接口部分也是如此,單元的實現(xiàn)部分也可以包含自己的uses子句。System單元自動被每個程序所引用,并且不能在uses子句中明確列出來(System單元實現(xiàn)文件I/O、字符串處理、浮點運算、動態(tài)內(nèi)存分配等例程。其它一些標準單元,比如SysUtils,必須包含在uses子句中。大多數(shù)情況下,當由工程創(chuàng)建和維護源文件時,所有必需的單元將被包含在uses子句中。在單元聲明以及uses子句中(尤其是在Linux下,單元名稱必須和文件名大小寫一致。在其它情況(比如使用限定符的標志符,單元名是大小寫無關(guān)的。要避免在單元引用中出現(xiàn)問題,要明確指出單元文件:usesMyUnitin"myunit.pas";如果像上面這樣在工程文件中明確引用一個單元,在其它源文件中就可以像下面那樣簡單地引用它,而不必考慮大小寫問題:usesMyunit;關(guān)于uses子句的內(nèi)容和使用位置,請參考多重和間接單元引用以及循環(huán)單元引用。Thesyntaxofausesclause(uses子句的語法一個uses子句由關(guān)鍵字uses、后面跟一個或多個由逗號隔開的單元名,最后是一個分號構(gòu)成。舉例如下:usesForms,Main;usesWindows,Messages,SysUtils,Strings,Classes,Unit2,MyUnit;usesSysUtils,Types,Classes,QGraphics,QControls,QForms,QDialogs;在程序或庫(工程的uses子句中,任何單元名后面可以跟關(guān)鍵字in和一個(單元源文件名:源文件名用單引號括起來,可包括或不包括路徑,路徑可以是絕對路徑,也可以是相對路徑。舉例如下:usesWindows,Messages,SysUtils,Stringsin'C:\Classes\Strings.pas',Classes;usesQForms,Main,Extrain'../extra/extra.pas';當要指定單元源文件時,在單元的名稱后面包含in…。因為IDE期望單元名和它所在的源文件名相同,所以通常沒有理由這樣做。只有當單元源文件的位置不明確時,你才需要使用in關(guān)鍵字。比如,當?引用的單元文件和工程文件在不同的目錄,并且單元所在的目錄沒有包含在編譯器搜索路徑、也不在庫搜索路徑中?編譯器的不同搜索路徑中有同名的單元?你在命令行編譯一個控制臺程序,并且單元名和它的文件名不同編譯器也根據(jù)in…來判斷哪些單元是工程的一部分。在工程文件(.dpr的uses子句中,只有后面包含in和一個文件名的單元才被認為是工程的一部分,而其它單元只是被工程引用而不屬于這個工程。這種區(qū)別對編譯程序沒有影響,但它影響IDE工具,比如ProjectManager和ProjectBrowser。在單元的uses子句中,你不能用in告訴編譯器到哪里尋找單元文件。每個單元文件必須位于編譯器搜索路徑、或庫搜索路徑中,或者和引用它的單元文件位于同一路徑;而且,單元名必須和它們的單元源文件同名。Multipleandindirectunitreferences(多重和間接單元引用在uses子句中,單元出現(xiàn)的順序決定了它們的初始化順序(請參考初始化部分,也影響編譯器對標志符的定位。如果兩個單元聲明了具有相同名稱的變量、常量、類型、過程和函數(shù),編譯器使用uses子句中列在后面的那個單元所聲明的標志符。若要訪問其它單元的標志符,你必須添加限定符:UnitName.Identifier。在uses子句中,你只需列出被程序或單元直接引用的單元。也就是說,如果單元A使用單元B中聲明的常量、變量、類型、過程或函數(shù),則A必須明確引用單元B;若單元B引用單元C的標志符,則單元A是間接引用單元C。這種情況下,在單元A的uses子句中不必包含C,但編譯器為了處理A,它還是必須能找到B和C。下面的實例演示了間接引用:programProg;usesUnit2;consta=b;...unitUnit2;interfaceusesUnit1;constb=c;...unitUnit1;interfaceconstc=1;...在這個例子中,Prog直接引用單元Unit2,Unit2又直接引用單元Unit1,因此,Prog間接引用Unit1。因為Unit1沒出現(xiàn)在Prog的uses子句中,在Unit1單元聲明的標志符對Prog是不可見的。要編譯一個客戶模塊,編譯器需要定位客戶模塊所引用的所有單元,不管是直接的還是間接的。但是,除非這些單元的源文件發(fā)生了改變,否則,編譯器只需要它們的.dcu文件(Windows或.dcu/.dpu文件(Linux,而不是它們的源文件(.pas。當一個單元的接口部分被修改時,引用它的其它單元必須被重新編譯;但若只修改了單元的實現(xiàn)部分或其它部分,引用它的單元沒必要重新編譯。編譯器自動跟蹤依賴關(guān)系,只有在需要時才重新編譯單元。Circularunitreferences(循環(huán)單元引用當單元間直接或間接地互相依賴(或引用時,我們稱這些單元為相互依賴。相互依賴是被允許的,只要在接口部分的uses子句中不出現(xiàn)循環(huán)引用路徑。換句話說,從一個單元的接口部分開始,沿著它所依賴的其它單元的接口部分的依賴路徑,一定不能重新返回到這個單元。解決相互依賴問題的一種模式就是,每個循環(huán)引用必須至少有一個uses子句出現(xiàn)在實現(xiàn)部分。Programsandunits在兩個單元相互依賴這種最簡單的情況下,你不能在它們的接口部分的uses子句中互相列出對方。所以,下面的例子將產(chǎn)生編譯錯誤:unitUnit1;interfaceusesUnit2;...unitUnit2;interfaceusesUnit1;...但是,若把其中的一個引用移到實現(xiàn)部分,這兩個單元之間的相互引用將是合法的:unitUnit1;interfaceusesUnit2;...unitUnit2;interface...implementationusesUnit1;...為了減少出現(xiàn)循環(huán)單元引用的機會,要盡可能在實現(xiàn)部分的uses子句中引用單元。只有當來自另一個單元的標志符必須在接口部分使用時,才需要在接口部分的uses子句中引用它。-15-SyntacticelementsSyntacticelements(語法元素Syntacticelements:Overview(概述ObjectPascal使用ASCII字符集,包括A到Z、a到z、0到9、以及其它標準字符,字母是大小寫無關(guān)的??崭?#32和控制符(#0到#31,其中#13叫回車符或行的結(jié)束符被稱為空白符(blank。基本語法元素被稱為token(如何翻譯?,它們組合起來構(gòu)成表達式、聲明和命令語句。命令語句描述算法行為,它是可執(zhí)行的;表達式是一個語法單元,它出現(xiàn)在命令語句中并表示一個值;聲明定義一個標志符(比如函數(shù)或變量的名稱,可以用在表達式或命令語句中,并在適當?shù)牡胤綖闃酥痉峙鋬?nèi)存。Fundamentalsyntacticelements(基本語法元素Fundamentalsyntacticelements:Overview(概述在最簡單層次上,一個程序是一系列由分隔符隔開的token構(gòu)成的。在一個程序中,token是有意義的最小文字單元,分隔符可以是空白符,也可以是注釋。嚴格說來,并不是任何時候在兩個token之間都要有一個分隔符。如下面的代碼:Size:=20;Price:=10;是完全合法的。但為遵循約定和代碼的可讀性起見,我們應(yīng)當如下書寫代碼:Size:=20;Price:=10;Token被分為特殊符號、標志符、關(guān)鍵字(保留字、指示字、數(shù)字、標簽和字符串(常量字符串。只有當token是常量字符串時,它才可以包含分隔符。緊鄰的標志符、保留字、數(shù)字和標簽,它們之間必須有一個或多個分隔符。Specialsymbols(特殊符號特殊符號是非文字和數(shù)字字符,或這類字符的組合,它們有固定的意義。以下是單字符的特殊符號:#$&'(*+,-./:;<=>@[]^{}以下的組合字符也是特殊符號:(*(.*...//:=<=>=<>上面,‘[’相當于‘(.’,‘]’相當于‘.’;‘(*’和‘*’分別相當于‘{’和‘}’(表示注釋。請注意,!(驚嘆號、”(雙引號、%(百分號、?(問號、\(反斜杠、_(下劃線、|(通道和~(破折號不是特殊符號。-17-Syntacticelements-18-Identifiers(標志符標志符用來表示常量、變量、字段、類型、屬性、過程、函數(shù)、程序、單元、庫以及包。一個標志符的長度是任意的,但只有前面的255個字符是有意義的。標志符必須以字母或下劃線(_開始,后面可以是字母、數(shù)字和下劃線,但不能包含空格。關(guān)鍵字不能用作標志符。因為ObjectPascal是不區(qū)分大小寫的,所以,象CalculateValue標志符,它可以是下面的任何形式:CalculateValuecalculateValuecalculatevalueCALCULATEVALUE在Linux下,只有作為單元名的標志符要注意大小寫。因為單元名和文件名相同,大小寫不一致有時會影響編譯。(Linux下的文件名是區(qū)分大小寫的Qualifiedidentifiers(限定符當一個標志符(名稱相同在多個地方聲明時,使用它時可能要對標志符進行限定。限定標志符的語法為:identifier1.identifier2這里,identifier1限定identifier2。比如,若兩個單元分別聲明了一個叫做CurrentValue的變量,你可以通過如下方式指定要使用Unit2單元的CurrentValue:Unit2.CurrentValue限定符可以重復,比如Form1.Button1.Click它調(diào)用Form1中Button1的Click方法。如果你沒有使用限定符,在塊和范圍一節(jié)中所講述的范圍規(guī)則將決定它作如何解釋。Reservedwords(關(guān)鍵字,保留字下面的關(guān)鍵字不能被重新定義或用作標志符:andarrayasasmbegincaseclassconstconstructordestructordispinterfacedivdodowntoelseendexceptexportsfilefinalizationfinallyforfunctiongotoifimplementationininheritedinitializationinlineinterfaceislabellibrarymodnilnotobjectoforSyntacticelements-19-outpackedprocedureprogrampropertyraiserecordrepeatresourcestringsetshlshrstringthenthreadvartotrytypeunituntilusesvarwhileWithxor除上面的關(guān)鍵字外,private、protected、public、published和automated在對象類型的聲明中用作關(guān)鍵字,但其它情況下則作為指示字。關(guān)鍵字at和on也具有特殊的含義。(以下內(nèi)容摘自《Delphi技術(shù)手冊》關(guān)鍵字是由Delphi編譯器決定意義的保留標志符,不能把關(guān)鍵字用作變量、方法、或類型的名字等。Directives(指示字指示字只在代碼中的特定位置才有特殊意義。在ObjectPascal中,指示字具有特殊的意義,但和關(guān)鍵字不同,它只用于(用戶自定義標志符不能出現(xiàn)的上下文環(huán)境中。因此,你可以定義一個和指示字完全相同的標志符,雖然這是不明智的。(以下內(nèi)容摘自《Delphi技術(shù)手冊》指示字是指在一個特定的上下文環(huán)境中,對編譯器具有特殊意義的一個標志符。在上下文環(huán)境之外,你可以自由地把指示字的名字作為普通的標志符來使用。但是,編輯器并不總是對的,因為一些指示字的語法比較復雜,簡單的編輯器不能正確處理。Numerals(數(shù)字整數(shù)和實數(shù)常量可以用十進制的阿拉伯數(shù)字序列來表示,數(shù)字之間不能有逗號或空格,但它可以有一個前綴“+”或“-”來表示正負。它的數(shù)值默認為正(所以,67258和+67258是相等的,并且必須位于預先定義的實數(shù)或整數(shù)類型的最大值之內(nèi)。帶有小數(shù)點或指數(shù)符號的數(shù)字表示實數(shù),而其它數(shù)字表示整數(shù)。當E或e出現(xiàn)在實數(shù)中時,它表示10的幾次方。比如,7E-2表示7*10^-2,12.25e+6和12.25e6都表示12.25*10^6。$前綴表示一個16進制數(shù)字,比如$8F。沒有“-”號運算符的數(shù)字被認為是正數(shù)。在賦值時,若它的值在接收者的數(shù)據(jù)類型范圍之外,將產(chǎn)生一個錯誤,除非它是整數(shù)類型(32位整數(shù),此時將引發(fā)一個警告,并且,valuesexceedingthepositiverangeforIntegeraretakentobenegativenumbersinamannerconsistentwith2'scomplementintegerrepresentation.關(guān)于實數(shù)和整數(shù)類型的更多信息,請參考數(shù)據(jù)類型、變量和常量。關(guān)于數(shù)字常量的數(shù)據(jù)類型,請參考真常量。Labels(標簽標簽是一個不超過4位的阿拉伯數(shù)字序列,也就是從0到9999,打頭的0沒有意義。標志符也可行使標簽的功能。標簽用于goto語句中。關(guān)于goto語句的更多信息,請參考Goto語句。Characterstrings(常量字符串常量字符串(characterstring也稱為文字串(stringliteral或串常量(stringconst,它由引用串(由一對單引號括起來的文字串、控制串(控制符構(gòu)成的串或這兩種串的組合而構(gòu)成。只有引用串可以包含分隔符。引用串由擴展ASCII字符集的字符所組成,最多可達255個。它要書寫在一行中,并且用一對單引號括起來。若單引號中沒有內(nèi)容('',它被稱為空串(nullstring。在一個引用串中,兩個連續(xù)的單引號(''表示一個字符,也就是單引號本身('。看以下的例子:'BORLAND'{BORLAND}'You''llsee'{You'llsee}''''{}'''{空串}一個空格}''{控制串由一個或多個控制字符(控制符所組成,每個控制符包含一個#,后跟一個無符號整數(shù)(10進制或16進制,整數(shù)的范圍從0到255,表示相應(yīng)的ASCII字符。下面的控制串#89#111#117就相當于引用串'You'你可以組合引用串和控制串來構(gòu)成一個更大的串。例如,你能使用'Line1'#13#10'Line2'它在字符串”Line1”和”Line2”之間放一個回車(#13換行(#10符。但你不能使用這種方式組合兩個引用串,因為兩個連續(xù)的單引號被解釋為一個單引號。要組合多個引用串,可以使用“+”運算符,或簡單地把它們合并成一個引用串。常量字符串的長度是它所包含的字符個數(shù)。一個任意長度的字符串,與任何字符串(string類型以及PChar類型是兼容的;一個長度為1的字符串,與任何字符(character類型兼容;并且,當啟用擴展語法時({$X+},一個長度為n的非空字符串,和下標從0開始、包含n個字符的數(shù)組以及壓縮(packed數(shù)組也是兼容的。關(guān)于字符串類型的更多信息,請參考字符串類型。Commentsandcompilerdirectives(注釋和編譯器指示字注釋將被編譯器忽略,除非它們用作分隔符(隔開相鄰的token或編譯器指示字。有以下幾種方式創(chuàng)建注釋:{由一對花括號所包含的文字構(gòu)成注釋}(*由左圓括號加一個星號和一個星號加右圓括號之間的文字也構(gòu)成注釋*//由兩個斜杠開始直到這一行的結(jié)束,這里的文字是注釋-20-若$符緊跟在{或(*之后,則這里的注釋是編譯器指示字。例如{$WARNINGSOFF}它告訴編譯器不要產(chǎn)生警告信息。Expressions(表達式Aboutexpressions(關(guān)于表達式表達式是一個有返回值的語句構(gòu)造。比如,X{變量}@X{變量地址}15{整數(shù)常量}變量}InterestRate{函數(shù)調(diào)用}Calc(X,Y{X*Y{X和Y的乘積}Z/(1-Z{Z和(1-Z的商}X=1.5{布爾}布爾}CRange1{in布爾的否}Done{not集合}['a','b','c']{類型轉(zhuǎn)換}Char(48{最簡單的表達式是變量和常量(在數(shù)據(jù)類型、變量和常量中講述。更復雜的表達式由簡單表達式使用運算符、函數(shù)調(diào)用、集合構(gòu)造器、索引和類型轉(zhuǎn)換構(gòu)成。Operators(運算符Aboutoperators(關(guān)于運算符運算符就像ObjectPascal的內(nèi)置函數(shù),它是語言的一部分。例如,表達式(X+Y由變量X和Y(X、Y稱為運算數(shù)或操作數(shù),operand,通過“+”運算符計算而得。當X和Y表示整數(shù)或?qū)崝?shù)時,(X+Y返回它們的和。運算符包括:@not^*/divmodandshlshras+-orxor=><<><=>=in和is。@、not和^是一元運算符(使用一個運算數(shù),+和-或者是一元的,或者是二元的,除此之外,其它所有運算符為二元運算符(使用兩個運算數(shù)。除了^運算符,它在運算數(shù)的后面(比如,P^,其它一元運算符總是位于運算數(shù)的前面(比如,-B。二元運算符位于運算數(shù)的中間(比如,A=7。一些運算符的行為因為傳給它們的數(shù)據(jù)類型不同而不同。比如,not運算符用于整數(shù)時,是對它的位進行求反運算,而對布爾類型進行邏輯非運算。這類運算符會在后面的多個分類中出現(xiàn)。除了^,is和in,其它運算可應(yīng)用在Variant類型上。接下來的章節(jié)假設(shè)你對ObjectPascal的數(shù)據(jù)類型有一定了解。-21-關(guān)于表達式中運算符的優(yōu)先級,請參考運算符優(yōu)先級一節(jié)。Arithmaticoperators(算術(shù)運算符算術(shù)運算符作用于實數(shù)或整數(shù),包括+、-、*、/、div和mod。運算符運算運算數(shù)類型返回類型例子+加整數(shù),實數(shù)整數(shù),實數(shù)X+Y-減整數(shù),實數(shù)整數(shù),實數(shù)Result-1*乘整數(shù),實數(shù)整數(shù),實數(shù)P*InterestRate/實數(shù)除整數(shù),實數(shù)實數(shù)X/2div整數(shù)除整數(shù)整數(shù)TotaldivUnitSizemod余數(shù)整數(shù)整數(shù)Ymod6運算符運算運算數(shù)類型返回類型例子+(一元正整數(shù),實數(shù)整數(shù),實數(shù)+7-(一元負整數(shù),實數(shù)整數(shù),實數(shù)-X以下規(guī)則適用于算術(shù)運算符:?不管x和y的類型是什么,x/y的結(jié)果總是擴展類型(extended;對其它運算符,只要有一個運算數(shù)是實數(shù)類型,它的結(jié)果就是擴展類型;另外,只要有一個運算數(shù)是Int64類型,它的結(jié)果就是Int64類型;否則,結(jié)果就是整數(shù)類型。如果一個運算數(shù)是整數(shù)的子界類型,它就像整數(shù)類型一樣被對待。?xdivy的值取整數(shù),也就是取得x/y的值,然后以0的方向取得最近的整數(shù)。?mod運算返回對運算數(shù)進行整數(shù)除后得到的余數(shù)。換句話說,就是xmody=x-(xdivy*y。?若y為0的話,表達式x/y、xdivy和xmody將發(fā)生運行時錯誤。Booleanoperators(布爾運算符布爾運算符not、and、or和xor作用于任何布爾類型的運算數(shù),并返回一個布爾類型的值。運算符運算運算數(shù)類型結(jié)果類型例子not否布爾布爾not(CinMySetand與布爾布爾Doneand(Total>0or或布爾布爾AorBxor異或布爾布爾AxorB這些運算遵循標準的布爾邏輯規(guī)則。比如,像xandy形式的表達式,當且僅當x和y都為True時,它的結(jié)果才為True。Completeversusshort-circuitBooleanevaluation(完全計算和部分計算編譯器對and和or運算符支持兩種計算方式:完全計算(completeevaluation和部分計算(short-circuitevaluation或partialevaluation。完全計算會計算每個連接項(conjunct和disjunct的值,即使整個表達式的結(jié)果已經(jīng)確定了。部分計算從左到右計算每個連接項,一旦整個表達式的結(jié)果確定下來,計算就停止了。比如,對于表達式A-22-andB,在進行部分計算時,若A是False,則整個表達式的值也是False,此時編譯器不再計算B的值。通常,部分計算更可取,因為它的執(zhí)行時間最少,并且在大多數(shù)情況下使用最少的代碼。當運算數(shù)是一個進行邊界操作(sideeffects的函數(shù)并影響程序的執(zhí)行時,完全計算有時是比較方便的。部分計算也能避免一些在其它情況下會產(chǎn)生的非法運行時錯誤。比如,下面的代碼遍歷字符串S,直到發(fā)現(xiàn)第一個逗號while(I<=Length(Sand(S[I]<>','dobegin...Inc(I;end;在S不包含逗號的情況下,最后一次循環(huán)使I的值大于S的長度,當測試下一次循環(huán)時,若進行完全計算,讀取S[I]將產(chǎn)生運行時錯誤;相反,若進行部分計算,while條件的第二部分(S[I]<>','不會進行,因為前面的結(jié)果已經(jīng)不成立了。使用$B編譯器指示字控制計算方式,默認狀態(tài)是{$B-},它采用部分計算。要在局部進行完全計算,在代碼中使用{$B+}指示字。你也可以在CompilerOptions對話框中選擇CompleteBooleanEvaluation選項,此時在整個項目范圍使用完全計算。注意:若任何一個運算數(shù)是variant類型,編譯器總是進行完全計算(即使在{$B-}狀態(tài)下。Logical(bitwiseoperators(位邏輯運算符下面的位運算符對整數(shù)(運算數(shù)的位進行處理。比如,若X存儲的是001101(二進制形式,Y是100001,語句Z:=XorY;把值101101賦給Z。運算符運算運算數(shù)類型返回類型例子not位反整數(shù)整數(shù)notXand位與整數(shù)整數(shù)XandYor位或整數(shù)整數(shù)XorYxor位異或整數(shù)整數(shù)XxorYshl位左移整數(shù)整數(shù)Xshl2shr位右移整數(shù)整數(shù)YshrI下面的規(guī)則適用于位運算符?位反(not運算的返回類型和運算數(shù)相同;?若and、or或xor的運算數(shù)都是整數(shù)類型,則它的返回類型是包含運算數(shù)所有可能的值、且范圍最小的預定義(內(nèi)置整數(shù)類型;?運算xshly和xshry把x的值向左或向右移y個位,也就等同于x乘或除以2^y(2的y次方,返回類型和x相同。比如,若N存儲的是01101(10進制的13,那么Nshl1返回11010(10進制26。注意,y的值被解釋為對x所屬類型大小(位數(shù)進行模運算,比如,若x是一個integer,xshl40被解釋為xshl8,因為integer的大小是32位(4字節(jié),40mod32等于8。-23-Stringoperators(字符串運算符關(guān)系運算符=、<>、<、>、<=和>=都能對字符串進行操作(參考關(guān)系運算符。+運算符連接兩個字符串。運算符運算運算數(shù)類型返回類型例子+連接字符串、字符以及packedstring字符串S+'.'下面的規(guī)則適用于字符串連接?+運算符的運算數(shù)可以是字符串、packedstring(packedarraysoftypeChar或字符。但是,若其中一個運算數(shù)是寬字符(WideChar類型,其它運算數(shù)必須是長字符串。?+運算符的返回結(jié)果和任何字符串類型是兼容的。但是,若運算數(shù)都是短字符串或字符,并且它們的組合長度大于255,則返回結(jié)果取前面的255個字符。Pointeroperators(指針運算符關(guān)系運算符<、>、<=和>=能對PChar類型進行操作(參考關(guān)系運算符。下面的運算符也能使用指針類型作為運算數(shù)。關(guān)于指針的更多信息,請參考指針和指針類型。運算符運算運算數(shù)類型返回類型例子+指針加字符指針,整數(shù)字符指針P+I-指針減字符指針,整數(shù)字符指針,整數(shù)P-Qdereference指針指針的基礎(chǔ)類型P^^pointer=等于指針布爾P=Q<>不等于指針布爾P<>Q^運算符dereference一個指針(取得指針所指的內(nèi)容,如何翻譯呢?,除了通用指針Pointer以外,它的運算數(shù)可以是任何指針類型,對于Pointer類型,在dereference之前必須進行類型轉(zhuǎn)換。只有P和Q指向相同的地址,P=Q才是真(True,否則P<>Q為真。你能使用+和–運算符來增加和減少一個字符指針的偏移量,也能使用–運算符來比較兩個字符指針偏移量的差。它遵循以下規(guī)則?若I是一個整數(shù),P是一個字符指針,那么P+I是把P的地址加上I,也就是一個指向P后面第I個字符處的指針(表達式I+P等同于P+I;P–I是把P的地址減去I,也就是一個指向P前面第I個字符處的指針。?若P和Q都是字符指針,那么P–Q計算P的地址(高地址和Q地址(低地址之差,也就是返回一個表示P和Q之間字符數(shù)目的整數(shù)。P+Q沒有意義。Setoperators(集合運算符下面的運算符以集合作為運算數(shù):運算符運算運算數(shù)類型返回類型例子+并集集合集合Set1+Set2–差集集合集合S-T-24-Syntacticelements*交集集合集合S*T<=小于等于(子集集合布爾Q<=MySet>=大于等于(超集集合布爾S1>=S2=等于集合布爾S2=MySet<>不等于集合布爾MySet<>S1in成員關(guān)系序數(shù),集合布爾AinSet1以下規(guī)則適用于+、–和*運算符:?當且僅當序數(shù)(集合基礎(chǔ)類型中的一個值O屬于集合X或集合Y(或同時屬于X和Y時,O屬于X+Y;當且僅當O屬于X但不屬于Y時,O屬于X–Y;當且僅當O同時屬于X和Y時,O屬于X*Y。?+、–和*的運算結(jié)果屬于集合類型setofA..B,這里A是結(jié)果中的最小序數(shù),B是結(jié)果中的最大序數(shù)。以下規(guī)則適用于<=、>=、=、<>和in運算符:?只有當X(集合中的每個成員也是Y(集合中的成員時,X<=Y才為真;Z>=W等同于W<=Z;只有當U(集合和V(集合正好擁有相同的成員時,U=V才為真,否則U<>V為真;?對于序數(shù)O和集合S,只有當O是S的一個成員時,OinS才為真。Relationaloperators(關(guān)系運算符關(guān)系運算符用來比較兩個運算數(shù)。=、<>、<=和>=也用作集合運算符(參考集合運算符,=和<>也用作指針運算符(參考指針運算符。運算符運算運算數(shù)類型返回類型例子=等于simple,class,classreference,布爾I=Maxinterface,string,packedstring布爾X<>Y<>不等于simple,class,classreference,interface,string,packedstring<小于simple,string,packedstring,PChar布爾X<Y>大于simple,string,packedstring,PChar布爾Len>0<=小于等于simple,string,packedstring,PChar布爾Cnt<=I>=大于等于simple,string,packedstring,PChar布爾I>=1對大多數(shù)簡單類型,比較運算非常容易理解。比如,只有I和J有相同的值,I=J才是真,否則I<>J為真。下面的規(guī)則適用于關(guān)系運算符:?除了實數(shù)和整數(shù)能一起比較外,兩個運算數(shù)必須是兼容的類型;?對字符串進行比較,是依據(jù)它的每個字符在擴展ASCII字符集中的順序,字符類型被當作長度為1的字符串;?兩個packedstring要進行比較,它們必須具有相同數(shù)目的元素;一個具有n個元素的packedstring與一個字符串比較時,它被看作長度為n的字符串;?只有當兩個PChar指針都指向同一個字符數(shù)組的范圍內(nèi)時,<、>、<=和>=運算符才能作用于它們;?運算符=和<>能以類或類引用類型作為運算數(shù)。當用于類類型時,=和<>的計算規(guī)則與Syntacticelements指針一樣,只有當C和D指向同一個實例對象時,C=D為真,否則C<>D為真;當用于類引用時,只有當C和D表示同一個類時,C=D為真,否則C<>D為真。關(guān)于類的更多信息,請參考類和對象。Classoperators(類運算符as和is運算符使用類和對象(實例作為運算數(shù),as也用于接口類型。關(guān)于更多信息,請參考類和對象以及對象接口。關(guān)系運算符=和<>也用于類類型,請參考關(guān)系運算符。The@operator(@運算符@運算符返回一個變量、函數(shù)、過程或方法的地址,也就是說,@運算符構(gòu)建一個指向運算數(shù)的指針。關(guān)于指針的更多信息,請參考指針和指針類型。下面的規(guī)則適用于@運算符:?若X是一個變量,@X返回X的地址(當X是一個過程類型的變量時有特殊的規(guī)則,請參考語句和表達式中的過程類型。若默認的編譯器指示字{$T–}在起作用,則@X的類型是Pointer(通用指針;在{$T+}狀態(tài)下時,@X的類型是^T,這里T是X的類型;?若F是一個例程(一個函數(shù)或過程,@F返回F的入口點,@F的類型總是Pointer;?當@作用于類的方法時,必須使用類名來限定方法名。比如@TMyClass.DoSomething它指向TMyClass的DoSomething方法。關(guān)于類和方法的更多信息,請參考類和對象。Operatorprecedencerules(運算符優(yōu)先級在復雜表達式中,運算符優(yōu)先級規(guī)則決定了運算執(zhí)行的順序。運算符優(yōu)先級@,not第一級(最高*,/,div,mod,and,shl,shr,as第二級+,–,or,xor第三級=,<>,<,>,<=,>=,in,is第四級(最低具有較高優(yōu)先級的運算符先進行運算,具有相同優(yōu)先級的運算符從左邊開始。因此表達式X+Y*Z先執(zhí)行Y*Z,然后加上X作為結(jié)果,*先被執(zhí)行,因為它比+有較高優(yōu)先級,但X-Y+Z先從X減去Y,然后加上Z作為結(jié)果,–和+具有相同優(yōu)先級,因此左邊的運算先執(zhí)行。你能使用圓括號來覆蓋優(yōu)先級規(guī)則。有括號的表達式先被運算,然后把它作為單個運算數(shù)。比如(X+Y*Z它把X和Y的和乘以Z。Syntacticelements括號有時用于一些似是而非的場合。比如,考慮表達式X=YorX=Z這里的明顯用意是(X=Yor(X=Z但若沒有括號,編譯器遵循優(yōu)先級規(guī)則把它讀作(X=(YorX=Z此時,若Z不是布爾類型,它將導致編譯錯誤。括號通常使代碼更容易讀寫,即使有時候嚴格說來它們是多余的。這樣,上面第一個例子可寫作X+(Y*Z這里,括號(對編譯器不是必須的,但對程序的編寫者和閱讀者來說,它節(jié)省了判斷運算符優(yōu)先級的時間。Functioncalls(函數(shù)調(diào)用因為函數(shù)返回一個值,所以函數(shù)調(diào)用是表達式。比如,若你定義了一個叫做Calc的函數(shù),它接收兩個整數(shù)參數(shù)并返回一個整數(shù),那么函數(shù)調(diào)用Calc(24,47是一個整數(shù)表達式。若I和J是整數(shù)變量,那么I+Calc(J,8也是整數(shù)變量。函數(shù)調(diào)用的例子包括Sum(A,63Maximum(147,JSin(X+YEof(FVolume(Radius,HeightGetValueTSomeObject.SomeMethod(I,J;關(guān)于函數(shù)的更多信息,請參考Proceduresandfunctions。Setconstructors(集合構(gòu)造器集合構(gòu)造器表示一個集合類型的值。比如,[5,6,7,8]它表示一個成員是5、6、7和8的集合。集合構(gòu)造器[5..8]它也能表示同一個集合。集合構(gòu)造器的語法是[item1,...,itemn]這里,每個item或者是表示集合基礎(chǔ)類型中的一個有序值(表達式,或者是由兩個點(..連接起來的一對這樣的值(表達式。若一個條目(item是x..y的形式,它是從x到y(tǒng)范圍間(包括x和y所有的有序值的簡寫。但若x比y大,則x..y不表示任何內(nèi)容,[x..y]是空集。集合構(gòu)造器[]表示空集,而[x]表示一個集合,它僅有的一個成員是x值。集合構(gòu)造器的例子:Syntacticelements[red,green,MyColor][1,5,10..Kmod12,23]['A'..'Z','a'..'z',Chr(Digit+48]關(guān)于集合的更多信息,請參考Sets。Indexes(索引字符串、數(shù)組、數(shù)組屬性以及指向字符串或數(shù)組的指針能被索引。比如,若FileName是一個字符串變量,表達式FileName[3]返回FileName字符串中的第3個字符,而FileName[I+1]返回被I索引的后一個字符。關(guān)于字符串的信息,請參考Stringtypes;關(guān)于數(shù)組和數(shù)組屬性的信息,參考Arrays和Arrayproperties。Typecasts(類型轉(zhuǎn)換Typecasts:Overview(概述有時,把一個表達式當作一種不同的類型是很有用的。實際上,強制類型轉(zhuǎn)換使你臨時改變一個表達式的類型。比如,Integer('A'把一個字符A轉(zhuǎn)換為一個整數(shù)。強制類型轉(zhuǎn)換的語法是typeIdentifier(expression若表達式是一個變量,結(jié)果被稱為variabletypecast(變量轉(zhuǎn)換;否則,結(jié)果是一個valuetypecast(值轉(zhuǎn)換。雖然它們的語法相同,但它們有不同的轉(zhuǎn)換規(guī)則。Valuetypecasts(值轉(zhuǎn)換在值轉(zhuǎn)換中,類型標志符和轉(zhuǎn)換的表達式必須都是有序類型或指針類型。值轉(zhuǎn)換的例子包括Integer('A'Char(48Boolean(0Color(2Longint(@Buffer得到的結(jié)果是轉(zhuǎn)換括號內(nèi)的表達式。若指定的類型和表達式的的類型大小不同,結(jié)果會截斷或擴展。表達式的符號總是被保留(這是什么意思?。語句I:=Integer('A';把Integer('A'的值(也就是65賦給變量I。一個值轉(zhuǎn)換的后面不能有限定符(什么意思?,并且不能出現(xiàn)在賦值語句的左邊。Variabletypecasts(變量轉(zhuǎn)換倘若它們的大小(占用的內(nèi)存相同,并且你沒有混用整數(shù)和實數(shù),則可以把任何變量轉(zhuǎn)換為任何類型(要轉(zhuǎn)換數(shù)字類型,依靠標準函數(shù),比如Int和Trunc。變量轉(zhuǎn)換的例子包括Char(ISyntacticelementsBoolean(CountTSomeDefinedType(MyVariable變量轉(zhuǎn)換可出現(xiàn)在賦值語句的任何一邊。這樣varMyChar:char;...Shortint(MyChar:=122;把字符z(ASCII1值是122賦給MyChar。你可以把變量轉(zhuǎn)換為過程類型。比如,給出下面的聲明typeFunc=function(X:Integer:Integer;varF:Func;P:Pointer;N:Integer;你可以應(yīng)用下面的賦值語句F:=Func(P;{AssignproceduralvalueinPtoF}Func(P:=F;{AssignproceduralvalueinFtoP}@F:=P;{AssignpointervalueinPtoF}P:=@F;{AssignpointervalueinFtoP}N:=F(N;{CallfunctionviaF}N:=Func(P(N;{CallfunctionviaP}變量轉(zhuǎn)換也可以跟限定符,像下面的例子所示typeTByteRec=recordLo,Hi:Byte;end;TWordRec=recordLow,High:Word;end;PByte=^Byte;varB:Byte;W:Word;L:Longint;P:Pointer;beginW:=$1234;B:=TByteRec(W.Lo;TByteRec(W.Hi:=0;L:=$01234567;W:=TWordRec(L.Low;B:=TByteRec(TWordRec(L.Low.Hi;B:=PByte(L^;end;在這個例子中,TbyteRec被用來訪問一個字(word的低字節(jié)和高字節(jié),TwordRec被用來訪問一個長整數(shù)的低字和高字。你也可以使用內(nèi)置函數(shù)Lo和Hi達到同樣的目的,但變量轉(zhuǎn)換的優(yōu)點就是它可以用在賦值語句的左邊。要了解指針轉(zhuǎn)換,請參考Pointersandpointertypes;要了解類和接口類型的轉(zhuǎn)換,請參考TheasoperatorandInterfacetypecasts。DeclarationsandStatements(聲明和語句AboutDeclarationsandStatements(關(guān)于聲明和語句除了uses子句(和劃分單元不同部分的關(guān)鍵字,像implementation,一個程序完全由聲明和語句構(gòu)成,聲明和語句被組織成塊(block。Declarations(聲明變量、常量、類型、字段、屬性、過程、函數(shù)、程序、單元、庫和包的名稱叫做標志符。(數(shù)字常量,像26057,不是標志符標志符在使用之前必須聲明,唯一的例外就是一些內(nèi)置的類型、例程和常量,還有函數(shù)塊中的變量Result,以及實現(xiàn)方法時的Self變量,編譯器能自動識別它們。一個聲明定義一個標志符,并且在合適的地方為它分配內(nèi)存。比如,varSize:Extended;聲明一個叫做Size的變量,它存儲一個Extended(實數(shù)值,而functionDoThis(X,Y:string:Integer;聲明一個叫做DoThis的函數(shù),它接收兩個字符串作為參數(shù),并返回一個整數(shù)。每個聲明以一個分號結(jié)束,當你同時聲明多個變量、常量、類型或標簽時,你只需書寫合適的關(guān)鍵字一次就可以了。varSize:Extended;Quantity:Integer;Description:string;聲明的語法以及聲明的位置取決于要定義的標志符的種類。通常,聲明只能出現(xiàn)在塊(block的開始處,以及單元的接口或?qū)崿F(xiàn)部分的開始處(在uses子句之后。聲明變量、常量、類型、函數(shù)等的特殊約定在文檔中的相關(guān)主題中解釋。Hint指示字platform、deprecated和library能附加在任何聲明之后。在聲明過程或函數(shù)的情況下,應(yīng)使用分號把hint指示字和聲明的其它部分分開。比如:procedureSomeOldRoutine;stdcall;deprecated;varVersionNumber:Re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論