參考說明案例fp-refchs alpha_第1頁
參考說明案例fp-refchs alpha_第2頁
參考說明案例fp-refchs alpha_第3頁
參考說明案例fp-refchs alpha_第4頁
參考說明案例fp-refchs alpha_第5頁
已閱讀5頁,還剩213頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PascalTurboPascalFreePascalObjectPascal ANSIPChar-前置類型域 類CORBA@10.CaseIf..then..else語Repeat..until語While..do語With過程函數(shù)TurboPascal運(yùn)算符塊庫raisetry...except語try...finally語1Pascal5類:保留字 words)是在語言中有固定含義的詞。它們不能被修改或重定義)運(yùn)算(operators)通常是數(shù)學(xué)或其他運(yùn)算的符號,如+、-、*等等。分隔符(separators)通常是白空格。(constants)1(整數(shù)常量)(浮點(diǎn)數(shù)常量)'Stringconstant'(字符串,文本的一部分)在此章節(jié)中描述所有Pascal保留字,也會描述表示字符串、數(shù)字、標(biāo)識符等的各種FreePascalPascal數(shù)字:0..9十六進(jìn)制數(shù)字:+-*/=<>[].,():^@{}$<=>=:=+=-=*=/=(**)(..)在范圍指定中使用時,字符對等價(jià)于左方括號。同樣的字符對等價(jià)于右方括(**)等價(jià)于右花括號}。這些字符對在字符串表達(dá)式中會回歸它們的正常含義。(*Mybeautifulfunctionreturnsaninterestingresult*)FunctionBeautiful:Integer;(*和*)Pascal經(jīng)被{和}的使用替換掉了,如以下的例子:{Mybeautifulfunctionreturnsaninterestingresult}FunctionBeautiful:Integer;{Mybeautifulfunctionreturnsaninterestingresult,butonlyiftheargumentAislessthanB.}FunctionBeautiful(A,B:Integer)://MybeautifulfunctionreturnsaninterestingresultFunctionBeautiful:Integer;BorlandDelphiPascalFreePascal(*Thisisanoldstylecomment{ThisisaTurboPascalcomment//ThisisaDelphicomment.Allisignoredtilltheendofthe{Comment1(*comment2*)}(*Comment1{comment2}{comment1//Comment2}(*comment1//Comment2//comment1(*comment2//comment1{comment最后二種注釋必須在一行內(nèi)。如下兩種寫導(dǎo)致錯誤//Validcomment{Nolongervalidcommet}及//Validcomment(*Nolongervalidcommet在遇到這種構(gòu)造時編譯器將會發(fā)起“字符”錯誤,就算使用-Mturbo開關(guān)也一樣Pascal語言的一部分,同樣地,不能由程序員重定義。在整個語法圖示中它們用粗體表示。Pascal不區(qū)分大小寫,故編譯器將接受保留字的任何大小寫組合。TurboPascalDelphiTPTurboPascalDelphiFreePascalDelphiTurboPascal以下存在于TurboPascal模式FreePascalTurboPascal保留字外,F(xiàn)reePascal ObjectPascalObjectPascal保留字(DelphiObjPas模式)TurboPascal的一樣,有接下來的附加:Pascal語言的一部分。提醒Byte、BooleanMaxInt等預(yù)定義常量不是保留字。它們是標(biāo)識符:字母,_;字母,數(shù)字Pascal和)programprocedure保留字do在和調(diào)用過程“do”中被用作標(biāo)識符大多數(shù)標(biāo)識符(常量、變量、函數(shù)或方法、屬性)提示指令DeprecatedExperimentalPlatformdeprecatedexperimental使用該標(biāo)識符是試驗(yàn)性的:這可用于標(biāo)記需要謹(jǐn)慎使用的新特性。platform該標(biāo)識符依賴于平臺:它可能不在所有平臺上都被定義。unimplemented這應(yīng)該只用于函數(shù)或過程。它通常被用作提醒個別特性仍未實(shí)現(xiàn)。AConst=12P:integerFunctionSomething:Integer;testhd.pp(11,15)Warning:Symbol"p"isnotportabletesthd.pp(11,22)Warning:Symbol"AConst"isdeprecatedtesthd.pp(15,3)Warning:Symbol"Something"isexperimental數(shù)字通常用十進(jìn)制表示。實(shí)數(shù)(或者說小數(shù))用工程或科學(xué)記數(shù)法書寫(0.314E1)。對于整型常數(shù),F(xiàn)reePascal4種格式:普通十進(jìn)制格式(10為底)十六進(jìn)制格式(16為底),TurboPascal的方式相同。要指定常量為十六進(jìn)制格式,需于其前置一符號($)。從而十六進(jìn)制$FF等于十進(jìn)制255。注意大小寫在使1.0.7版本開始,八進(jìn)制格式(8為底)亦得到支持。要指定常量為八進(jìn)制格式,需于其前置一和符號(&)15用八進(jìn)制符號指定為&17。二進(jìn)制記號(2為底)(%)255進(jìn)制記號% 十六進(jìn)制序列十六進(jìn)制數(shù)字八進(jìn)制序列八進(jìn)制數(shù)字二進(jìn)制序列數(shù)字序列數(shù)字無符號整數(shù)數(shù)字序列$;十六進(jìn)制序列&;八進(jìn)制序列,%;二進(jìn)制序列]符號:+,-無符號實(shí)數(shù):數(shù)字序列;.,數(shù)字序列規(guī)模因子規(guī)模因子:E,e;,符號;數(shù)字序列無符號數(shù):無符號實(shí)數(shù),無符號整數(shù)有符號數(shù):,符號;無符號數(shù)提醒:TP和Delphi模式下不支持八進(jìn)制與二進(jìn)制記號1.8字符串(簡稱string)是零或個字符(大小為一字節(jié))的序列,囊括于單引號中,而且在程序源代碼中出現(xiàn)于單行:回車符或換行符按原樣出現(xiàn)于字符串中。引號間沒有東西的字符集('')為空字符串字符串引號串,控制串引號串字符串字符字符串字符除單引號或回車符外的字符控制串:[#;無符號整數(shù),^;字母不能由鍵盤輸入的字符,如#27表示退格符。C(使用反斜杠'Thisisapascalstring''Atabulatorcharacter'#9'iseasyto下面是的字符串'thestringstartshereandcontinueshere''thestringstarts andcontinues或'thestringstarts andcontinuesUnix類操作系統(tǒng)(MacOSX)'thestringstarts andcontinuesMac2TurboPascal中一樣,F(xiàn)reePascal普通常量的可用標(biāo)識符跟隨"="記號,并緊隨由合法數(shù)字、字符、布爾值或枚舉值組常量常量:[標(biāo)識符;=;表達(dá)式;提示指令;編譯器必須能在編譯時求出常量中表達(dá)式的值。這意味著大多數(shù)運(yùn)行時(Run-Time)chr、sizeof、pi、int、trunc、round、frac、odd等運(yùn)算符可以使用。對于表達(dá)式的信息,參閱第9章。法的常量:e ;實(shí)型常量a (整數(shù)類型常量c 字符類型常量s'Thisisaconstantstring';字符串類型常量sc=chr(32);ls=賦值給普通常量是不允許的。從而給定前述時,下述語句會導(dǎo)致編譯錯誤s:='someother1.9版本前,F(xiàn)reePascal641.9版本開始,64帶類型常量帶類型常量:[標(biāo)識符;:;類型;=;帶類型常量;提示指令;帶類型常量:常量,地址常量,數(shù)組常量,記錄常量,4.4節(jié)。兼容TurboPascal)。變量初始化是受到支持的。一種特殊的常量塊即為Resourcestring(資源字符串)塊。資源字符串更像是普通常量:資源字符串表現(xiàn)得如同常量字符串,但它們可以通過objpas單元的特殊子程序集來局域化。資源字符串塊僅在Delphi或Objfpc模式下得到允許。 = =objpas單元中的特定機(jī)制來使用。在語法上,這些字符串表現(xiàn)得像是普通常量;不允許對它們賦值(objpas單元中要用途是提供的簡易方法??梢栽诔绦騿T手冊和objpas單元中,找到資源字符串的提醒:注意通過表達(dá)式給出的資源字符串,在表達(dá)式的成分改變時是不會變的Part1='Firstpartofalongstring';Part2='Secondpartofalongstring';Sentence=Part1+''+Part2;若本地化程序翻譯了Part1和Part2,Sentence常量也不會被自動翻譯:它在資源字符串表中有分離的,從而必須被獨(dú)自翻譯。如上構(gòu)建簡單地表述了Sentence的初值等Part1+''+Part2。Yes='Yes';No='No';YesNo:Array[Boolean]ofstring=(No,Yes);B:Boolean; 3類型類型:標(biāo)識符;=;類型;7類型:簡單類型,字符串類型,構(gòu)造類型,指針類型,過程型類型,泛型,特化類型,類型標(biāo)system.longintOlongintlongint。FreePascal的基礎(chǔ)或簡單類型就是Delphi類型。分別對每個類型討論簡單類型:順序類型,實(shí)數(shù)類型實(shí)數(shù)類型:實(shí)數(shù)類型標(biāo)識符除int64、qword及實(shí)數(shù)類型外,所有基礎(chǔ)類型都是順序類型。順序類型有如下特點(diǎn)Inc、Ord、Dec的函數(shù)運(yùn)算定義在順序類型上。整所有預(yù)定義整數(shù)類型將呈現(xiàn)于表(3.1)FreePascal在表(3.2)qwordPascal0..1-128..1-32768..20..2SmallInt24 404-87808integer類型在默認(rèn)FreePascal模式下映射到smallint類型。它在Delphi模式下映射到longint類型。cardinal類型當(dāng)前始終映射到longword類型提醒:從1.9.0版本開始,所有不在- 認(rèn)且自動被分析為64位整數(shù)常量。更早的版本將其轉(zhuǎn)換成實(shí)數(shù)類型常量。使用不同種整數(shù)類型的情況下,F(xiàn)reePascal布爾類Booleanboolean名 大 11124FreePascal也支持ByteBool、WordBool和LongBool類型。它們可以是Byte、Word或Longint類型,但對Boolean賦值兼容:值False等價(jià)于0(零),而任何非零值都在轉(zhuǎn)換成布爾值時被當(dāng)成True。當(dāng)賦值給LongBool類型時布爾值True會被轉(zhuǎn)換成-1BBooleanB:=B:=B:=1<>2;{ResultsinB:=True提醒FreePascal中,布爾表達(dá)式默認(rèn)是以這種方式求值的,當(dāng)結(jié)果已知時,表達(dá)式剩在下面的案例中,函數(shù)Func不會被調(diào)用,這將會導(dǎo)致神奇的副效應(yīng)B:=A:=Band該行為可由編譯器指令{$B}控制。枚舉類FreePascalTurboPascal實(shí)現(xiàn)外,F(xiàn)reePascalC風(fēng)格的枚舉類型擴(kuò)枚舉類型標(biāo)識符列表,賦值枚舉列表標(biāo)識符列表標(biāo)識符賦值枚舉列表標(biāo)識符;:=;表達(dá)式面的正確的枚舉類型:Direction=(North,East,South,WestCEnumType=(one,two,three,forty:=結(jié)果,forty的序數(shù)是40而不是當(dāng)沒有“:=40”時的3。fortyone的序數(shù)值是41而非41。EnumType=(one,two,three,forty:=40,thirty:=需要把forty和thirty保持正確的順序。在使用枚舉類型時以下兩點(diǎn)是需要銘記的Pred和Succ函數(shù)不可作用于這種枚舉類型。只要試圖這么做都會引起編譯錯誤為可由編譯指令{$PACKNUMn}更改,該指令會告訴編譯器用于枚舉類型的最小字節(jié){$PACKNUMLargeEnum=(BigOne,Bio,BigThree{$PACKNUMSmallEnum=(one,two,three);VarS:SmallEnum;L:LargeEnum;Wrin('Smallenum:Wrin('Largeenum:',SizeOf(L));Smallenum:1Largeenum:子域類型:常量;..;Longint=$ Integer=-32768..32767;shortint=- = =Days=(monday,tuesday,wednesday,thursday,friday,WorkDays=monday..friday;WeekEnd=Saturday..Sunday;FreePascal在其所有浮點(diǎn)計(jì)算上使用數(shù)學(xué)協(xié)處理器(或模擬)。原生Real類型依賴于處理器,不過它要么是Single要么是Double。僅IEEE浮點(diǎn)類型得到支持,而且這些依賴于TurboPascal兼容類型列于表(3.4)。Comp類型在效果上是64位整數(shù),而且并非在所有平臺上可用。欲得到各平臺支持類型的信息,請參考程序41.5E-45..45.0E-324..81.9E-4932..-8.08-922337203685477.5808..8currency類型是定點(diǎn)實(shí)數(shù)據(jù)類型,內(nèi)部按照64位整數(shù)使用(自動除以因子10000),這FreePascalChar類型。Char1ASCII字符。字符亦可由其字符值(ASCII碼)指定,通過在順序值前面加上數(shù)字符號(#)。例如#65與'A'相同。同樣,上突符號(^)ASCII27的字符。因此^G等于—GFreePascalStringTurboPascal中所定義:擁有可選大小指定的字符序列。DelphiANSI字符串(長度不限)。欲變量為string,請用如下類型指定字符串類型:字符串;,255無大小指示的string語句的含義會根據(jù){$H}開關(guān)有不同解釋。如果沒有指示,如上的可以ANSI字符串或短字符串。無論實(shí)際類型為何,ANSI字符串和短字符串可以互換使用。編譯器始終會對需要的類型轉(zhuǎn)ANSIANSI在如下情形中,一個string會短字符串若開關(guān)關(guān)閉:{$H-},string始終會是短字符串的若開關(guān)打開:{$H+},而存在最大長度(大小)指定符,就會是短字符串預(yù)定義類型ShortString被定義為大小為255的字符串ShortString=若未指定字符串的大小,255Length標(biāo)準(zhǔn)運(yùn)行時子{$H-NameString=String[10];StreetString=String;NameString最多包含10個字符StreetString至多包含255個字符255的字符,編譯器會給出錯誤信息:Error:stringlengthmustbeavaluefrom1to對于短字符串長度在序號為0的字符中舊的TurboPascal代碼依賴于此而它在FreePascal中實(shí)現(xiàn)相同。盡管如此,為了寫可移植的代碼,設(shè)置短字符串長度最好還是調(diào)用SetLength,并調(diào)用Length檢索它。這些函數(shù)會有效,無論使用時內(nèi)部表示的是短ANSIANSI字符串是長度的字符串。它們是計(jì)數(shù)的,且保證有空字符終止。ANSI字這些都是密封處理的,即是說它們可以像普通的短字符串一樣控制。ANSI字符串可以用預(yù)AnsiString類型來定義。但這是為了在處理外部程序期待空終止字符串(C程序之所為)時提供便利。若{$H}開關(guān)打開,使用通常的String且不包含長度指定符,也會被當(dāng)做ANSI字若字符串為空(''),Nil向堆內(nèi)存中的結(jié)構(gòu)。ANSI字符串的內(nèi)部表示為指針自動的空字符終止令ansistring類型轉(zhuǎn)換成pchar成為可能。若字符串為空(故而指針為Nil)則編譯器會保證強(qiáng)制轉(zhuǎn)換的pchar指向空字ANSI導(dǎo)致S2的數(shù)減1,S1的數(shù)加1,且最終S1(作為指針)被到S2。這在代碼若字符串的數(shù)達(dá)到零則字符串占用的空間將被自動釋放而指針將被設(shè)置成Nil不會發(fā)生內(nèi)存泄漏。當(dāng)一個ANSI字符串后,F(xiàn)reePascal編譯器會自動分配恰當(dāng)?shù)膬?nèi)存給該指針,不會有多余。該指針會保證指向Nil,意味著字符串初始為空。這對于本地與全局的ANSI字符串或作為構(gòu)造類型(數(shù)組、記錄或?qū)ο螅〢NSI字符串為真。這的確會引起浪費(fèi)。例如,A:Array[1..100000]of1。所有這些事件對于程序員都是不可見的,但考慮到性能,這是重要的字符串內(nèi)容的內(nèi)存僅在字符串被賦值時分配。若該字符串離開作用域,則數(shù)自動減1。若數(shù)達(dá)到零,則為字符串保留的內(nèi)存將被釋放。若對數(shù)大于1的字符串的字符賦值,如下語句S:=T;{S和T的數(shù)現(xiàn)在是2}則在之前會創(chuàng)建一個字符串被分。這就是寫時(copy-on-write)語義??梢哉{(diào)UniqueString使字符串?dāng)?shù)強(qiáng)制等于R:=T;//T的數(shù)至少是3//T的數(shù)保證為ANSIPCharC必須使用Length函數(shù)取得ANSI字符串的長度長度并不在ANSI字串的0下標(biāo)字符處。TurboPascalANSI字符串不再正確。編譯器在遇到這種構(gòu)建時會警欲設(shè)置字符串長度,必須用SetLength函數(shù)。常量ANSI字符串擁有數(shù)-1并被特別對Length同樣的提醒:寫法TurboPascalANSI字符串不再正確。編譯器在遇到這種構(gòu)建時會警ANSI字符串可以強(qiáng)制轉(zhuǎn)換為PCharPointer類型VarP:PC:S:S:='Thisisanansistring';PANSIpointerNil。ANSIPChar,則結(jié)果將會是指向零字節(jié)的指針(空字符串)。PChar參數(shù)的過程。擁有大于1數(shù)的字符串。這種情況下你應(yīng)該調(diào)用Uniquestring以確保字符串引1。寬字符串(用于表示Unicode字符串)與ANSI字符串以大多相同的方式實(shí)現(xiàn):計(jì)數(shù),空終止數(shù)組,只是它們由WideChar代替Char實(shí)現(xiàn)。WideChar是雙字節(jié)字符(DCBS:雙字節(jié)字符集的元素)。絕大多數(shù)規(guī)則對于WideString和AnsiString一樣適用。編譯ANSI字符串,反之亦然。AnsistringPChar空終止字符數(shù)組一樣,WideString能轉(zhuǎn)換到pchar是非自動的。UnicodeANSI字符串的轉(zhuǎn)換,反之亦然。system單元擁有一息,請參閱system單元。sString類型,如下賦值是合法的。SS'Thisisa'One'+',Two'+',S'Thisisn''tdifficultS'Thisisaweirdcharacter:'#145'2(通ASCII碼)。該樣例展示了兩個字符串可以相加。返回值串正是第一個字符串連接上常量字符串是成ANSI字符串還是短字符串取決于{$H}開關(guān)的設(shè)定PChar-FreePascalDelphi的PChar類型實(shí)現(xiàn)。PCharChar類型的指針。PChar類型最好理解為CPascalPChar類型是一個指向Char類型數(shù)組的指針,該數(shù)組以空字符(#0)為終止。FreePascalPChar類型常量的初始化,programVarp:PChar;P:='Thisisanull-terminatedstring.'; n(P);programconstP:PChar='Thisisanull-terninatedstring.'; n(P);這些例子都證明了可以給一種Text類型的文件寫入字符串的內(nèi)容strings單元包含了像CProgramVarS:String[30];P:PChar;S:='Thisisanull-terminatedstring.'#0;P:=@S[1]; n(P);PCharstrings單元中的函數(shù)。QPChar類型,而ILongint類型3.5:PChar指針?biāo)悴?結(jié) P所指的地址加I P所指的地址加IP- P所指的地址減IP- (或PQ之間的字符數(shù)一種構(gòu)造類型是可以在一個變量中掌握多個值的類型。構(gòu)造類型可以地嵌套構(gòu)造類型:數(shù)組類型,記錄類型,對象類型,類類型,類類型,界面類型,集合類型,文不像Delphi,F(xiàn)reePascal不支持任意構(gòu)造類型的Packed。在接下來的節(jié)中逐個討論可行的構(gòu)造類型。當(dāng)類型支持packed時,我們會提及到。打包構(gòu)造類但是,F(xiàn)reePascal允用Packed和Bitpacked控制放置。這些詞的含義依賴于語境BitpackedPackedPacked的含義依賴具體場合在MACPAS模式,它等價(jià)于Bitpacked在其他模式,當(dāng)$BITPACKED指令設(shè)置為ON時,它也等價(jià)于Bitpacked不可取地址,除非其位大小是8的倍數(shù)且該元素正好在字節(jié)邊界上位打包結(jié)構(gòu)的元素不可用于var參數(shù),除非其位大小是8的倍數(shù)且該元素正好在欲確定一個位打包結(jié)構(gòu)中元素的大小,有BitSizeOf函數(shù)。它返回一個元素的位大小。對于其他類型的元素或未位打包的結(jié)構(gòu)元素,它會簡單地返回字節(jié)大小乘8,即它的返回值與8*SizeOf相同。32229字節(jié)(512MB)64261字節(jié)FreePascal像TurboPascal一樣支持?jǐn)?shù)組數(shù)組(位打包數(shù)組亦受到支持而且數(shù)組類型packedbitpackedarray順序類型of;靜態(tài)數(shù)元素時會產(chǎn)生運(yùn)行時錯誤(若打開范圍檢查)。下面是一個合法的數(shù)組案例:RealArray=Array[1..100]of11001100TurboPascal中一樣,若數(shù)組自身的組分類型是一個數(shù)組,將兩個數(shù)組合并成一個數(shù)組是可行的。APoints=array[1..100]ofArray[1..3]of等價(jià)于APoints=array[1..100,1..3]of函數(shù)HighLow返回最左側(cè)下標(biāo)類型的上界和下界。在上面的情況中1001。你可當(dāng)靜態(tài)數(shù)組變量相互賦值時,整個數(shù)組的內(nèi)容都會被。這對于數(shù)組同樣為真programTA=Array[0..9,0..9]ofA,B:I,J:Integer;ForI:=0to9doForJ:=0to9doForI:=0to9doForJ:=0to9doWrite(A[I,J]:2,''); ForI:=0to9doForJ:=0to9doA[9-I,9-ForI:=0to9doForJ:=0to9doWrite(B[I,J]:2,''); TByteArray=Arrayof當(dāng)動態(tài)數(shù)組變量的時候,數(shù)組初始長度是零。數(shù)組實(shí)際長度必須由標(biāo)準(zhǔn)SetLength函數(shù)1000:A:SetLength0999在所有時間,試圖有不在當(dāng)前數(shù)組長度下標(biāo)的元素會產(chǎn)生運(yùn)行時錯誤動態(tài)數(shù)組是計(jì)數(shù)的:將一個動態(tài)數(shù)組類型變量賦值給另一個會讓兩個指針指向相同數(shù)組。與ANSI字符串相反,這不是寫時的。考慮以下案例:A,B:在第二個賦值后,B31。programTA=ArrayofArrayofA,B:I,J:ForI:=0to9doForJ:=0to9doForI:=0to9doForJ:=0to9doWrite(A[I,J]:2,''); ForI:=0to9doForJ:=0to9doA[9-I,9-ForI:=0to9doForJ:=0to9Write(B[I,J]:2,' 如之前所提醒,動態(tài)數(shù)組是計(jì)數(shù)的:若前一個案例的A離開作用域而B沒,則該數(shù)組不會被釋放:A(及B)的數(shù)會減1。在數(shù)達(dá)到零時,分配給數(shù)組內(nèi)容的內(nèi)存將被立即釋放。也可以通過標(biāo)準(zhǔn)Copy函數(shù)且/或調(diào)整數(shù)組大小,這和字符串的Copy函數(shù)表現(xiàn)相同programTA=arrayofA,B:I:ForI:=0to9ForI:=0to5do Length-1,即數(shù)組最高下標(biāo)的值。打包與反打包數(shù)unpack子程序轉(zhuǎn)換成正常數(shù)組,如下例所示:foo:array['a'..'f']of=(false,false,true,false,false,false);bar:packedarray[42..47]ofBoolean;baz:array['0'..'5']of關(guān)于pack和unpack子程序的信息可以在system單元中找到FreePascal記錄類型packedbitpackedrecord域列表域列表:固定域固定域;;);變體部分固定域標(biāo)識符列表;:;類型變體部分case標(biāo)識符;:;順序類型標(biāo)識符of;變體變體常量;,,]:;(;,域列表故以下是合法的記錄類型Point=X,Y,Z:RPoint=CaseBooleanFalse:(X,Y,Z:Real);True:(R,theta,phi:Real);BetterRPoint=CaseUsePolar:BooleanofFalse:(X,Y,Z:Real);True:(R,theta,phi:Real);1然而,此域的是交給程序員的MyRec=X:Casebyte:(Y:Longint;casebyteof:(Z:SizeOf將對Point返回RPoint會得到最后,26就是BetterRPoint的大小對于MyRec,值會是122字節(jié)邊界對其的,為了性能原因。nn字節(jié)邊界上。nDefault會選擇編譯代碼的平臺上的默認(rèn)值(2)??聪孪翽rogramPackRecordsDemo;{$PackRecords2}Trec1=::Word;{$PackRecords1}Trec2=::Word;{$PackRecords2}Trec3=A,B:byte;{$PackRecords1}Trec4=A,B:Byte;{$PackRecords4}Trec5=::Array[1..3]of:byte;{$PackRecords8}Trec6=::Array[1..3]of:byte;{$PackRecords4}Trec7=::Array[1..7]of:byte;{$PackRecords8}Trec8=::Array[1..7]of:byte;Varrec1:Trec1;rec2:Trec2;rec3:TRec3;rec4:TRec4;rec5:Trec5;rec6:TRec6;rec7:TRec7;rec8:TRec8;Write('SizeTrec1: n('OffsetB:',Longint(@rec1.B)-Longint(@rec1));Write('SizeTrec2:',SizeOf(Trec2)); n('OffsetB:',Longint(@rec2.B)-Longint(@rec2));Write('SizeTrec3:',SizeOf(Trec3)); n('OffsetB:',Longint(@rec3.B)-Longint(@rec3));Write('SizeTrec4:',SizeOf(Trec4)); n('OffsetB:',Longint(@rec4.B)-Longint(@rec4));Write('SizeTrec5:',SizeOf(Trec5)); n('OffsetB:',Longint(@rec5.B)-Longint(@rec5),'OffsetC:',Longint(@rec5.C)-Longint(@rec5));Write('SizeTrec6: n('OffsetB:',Longint(@rec6.B)-Longint(@rec6),'OffsetC:',Longint(@rec6.C)-Longint(@rec6));Write('SizeTrec7: n('OffsetB:',Longint(@rec7.B)-Longint(@rec7),'OffsetC:',Longint(@rec7.C)-Longint(@rec7));Write('SizeTrec8: n('OffsetB:',Longint(@rec8.B)-Longint(@rec8),'OffsetC:',Longint(@rec8.C)-Longint(@rec8));Trec14B2Trec23B1Trec32B1Trec42B1Trec58B4OffsetC:Trec68B4OffsetC:SizeTrec7:12OffsetB:4OffsetC:11SizeTrec8:16OffsetB:8OffsetC:Trec1B22A和B之間留下一3。Trec5B的大小——34,B4字節(jié)邊界上,因?yàn)檫@是首個Trec6亦相同。Trec7,B4字節(jié)邊界上,因?yàn)槠浯笮 ?4Trec8887的二的冪,從而令記錄總大小為FreePascal亦支持“packedrecord(打包記錄)”,7邊界上對齊的記錄。從而以下兩個是等效的:{$PackRecords1}Trec2=::Word;{$PackRecords與Trec2=Packed::Word;注意第一個后的{$PackRecordsFreePascal像TurboPascal一樣支持集合類型。原型是集合類型setof;每個SetType中的元素都必須是TargetTypeTargetType可以是任何序數(shù)在0至之間的順序類型。集合至多可容納255個元素。以下是合法的集合Junk=SetofDays=(Mon,Tue,Wed,Thu,Fri,Sat,Sun);WorkDays:Setofdays;給定這些,如下賦值是合法的WorkDays:=[Mon,Tue,Wed,Thu,若類型范圍允許,編譯器會在Longint中小集合(小于32個元素)。否則集合將32字節(jié)中。9.8.5寫出在內(nèi)存中其數(shù)據(jù)的文件驅(qū)動。這里是文件類型的類型文件類型file;of;類型Point=RecordX,Y,Z:real;PointFile=Fileof在內(nèi)部,文件是由FileRec記錄表示的,它于Dos或SysUtils單元一種特殊的文件類型是Text文件類型,由TextRec記錄表示。擁有類型Text的文件使用特殊的輸入輸入子程序。默認(rèn)的Input、Output和StdErr文件類型定義于system單Textsystem單元的初始化代碼打開。指針類型^;指針的解(用在變量名后面加^表示)表現(xiàn)得像個變量。此變量擁有指針中的Programpointers;Buffer=String[255];BufPtr=^Buffer;VarB:BP:PP:在此例中,BPBufferBBuffer類型的變量。B256字節(jié)的內(nèi)存,而BP僅占用4(或8)字節(jié)的內(nèi)存:足以地址的內(nèi)存。就是所知的BP的解。結(jié)果是Buffer類型的,BP23從此觀點(diǎn)來看,指針指向該數(shù)組的第零元素。從而以下Varp:可以看做與以下數(shù)組等價(jià)Varp:array[0..Infinity]of使用前者,則必須使用Getmem函數(shù)手動分配內(nèi)存。p^與p[0]等同。如下程序可能programPointerArray;vari:Longint;p:pp:array[0..100]ofLongint;fori0to100dopp[i]i;p@pp[0];pppfori:=0to100doifp[i]<>pp[i] n('Ohoh,problemFreePascalCP將會增加或?qū)?yīng)地減少指針指向的地址指針P所指的類型大小。例VarP:IncP44longint1字節(jié)(即假設(shè)指針為指向字符:byte的指針)。varp1,p2:^Longint;L:Longint;P1:=@P2;P2:=@L;L:=P1-P1:=P1-4;P2:=。這里加上或減去的值會被乘以指針?biāo)傅念愋痛笮±蠵1會減少16字節(jié),而P2會16。。前置類型程序通常需要記錄的鏈表每一個記錄都包含一個指針到下一個記(而且可能還有前一個記錄的來在堆上分配。為了這么做,記錄必須像這樣定義:TListItem=RecordData:Integer;Next:^TListItem;當(dāng)編譯器嘗試編譯這段東西時,它會在遇到Next時抱怨道TListItem仍未定義:這為了能擁有一個作為有類型指針的Next元素,需要引進(jìn)“前置類型PListItem=^TListItemTListItem=RecordData:Integer;Next:PListItem;當(dāng)編譯器遇到有類型指針,而其所的類型未知時,它會推遲的解決。該指針定義即是“前置類型”。被類型需要在同一個Type塊的后面引入指針類型和被類型的定義中間不可夾雜Type器解決當(dāng)前塊中所有未決的??梢杂糜谌魏魏罄m(xù)其的類型定義。譯注:實(shí)際上可以定義二種或種記錄,每個記錄中都含有其他記錄的指針FreePascalTurboPascalDelphi的實(shí)現(xiàn)由些許區(qū)別。類型聲過程型類型函數(shù)頭,過程頭(of;object));(,(;;調(diào)用修飾符))函數(shù)頭:function;通常參數(shù)列表;:;返回類型過程型procedure;調(diào)用修飾符registercdecl,pascal,stdcall,safecall,對于通常參數(shù)列表的描述,見11章。以下兩個例子是合法的類型TypeTOneArg=Procedure(VarX:integer);TNoArg=Function:Real;varproc:TOneArg;func:TNoArg;Nil,對于通常過程指針和方法指針均可過程型類型的變量,即擁有相同類型的另一個變量給定這些,以下賦值合法Procedureprintit(VarX:Integer); n(x);Proc:=@printit;Func:=@Pi;TurboPascalTurboPascal中不需要在賦值給過程型變量時使用地址運(yùn)算符(@),而FreePascal在使用-MDelphi或-MTP開關(guān)的情況提醒:涉及調(diào)用約定的修飾符必須與的相同,即以下代碼會給出編譯錯誤TypeTOneArgCcall=Procedure(VarX:integer);cdecl;varproc:TOneArgCcall;Procedureprintit(VarX:Integer); n(x);Proc:=@printit;個使用變體的單元的使用子句:variants單元包含檢驗(yàn)和轉(zhuǎn)換到其他變體的支持,多于SystemObjPas單元提供的默認(rèn)支持。單類型都可以被賦值給變體:順序類型、字符串類型、64位整數(shù)類型。COMCORBA對象可以被賦值給變體(主要因?yàn)樗鼈兒唵蔚厥侵羔槪?,TMyEnum=V:Variant;I:Integer;B:Byte;W:Word;Q:Int64;E:D:En:AS:WS:programusesA:I:ForI:=1to10do對于VarArrayCreate的解釋,見單元programusesV:I: n('I:V:='Somethingelse'; n('I:第一個賦值會進(jìn)行,而第二個不會,因?yàn)?Somethingelse'不能轉(zhuǎn)換成合法的整數(shù)值。EConvertError異常。(byteintegerintegerdoublecharstring)提醒:變體的調(diào)度界面(dispatchinterface)變體可包含界面的——一個正常界面(源自IInterface)或調(diào)度界面(源自IDispatch)。包含調(diào)度界面的變體可以用于控制其后的對象:編譯器將使用延遲綁WINDOWSW:V: n('InstalledversionofMSWordis:',V);是通過插入查詢在變體W中的調(diào)度界面所需的代碼來執(zhí)行的,并且若找到了所需的調(diào)4移動到為此變量保留的內(nèi)存位置的機(jī)器碼。此變量所之處依賴于它于何處:位置,而且能在整個程序運(yùn)行時。局部變量是于過程或函數(shù)內(nèi)部的變量它們的值于程序棧中即不在固定位置FreePascal編譯器不透明地掌控這些內(nèi)存位置的分配,盡管這些分配可以受到影響FreePascal變量必須在單元或程序或過程或函數(shù)的變量節(jié)。它是這樣的變量變量:標(biāo)識符;:;類型;(,=;表達(dá)式);(,變量修飾符);提示指令;變量修飾符(absolute整數(shù)表達(dá)式,標(biāo)識符export),cvarexternal,(,字符串常量),(,name;字符串常量),提示指令)]這意味著下面是合法的變量curterm1:curterm2:integer;curterm3:integer;cvar;curterm4:integer;externalname'curterm3';curterm5:integer;external'libc'name'curterm9';curterm6:integerabsolutecurterm1;curterm7:integer;cvar;export;curterm8:integer;cvar;public;curterm9:integer;exportname'me';curterm10:integer;publicname'ma';curterm11:integer=1;第一形式(curterm1)定義一個常規(guī)變量。編譯器將會自己掌握它 而此位置之匯編器名由寫于源代碼之中的變量名指定。可以不指定name。cvarname。第六形式一個變量(curterm6),并告訴編譯器它與其他變量在相同位(curterm1)名(大小寫有別),而且必須是公開的,即它可以被其他目標(biāo)文件。第八形式(curterm8)等價(jià)于第七:“public”是“export”的別名第十一形式一個變量(curterm11)并對它以值初始化(在上面情況中是1)。注意匯編器名必須是唯一的。不可以2個擁有相同匯編器名的變量。同的是它們的包含初始值,可以由前一節(jié)的圖示所見。給定S:String='ThisisaninitializedSDefault='ThisisaninitializedS:String=并為逗號區(qū)分。初始化元素的數(shù)量必須準(zhǔn)確等于類型中的元素?cái)?shù)量。例如:tt:array[1..3]ofstring[20]=('ikke','gij',ti:array[1..3]ofLongint=Field:Value圓括號環(huán)繞。例如:Point=recordX,Y:RealOrigin:Point=(X:0.0;常量記錄中的域順序必須與類型中的相同,否則會導(dǎo)致編譯時錯誤全局變量通常對所有線程相同。一個全局變量能以在變量塊將var替換成Threadvar來被成線程局域的:IOResult:線程并非默認(rèn)啟用的。需要關(guān)于線程編程的信息,請看程序員手冊中的線程章節(jié)1read/writeFreePascalDelphiObjFPC模式來支持。屬性:標(biāo)識符;(,屬性界面);屬性限定屬性界面:(,屬性參數(shù)列表);:;類型標(biāo)識符(index;整數(shù)常量屬性參數(shù)列表:[;[參數(shù)](;);屬性限定符:(,讀限定符);(,寫限定符);(,默認(rèn)限定符)讀限定符:read;域或函數(shù)寫限定符write;默認(rèn)限定符(default,(,常量)),域或過程域標(biāo)識符,過程標(biāo)識符)域或函數(shù)域標(biāo)識符,函數(shù)標(biāo)識符{$modeobjfpc}unitFunctionGetMyInt:Integer;ProcedureSetMyInt(Value:Integer);MyProp:IntegerReadGetMyIntWriteUsesFMyInt:FunctionGetMyInt:Integer;ProcedureSetMyInt(Value:Integer);If((Valuemod2)=1)RaiseException.Create('MyPropcanonlycontainevenvalue');讀/寫限定符可以通過在另一個單元中來隱藏,另一個單元名稱必須在該單元的uses{$modeobjfpc}unittestrw;FunctionGetMyInt:Integer;ProcedureSetMyInt(Value:Integer);UsesFMyInt:FunctionGetMyInt:Integer;ProcedureSetMyInt(Value:Integer);If((Valuemod2)=1)RaiseException.Create('Onlyevenvaluesareallowed');testprop單元如下{$modeobjfpc}unitusesMyProp:IntegerReadGetMyIntWrite655.1FreePascal中面向?qū)ο缶幊痰募夹g(shù)問題。還有,對象引入了可見性的理念:域、過程以及函數(shù)可以被成public、或private。默認(rèn)情況下,域和方法是public的,并且被導(dǎo)出到當(dāng)前單元以外。對象的原型如下所示:packed);object;(,繼承組分列表];繼承:(;對象類型標(biāo)識符組分列表:(,對象可見性標(biāo)識符);(,[域定義]);(,[方法定義域定義:標(biāo)識符列表;:;類型可見性標(biāo)識符(private,protected,TObj=objectCaption:ShortString;Constructorinit;Destructordone;ProcedureSetCaption(AValue:String);PropertyGetCaption:String;能在TObj的單元之外。提醒:在MacPas模式下,Object被class替代,因?yàn)橐c其他Mac上可PascalMacPas模式中使用。的,正如同在打包記錄中一樣。打包對象的與打包記錄的相似:TObj=packedobjectConstructorinit;Pobj=VarPP:類似的,{$PackRecords域下:TypeTAnObject=ObjectAField:Longint;ProcedureAMethod;VarAnObject:AnObject.AField:=在方法中,域可以使用短標(biāo)識符ProcedureTAnObject.AMethod;AField:=或者你可以用self標(biāo)識符。self標(biāo)識符對象的當(dāng)前實(shí)例ProcedureTAnObject.AMethod;Self.AField:=你不能在類的方法之外私有(private)或保護(hù)(protected)的域。如果嘗試這么做,編也可以用對類實(shí)例使用with語句,就像記錄一樣WithAnObjectdoAField:=12;在上例中,beginend之間,AnObjectAfieldAmethod標(biāo)識符之前一樣。相關(guān)信息在10.2.7節(jié)中??梢栽趯ο蠓椒ㄖ?,但也可以通過給出完全有效名稱,在對象之外。{$staticon}l:longint;static;c1,c2:cl; 233注意代碼的最后一行對象類型本身(cl),而不是對象的實(shí)例(c1或c2)構(gòu)建器或析構(gòu)器的如下構(gòu)建器:構(gòu)建器頭;;;子程序塊析構(gòu)器:析構(gòu)器頭;;;子程序構(gòu)建器頭constructor;標(biāo)識符,有效方法標(biāo)識符);通常參數(shù)列表析構(gòu)器頭:destructor;(標(biāo)識符,有效方法標(biāo)識符);通常參數(shù)列表假如對象使用虛方法,則構(gòu)建器/一些內(nèi)部管理:而這種管理是由構(gòu)建器進(jìn)行的2FreePascalNew及DisposeNew時可以指定構(gòu)建器的名稱。New被實(shí)現(xiàn)成指向?qū)嵗瘜ο笾羔樀暮瘮?shù)??紤]如下TObj=object;Constructorinit;Pobj=VarPP:3pp:=new和new(pp);在最后一種情況中,編譯器會導(dǎo)致警告,必須用new和dispose的擴(kuò)展語法來生成對象Delphi的面向?qū)ο缶幊掏緩?,可以認(rèn)為是面向?qū)ο缶幊?必須建立到VMT指向方法被調(diào)用的對象。當(dāng)方法實(shí)現(xiàn)時,函數(shù)頭必須給出完全有效標(biāo)識符。當(dāng)方法時,方法定義:(函數(shù)頭,過程頭,構(gòu)建器頭,析構(gòu)器頭);;;方法指令方法指令:(,virtual;;;(, ;;));(,調(diào)用修飾;;)FPC中不會:MyObj=Object Field:Longint;調(diào)用方法和調(diào)用通常過程一樣,只是它們前附一個對象實(shí)例標(biāo)識符(10章)。欲決定要調(diào)用何種方法,需要知道方法的類型。逐一對待下面不同的類型。 象的(即編譯時)方法。例如考慮:TParent= PParent=^TParent;TChild=Object(TParent) PChild=如你所能見,親與子對象都有一個叫 t的方法?,F(xiàn)在考慮及調(diào)用ParentA,ParentB:PParent; :PChild;ParentA:=New(PParent,Init);ParentB:=New(PChild,Init);Child:=New(PChild,Init); t的調(diào)用中,只有最后一個會調(diào)用TChild. t。這是因?yàn)樵陟o態(tài)方法中,編譯器會在編譯時決定何種方被調(diào)用。因?yàn)镻arentB是TParent類型,故編譯器決定了必須調(diào)用TParent. 成TChild。或許有些時候方法的實(shí)際調(diào)用依賴于對象運(yùn)行時的實(shí)際類型。如果這樣,方法為補(bǔ)救上一節(jié)的情形(virtual)方法得以創(chuàng)造這是通過于方法后附加virtual修飾符簡單完成的后繼對象可以通過使用virtual重新 回到前例,考慮以下不同的TParent= PParent=^TParent;TChild=Object(TParent) PChild=如你所能見,親與子對象都有叫 t的方法?,F(xiàn)在考慮接下來的及調(diào)用ParentA,ParentB:PParent; :PChild;ParentA:=New(PParent,Init);ParentB:=New(PChild,Init);Child:=New(PChild,Init); TParentChild,情形亦不改變:它還是作為TChild的實(shí)例創(chuàng)造的。然而對于ParentB,狀況改變了:盡管它作TParent,但它是作為TChild的實(shí)例創(chuàng) t之前,程序會檢查ParentB的實(shí)際類型,而只在之后決定需要調(diào)用哪個方法看到ParentB是TChild類型,TChild. 我們稱 t覆蓋了 t。在 t中可以 t,通過inheritedProcedureTChild. 在上面的例子中,當(dāng)調(diào)用TChild. t時,它做的第一件事就是調(diào)用TParent. inherited不可用于靜態(tài)方法,只能用于虛方法。MethodTable)。這只是一個擁有指向每個虛方法指針的表:每個虛方法都有其在表中固定VMT中的親方法會被重寫。關(guān)于VMT的信息可尋于程序員手冊。VMT初始化。抽象方法是一種特殊的虛方法。被為抽象( 原因顯然:沒有可供編譯器跳轉(zhuǎn)的方法!一個為 TParent= TChild= PChild=如你所能見,親與子對象都有一個叫 t的方法??紤]如下的及調(diào)用ParentA,ParentB:PParent; :PChild;ParentA:=New(PParent,Init);ParentB:=New(PChild,Init);Child:=New(PChild,Init); 3PParent3testo.pp(32,3) methodscan'tbecalled211)。publicprivatePrivate所有在private塊中的域和方法只能在包含對象的模塊(即單元或程序)中。它們可以由對象內(nèi)部的方法或外部,例如由其他對象的方法,或全局函數(shù)。Protected和Private相同,只是Protected節(jié)可以被繼承類型,即使它們實(shí)現(xiàn)在Public域和方法始終可從任意地點(diǎn)。public塊的域和模塊表現(xiàn)得如同它們在普通record類型6類Delphi的面向?qū)ο缶幊掏緩街?,一切都圍繞著“類”的理念。類可以看成指向?qū)ο蟮闹窤TSomeObject;BTSomeClass;提醒FreePascalobjpas0.99.12版本開始這不再為真。從此版本開始,該單元會在指定了-MObjfpc-MDelphi選項(xiàng)時,或使用其對應(yīng)指令時自動加載{$mode{$mode事實(shí)上,當(dāng)遇到在uses子句中出現(xiàn)objpas單元時編譯器會警告類的原型如下packed);class;(,繼承組分列表]);繼承:(;類類型標(biāo)識符;(,實(shí)現(xiàn)界面實(shí)現(xiàn)界面:[(,);界面標(biāo)識符組分列表:(,可見性修飾符域定義方法定義,屬性定義域定義:標(biāo)識符列表;:;類型static方法定義class);(函數(shù)頭,過程頭)),構(gòu)建器頭,析構(gòu)器頭virtual,override,(message;整數(shù)常量,字符串常量調(diào)用修飾類可見性標(biāo)識符(privateprotected,public,提醒:在MacPas模式下,Object因?yàn)榕c其他Mac上的可用Pascal編譯器兼容,被class替代。這意味著在MacPas模式下,上面圖示中保留字“class”可以用保留字Privateprivate塊中的域和方法,僅能在包含類定義的模塊(即單元)中使用。它們可以從類內(nèi)部的方法或從外部(例如其他類的方法)。Protected它與Private相同,除了Protected節(jié)的成員能被繼承類型,即使它們Public這些節(jié)始終可publishedpublished節(jié)中。和對象一樣,若{$STATICON}以從類外通過提供完整有效名稱來。{$mode{$staticon}l:longint;static;c1,c2:cl; 233注意代碼最后一行的是類類型本身(cl),而非類的實(shí)例(c1或c2)同樣可以定義類類型類類class;of;TComponentClass=Classof ponent(AClass:TComponentClass;AOwner:TComponent):TComponent;//...//...此函數(shù)可以傳入任意繼承自TComponent的類的類。以下調(diào)用合法C: C:因?yàn)門Stream不繼承自TComponent,而AClassTComponent類編譯器可(類也可以用于檢查繼承TMinClass=ClassofTMyClass;TMaxClass=ClassofTMyClassChild;FunctionCheckObjectBetween(Instance:TObject):Ifnot(InstanceisTMinClass)or((InstanceisTMaxClass)and(Instance.ClassType<>TMaxClass))thenRaiseException.Create(SomeError)當(dāng)某類的一個變量被時,編譯器只會分配指針的處所,而非整個對象。類的構(gòu)建器會返ClassVar:=new和disposegetmem,以分配足夠保留類實(shí)例數(shù)據(jù)的空間。之后,構(gòu)建器代碼被執(zhí)Self中。提醒{$PackRecords指令對類也適用,即不同域的內(nèi)存對齊依賴{$PackRecords1字節(jié)邊界上,也就是說盡可能接近。TObject.InstanceSize方法。類中方法的與對象中的方法遵循同樣的規(guī)則方法定義函數(shù)頭,過程頭,構(gòu)建器頭,析構(gòu)器頭);;;方法指令:(,(virtual;;; ;;)),(reintroduce;;),(message;常量表達(dá)式));(,調(diào)用修飾;VarAnObject:TAnObject;AnObject:=TAnObject.Create;類擁有虛方法,正如對象所有。但是兩者有區(qū)別。對于對象,用virtual足以在繼承對象中重相同方法以覆蓋之。對于類,情況有別:虛方法必須用override覆蓋不然則會開啟新一批虛方法之前的會被隱藏如果使用了Virtual,InheritedObjParent=ProcedureMyProc;virtual;ObjChild=Class(ObjPArent)ProcedureMyProc;Warning:Aninheritedmethodishiddenby正確如下:ObjParent=ProcedureMyProc;virtual;ObjChild=Class(ObjPArent)ProcedureMyProc;override;若虛方法確實(shí)要被替換成擁有同名的方法,則可以使用reintroduceObjParent=ProcedureMyProc;virtual;ObjChild=Class(ObjPArent)ProcedureMyProc;reintroduce;中的親方法會被重寫。關(guān)于VMT的信息可尋于程序員手冊。提醒:“virtual”可以被“dynamic”替代:動態(tài)方法現(xiàn)在表現(xiàn)與虛方Delphi,F(xiàn)PC類方法是通過在過程或函數(shù)前的Class辨別的,如下例中ClassFunctionClassName:類方法是無實(shí)例的方法(即Self不指向類對象),但遵循類的作用域和繼承規(guī)則。它們可AClass:ifCompareText(AClass.ClassName,'TCOMPONENT')=0MyClass:ifMyClass.ClassNameis('TCOMPONENT')合法。常規(guī)屬性或方導(dǎo)致編譯錯誤。類中的新內(nèi)容是消息(message)方法。指向消息方法的指針在特殊表中,與它GUI工具包的回調(diào)函數(shù)編程,例如Win32GTKDelphi的區(qū)別是FreePascal亦支持字符串作為消息標(biāo)識符。消息方法如類圖示中所能見,消息方法通過Message,后隨整數(shù)常量表達(dá)式。var參數(shù)(類型可有可無):ProcedureTMyObject.MyHandler(VarMsg);MessageTObject.Dispatch方法。消息方法是自動為虛的,即它們可以為后繼類所覆蓋。TObject.Dispatch方法可用來調(diào)用message操作。它于system單元而且會接收TMsg=RecordMSGID:CardinalData:Pointer;Msg:MyObject.DispatchDispatch尋找是否有的消息方法帶有MSGID消息若找到該方法則會調(diào)用該方法并傳遞MsgDefaultHandler。DefaultHandlerTObjectproceduredefaulthandler(var除帶有整數(shù)標(biāo)識符的消息方法外,F(xiàn)reePascalProcedureTMyObject.MyStrHandler(VarMsg);MessageTOBject.DispatchStr方法可用于調(diào)用message操作它于system單元而且會接ID的字符串。例如:TMsg=MsgStrString[10];長度任意255個字符.Data:Pointer;Msg:TMSg;MyObject.DispatchStr(Msg);在此例中,DispatchStr方查詢對象及其全部祖先(從該對象開始,并向上搜索繼承類樹),尋找是否有的消息方法帶有MsgStr消息。若找到該方法,則會調(diào)用該方法,并傳遞Msg參數(shù)selfProcedureStrMsgHandler(Data:Self:TMyObject);MessageSelf參數(shù)。提醒:Self參數(shù)的類型必須是與定義方法的類相同的類在覆蓋的虛方法中,通常需要調(diào)用親類的虛方法實(shí)現(xiàn)。這可以用inherited完成。類似地,inherited可以用來調(diào)用親類的任何方法。TMyClass=ConstructorCreate(AOwner:TComponent);override;ConstructorTMyClass.Create(AOwner://Domorethings在上例中,InheritedTComponentCreateAOwner作為TMyClass=ConstructorCreate(AOwner:TComponent);override;ConstructorCreateNew(AOwner:TComponent;DoExtra:Boolean);ConstructorTMyClass.Create(AOwner:ConstructorTMyClass.CreateNew(AOwner:TComponent;Inherited//DostuffTMyClass.Create。屬性定義property;標(biāo)識符;(,屬性界面);屬性修飾符;提示指令屬性界面:(,屬性參數(shù)列表);:;類型標(biāo)識符;(,(index;整數(shù)常量))屬性參數(shù)列表:[;[參數(shù)屬性修飾符:(,讀修飾符);(,寫修飾符,實(shí)現(xiàn)修飾符);(,默認(rèn)修飾符);(,修飾符);(,默讀修飾符:read;域或方法寫修飾符write;實(shí)現(xiàn)修飾符implements;默認(rèn)修飾符(default,(,常量)),修飾符stored常量,標(biāo)識符)域或方法域標(biāo)識符,方法標(biāo)識符)默認(rèn)數(shù)組屬性標(biāo)識符:;;default讀修飾符要么是包含屬性的稱,要么是函數(shù)名稱,該函數(shù)返回值類型與屬性相同。在簡例如給定以下MyClass=ClassField1:Longint;Field2:Longint;Field3:ProcedureSety(value:Longint);FunctionGety:Longint;FunctionGetz:Longint;PropertyX:LongintReadField1writeField2;PropertyY:LongintReadGetYWriteSety;PropertyZ:LongintReadGetZ;MyClass: n('X: n('Y: n('Z:',MyClass.Z);MyClass.X:=0;MyClass.Y:=MyClass.Z:=因?yàn)閆是只讀屬性setNNN方法。{$modeobjfpc}TPoint=Class(TObject)FX,FY:FunctionGetCoord(Index:Integer):Longint;ProcedureSetCoord(Index:Integer;Value:longint);PropertyX:Longintindex1readGetCoordWriteSetCoord;PropertyY:Longintindex2readGetCoordWriteSetCoord;PropertyCoords[Index:Integer]:LongintReadGetCoord;ProcedureTPoint.SetCoord(Index:Integer;Value:Longint);CaseIndex:FX:=:FY:=Value;FunctionTPoint.GetCoord(INdex:Integer):Longint;CaseIndex:Result:=:Result:=FY;P:P:=P.X:=P.Y:=WithP n('X=',X,'而第二個參數(shù)為要賦的值。相反地,當(dāng)X的值時,編譯器會調(diào)用GetCoord并傳給它1。下標(biāo)只能是整數(shù)值。數(shù)擁有和屬性相同的類型。例如,見:TIntList=ClassFunctionGetInt(I:Longint):longint;FunctionGetAsString(A:String):String;ProcedureSetInt(I:Longint;Value:Longint;);ProcedureSetAsString(A:String;Value:String);PropertyItems[i:Longint]:LongintReadWritePropertyStrItems[S:String]:StringReadWriteAIntList:AIntList.Items[26]:=AIntList.StrItems['twenty-five']:='zero'; n('Item26:',AIntList.Items[26]); n('Item25:',AIntList.StrItems['twenty-AIntList.Items['twenty-five']:=1;AIntList.StrItems[26]:='zero';數(shù)組屬性可以為默認(rèn)(default)屬性。這意味著在賦值或它時不需要指定屬性名。例中,若Items屬性的定義是PropertyItems[i:Longint]:LongintReadWriteSetInt;AIntList.Items[26]:=AIntList[26]:=每個類只允許一個默認(rèn)屬性,而繼承類不能重默認(rèn)屬性:參數(shù)函數(shù)。修飾符在類的行為上沒有。它是為了流系統(tǒng)而設(shè)標(biāo)識符被指定于為類RTTI(RTTI則它只能是流式的),而且它被用于決定一個屬性是否該為:有其默認(rèn)值的屬性,不會被流系統(tǒng)寫入流。默認(rèn)值于為類生成的RTTI中。注意 不可用作默認(rèn)自,因?yàn)樗挥糜趦?nèi)部表示“無默認(rèn)(nodefault)”因?yàn)樗鼈兛梢员桓采w,故“inherited”亦可用于屬性的親定義。例如考慮如TAncestor=classFP1:Integer;propertyP:integerReadFP1writeFP1;TClassA=class(TAncestor)procedureSetP(constAValue:char);functiongetP:Char;constructorpropertyP:charReadGetPwriteSetP;procedureTClassA.SetP(constAValue:InheritedP:=Ord(AValue);procedureTClassA.GetP:Result:=Char((InheritedP)and$FF);TClassA重定義P作為字符屬性,替代了整數(shù)屬性,但是用了親的P屬性來值TAncestor=classprocedureSetP1(constAValue:integer);virtual;propertyP:integerwriteSetP1;TClassA=class(TAncestor)procedureSetP1(constAValue:integer);override;procedureSetP2(constAValue:char);constructorpropertyP:charwriteSetP2;constructorTClassA.Create;inheritedP:=3;若必須調(diào)用親類SetP1的實(shí)現(xiàn),則這必須是顯示調(diào)用constructorTClassA.Create;inheritedSetP1(3);71.1C(這里一個類可以有多個親類擇如同C+中實(shí)例所實(shí)現(xiàn)界面基本上就是方法和屬性名集合一個實(shí)現(xiàn)界面的類供所有枚舉于類定義中的方法。一個類不可能只實(shí)現(xiàn)界面的一部分:這是全或無的。GUID標(biāo)識。GUID是全局唯一標(biāo)識符(GloballyUniqueIdentifier)之縮寫,是保證始終唯一3的

溫馨提示

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

最新文檔

評論

0/150

提交評論