Delphi編碼標(biāo)準(zhǔn)資料_第1頁
Delphi編碼標(biāo)準(zhǔn)資料_第2頁
Delphi編碼標(biāo)準(zhǔn)資料_第3頁
Delphi編碼標(biāo)準(zhǔn)資料_第4頁
Delphi編碼標(biāo)準(zhǔn)資料_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Delphi編碼標(biāo)準(zhǔn).

一、序言

本文檔詳述了在Delphi4開發(fā)者指南下進(jìn)行編程的代碼編寫標(biāo)準(zhǔn).在通常情況下.

本文檔遵循“取消”式格式的指引方針,該方針由Borland國際通過一些例外來使用。

在Delphi4開發(fā)者指南中包含本文檔的目的在于闡述一種方法,通過該方法,開發(fā)小組

可以在他們所編寫的代碼中保持一貫的風(fēng)格。這樣做的目的是使在開發(fā)小組中的每一

個(gè)程序員都可以明白其他程序員的代碼。這有助于提高代碼編寫的可讀性和使用的一

貫性。

本文檔并不意味著包含了所有存在于代碼中的標(biāo)準(zhǔn)。但是,它的內(nèi)容已足夠幫你起

個(gè)好頭。你可以自由的增加修改這些標(biāo)準(zhǔn)來滿足你的需要。我們不贊成你偏離這些由

Borland開發(fā)人員所使用的標(biāo)準(zhǔn)太遠(yuǎn)。我們推薦這么做是因?yàn)橐坏┯行碌某绦騿T加入到

你的開發(fā)小組中,而他們最喜歡和最熟悉的是Borland的標(biāo)準(zhǔn)。象大多數(shù)代碼標(biāo)準(zhǔn)文檔,

本文檔也會根據(jù)需要進(jìn)行改動(dòng)。因此,你可以到中找到最新的更新版本。本文檔不包括

用戶接口標(biāo)準(zhǔn)。本文檔是獨(dú)立的但也是同樣重要的。已經(jīng)有足夠的第三方書籍和

Microsoft文檔包括了另外一些指導(dǎo)方針,而我們決定并不復(fù)制這些信息,但我們會指引

你到MicrosoftDevelopersNetwork和一些資源,在那兒可以找到你所需的信息。

二、通用源代碼格式規(guī)則

2.1縮格

縮格是指在每一級有兩個(gè)空格。不要在源代碼中保留tab字符,這是因?yàn)閠ab字符

會隨著不同用戶的不同設(shè)置和不同的資源管理工具(打印、文檔、版本控制等)而代表

不同的寬度。

你可以通過關(guān)閉Environment詵項(xiàng)對話框中Editor頁上的"Usetabcharacter”

和MOptimalfill”檢查框(通過ToolsIEnvironment)來禁止保存tab字符。

2.2頁邊空格

頁邊空格會被設(shè)置成80字符寬。通常,源碼不會超出這個(gè)邊界,但這個(gè)方針會有一

些彈性。不管是否有可能,那些超出到另一行的語句會在一個(gè)逗號或其他操作符之后與

前面的語句相連。當(dāng)一個(gè)語句被打斷相連時(shí),它應(yīng)比原來的那一行語句縮進(jìn)兩個(gè)字符。

2.3Begin...End配對

Begin子句應(yīng)寫在獨(dú)立的一行。例如,下面第一行是錯(cuò)誤的寫法而第二行是正確的

O

forI:=0to10dobegin〃錯(cuò)誤,begin同for在同一行

forI:=0to10do〃正確,begin出現(xiàn)在獨(dú)立的一行

begin

這個(gè)規(guī)則的例外是當(dāng)begin子句的出現(xiàn)是作為一個(gè)else子句的一部分-參考例子:

ifsomestatementthen

begin

end

elsebegin

someOtherStatement;

end;

end語句永遠(yuǎn)出現(xiàn)在獨(dú)立的一行。

當(dāng)begin語句不是一個(gè)else子句的一部分時(shí),相應(yīng)的end語句永遠(yuǎn)縮進(jìn)到與begin

部分相對應(yīng)的位置。

ObjectPascal

3.1括號

永遠(yuǎn)不要在括號與括號之間的字符中間留下空格。下面的例子示范了錯(cuò)誤的與正

確地使用括號中的空格:

CallProc(Aparameter);〃錯(cuò)誤

CallProc(Aparameter);〃正確

永遠(yuǎn)不要在一個(gè)語句中使用不必要的括號。括號只應(yīng)在源代碼中需要的地方使用

。以下的例子示范了錯(cuò)誤和正確的使用:

if(I=42)then〃錯(cuò)誤-多余的括號

if(I=42)or(J=42)then〃正確-需要括號

3.2保留字和關(guān)鍵字

ObjectPascal保留字和關(guān)鍵字永遠(yuǎn)是全部小寫.

3.3過程和函數(shù)(例程)

3.3.1命名/格式化

例程的名字永遠(yuǎn)應(yīng)該以大寫的字母開頭并且中間錯(cuò)落分明以便于可讀性。下面是

一個(gè)不正確格式的過程名稱:

procedurethisisapoorlyformattedroutinename;

下面是一個(gè)合適的大小寫例程名稱的例子:

procedureThisisMuchMoreReadab1eRoutineName;

例程的名稱應(yīng)該同它的內(nèi)容相符。一個(gè)會導(dǎo)致某個(gè)行為的例程應(yīng)以動(dòng)詞開頭。例

如:

procedureFormatllardDrivc;

一個(gè)用于設(shè)置輸入?yún)?shù)的例程應(yīng)以單詞set作為前綴,例如:

procedureSetUserName;

一個(gè)用來接收某個(gè)值的例程應(yīng)以單詞get作為前緩,例如:

的參數(shù)的代碼。

而例程中另外一些非變參數(shù)也可常量來傳送。盡管這樣做沒有產(chǎn)生任何效果和提

高效率,這將會給調(diào)用例程的使用者提供更多的信息。

33.2.5名稱的沖突

當(dāng)使用擁有兩個(gè)名稱相同的例程的兩個(gè)單元時(shí),如果你調(diào)用該例程時(shí),在uses子句

中排在后面的單元中的例程將會被調(diào)用。為了解決這種“在uses子句上的模糊”沖突,

要在調(diào)用該例程時(shí)寫上相關(guān)的單元的前綴,例如:

sysUtile.FindClose(SR);

windows.FindClose(Hcindle);

3.4變量

3.4.1變量的命名和格式

變量的命名應(yīng)以使用它們的目的相符

循環(huán)控制變量應(yīng)采用一個(gè)單獨(dú)的字符作為名字,匕如I,J,或K,也可以采用更加有

意義的名字,比如Userindex。

邏輯變量的名字應(yīng)能充分表達(dá)準(zhǔn)確的真或假的意思。

3.4.2局部變量

一個(gè)過程中的局部變量應(yīng)遵循所有其它變量的使用和命名約定。臨時(shí)變量的取名

應(yīng)合理。

如果必須的話,在一進(jìn)入例程就應(yīng)初始化局部變量。局部的AnsiString變量會自

動(dòng)初始化為一個(gè)空的字符串。

局部接口和派分接口類型變量將會自動(dòng)初始化為nil,并且局部變數(shù)和ole變數(shù)類

型變量會自動(dòng)初始化為Inassigned

3.4.3全局變量的使用

使用全局變量是不推薦的。但是,在某些時(shí)候還是必須使用,而且它們也只應(yīng)在必

須使用的時(shí)候才使用。在這種時(shí)候,你應(yīng)努力只在一段上下文范圍內(nèi)使用全局變量。例

如,一個(gè)全局變量只應(yīng)在一個(gè)單元的implemntation部分內(nèi)是全局的。如果打算在多個(gè)

單元類使用全局?jǐn)?shù)據(jù),你應(yīng)將它們移到一個(gè)公共的單元中然后被其它所有單元使用.

全局變量可以在var子句中直接初始化為一個(gè)值。記住,所有的全局?jǐn)?shù)據(jù)會自動(dòng)初

始化為0,因此不要將全局變量初始化為一個(gè)“空”值比如0、nil、''、Unassigned

、等等。這樣做的一個(gè)理由是因?yàn)榱阋怀跏蓟娜謹(jǐn)?shù)據(jù)在exe文件中不會占據(jù)任何空

間。零-初始化數(shù)據(jù)被存儲在一個(gè)虛擬的數(shù)據(jù)段,它在應(yīng)用程序啟動(dòng)后被分配在一段內(nèi)

存中。非零-初始化的全局?jǐn)?shù)據(jù)在硬盤的exe文件占用空間。

3.5類型

3.5.1大寫約定

如果類型的名字是保留字,那么它應(yīng)全部小寫CWin32API類型通常全部大寫,并且

你必須遵循在Windows.pas或其他API單元中的詳細(xì)類型名稱的約定。對于其他變量名

字,地一個(gè)字母應(yīng)為大寫,而其他字母應(yīng)錯(cuò)落有致。下面是一些例子:

MyString:string;〃保留字

WindowHaiidlt!:HWND;“Win32API類型

I:Integer;〃在System單元中引進(jìn)的類型標(biāo)識符

浮點(diǎn)指針類型

不推薦使用Real類型,因?yàn)樗拇嬖谥皇菫榱讼蚯凹嫒菰缙诘腜ascal代碼。在通

常情況下用Double來實(shí)現(xiàn)浮點(diǎn)指針的需要。并且,Double對處理器和總線而言是做了

最優(yōu)化處理的,它也是IEEE中定義的標(biāo)準(zhǔn)數(shù)據(jù)格式。只有當(dāng)需要的范圍超出Double所

定義的范圍時(shí)才使用Extended。Extended是intel定義的類型且在Java中不支持。只

有當(dāng)浮點(diǎn)指針變量的實(shí)恒字節(jié)大小有其意義時(shí)才使用Single。(比如當(dāng)使用另一種語言

的DLLs時(shí))。

枚舉類型

枚舉類型的名字需符合使用該類型的目的。該類型的名字需以字符T為前綴,以表

明這是一個(gè)類型。枚舉類型中的標(biāo)識符列表必須包含兩個(gè)或三個(gè)字符的前綴來對應(yīng)于

該枚舉類型的名字-例如:

TsongType=(stRock,stClassical,stCountry.stAlternative,stHeavyMetal,

stRB);

一個(gè)枚舉類型的實(shí)例的名字應(yīng)與不要前綴的枚舉類型(SongType)相同,除非有更好

的原因來賦予該變量更特殊的名字,比如:FavoriteSongTypel,FavoriteSongType2等

等。

變數(shù)和。Ie變數(shù)類型

通常不建議使用變數(shù)和Ole變數(shù)類型。但在只有運(yùn)行時(shí)刻才能知道數(shù)據(jù)類型的程

序中必須使用該類型,這種情形多出現(xiàn)在COM和數(shù)據(jù)庫開發(fā)中。Ole變數(shù)使用在以COM

為基礎(chǔ)的編程中例如自動(dòng)化和ActiveX控制,而變數(shù)使用在非COM的編程中,這是因?yàn)樽?/p>

數(shù)可以十分有效地存儲本地Delphi字符串(同一個(gè)字符串變量一樣),但Ole變數(shù)會將所

有的字符串轉(zhuǎn)換為Ole字符串(WideChar字符串)并且并不實(shí)例運(yùn)算-它們永遠(yuǎn)拷貝。

3.5.2結(jié)構(gòu)類型

數(shù)組類型

數(shù)組類型的名字需符合它們使用的目的。該類型的名字必須加以前綴T。如果須聲

明該數(shù)組類型的指針,那么該指針需加以前綴P而且應(yīng)立即聲明在該數(shù)組聲明的前面。

例如:

type

PCycleArray=TCycleArray;

TCycleArray=array[l-*-100]ofinteger;

在實(shí)際應(yīng)用中,數(shù)組的變量實(shí)例的名稱應(yīng)是其類型的名字去掉前綴T。

記錄類型

記錄類型的名字應(yīng)符合使用它們的目的。其類型妁聲明應(yīng)加以前綴T。如果要聲明

該記錄類型的指針,就應(yīng)加以前綴P并且應(yīng)緊靠在類型聲明的前面聲明。例如:

type

PEmployee=TEmployee;

TEmployee=record

EmployeeName:string;

EmployeeRate:Double;

end;

3.6語句

3.6.1if語句

在if/thcn/cls。語句中最常發(fā)生的行為應(yīng)放在then子句中,而其它發(fā)生可能性較

小的行為應(yīng)放在else子句中。

盡量避免使用嵌套的if語句,在這種情形下應(yīng)用多個(gè)if語句來判斷各種可能.

不要使用if嵌套超過五級深度。應(yīng)使代碼編寫得更加清晰、明了。

不要在if語句中使用不必要的圓括號。

如果在if語句中有多個(gè)條件需測試,這些條件反按計(jì)算強(qiáng)度由少到多的順序從左

到右排列。這樣做能使編譯器在編譯代碼時(shí)獲得布爾估算邏輯的捷徑,從而使你的代碼

獲得最佳的優(yōu)化。舉例來說,如果條件1快過條件2,而條件2快過條件3,那么在if語

句中的排列應(yīng)是:

if條件1and條件2and條件3then

3.6.2case語句

一般性話題

在一個(gè)case語句中的各個(gè)獨(dú)立的單元應(yīng)以數(shù)字或字母順序排列。

每一個(gè)case單元的動(dòng)作行為應(yīng)保持簡單而不應(yīng)該超過四到五行代碼。如果所要執(zhí)

行的動(dòng)作過于復(fù)雜應(yīng)采用獨(dú)立的過程或函數(shù)。

Case語句中的else子句只有當(dāng)需要缺省行為或處理錯(cuò)誤時(shí)才使用。

3.G2.2格式

case語句應(yīng)遵循其它結(jié)構(gòu)的縮格和命名約定。

3.6.3while語句

在一個(gè)whilo語句中不建議使用exit過程來跳出循環(huán),盡量僅使用循環(huán)條件來跳出

循環(huán)。

在一個(gè)while循環(huán)中所用的初始化代碼應(yīng)緊靠在進(jìn)入while循環(huán)前面出現(xiàn)而不要被

其它不相關(guān)的語句隔開。

任何結(jié)束后的處理應(yīng)在循環(huán)之后立即進(jìn)行。

3.6.4for語句

for語句只有當(dāng)循環(huán)次數(shù)已知的情況下才能取代while語句使用。

3.6.5repeat語句

repeat語句的使用同while語句一樣,并且遵循同樣的通用方針。

3.6.6with語句

一般話題

with語句應(yīng)節(jié)省使用,并且?guī)в写罅康木?。避免過度使用with語句并且在with

語句中小心使用多個(gè)對象、記錄等等。例如:

withRecordI,Record2do

這些事情會使程序員感到困惑并難以發(fā)現(xiàn)問題所在。

格式

With語句遵循本文檔所說明的命名約定和縮格的格式規(guī)則。

3.7結(jié)構(gòu)異常處理

3.7.1一般話題

異常的處理大量地使用在錯(cuò)誤糾正和資源保護(hù)方面。這就是說一旦資源被分配,一

個(gè)try…finally必需加以使用來保證該資源被正確的釋放。這種異常的保護(hù)也是指在

一個(gè)單元的initializition/finalization或一個(gè)對象的constructor/destructor中

進(jìn)行資源的分配和釋放。

3.7.2try…finally的使用

任何情形下,每一次的分配都應(yīng)跟隨一個(gè)Sy…finally。舉例來說,下面的代碼會

造成可能的錯(cuò)誤:

SomeClassl:=TsomeClass.Create;

SomeClass2;=TsomeClass.Create;

try

{dosomecode)

finally

SomeClassl.Free;

SomeClass2.Free;

end;

一個(gè)更安全更合適的分配過程應(yīng)是:

SomeClassl:=TSomeClass.Creeite;

try

SomeClass2:二TsomeClass.Create;

{dosomecode}

finally

SomeClass2.Free;

end;

finally

SomeClassl.Free;

end;

3.73try...except的使用

只有當(dāng)在異常被觸發(fā)而你想執(zhí)行一些任務(wù)時(shí)才使用try…except。通常,你沒有必

要為了只是簡單地在屏寨上顯示一個(gè)錯(cuò)誤信息而使用try-except語句,因?yàn)檫@會被

Application對象自動(dòng)執(zhí)行。如果你想在except子句中執(zhí)行完一些任務(wù)之后調(diào)用缺省

的異常處理,使用raise來重新觸發(fā)異常到下一個(gè)句柄。

3.7.4try...except...else的使用

try-exccpt中的else子句不建議使用,因?yàn)樗鼤驍嗨械漠惓0切┠銢]有

準(zhǔn)備的異常。

3.8類類型

3.8.1命名和格式

類類型的名稱應(yīng)符合使用它們的目的。類型名字應(yīng)加以前綴T以表明這是一個(gè)類

型的定義-例如:

type

Tcustomer=class:T0bject)

類型的實(shí)例通常是沒有前綴T的類型的名字-例如:

var

Customer:Tcustomer;

注意:查閱“構(gòu)件類型的命名標(biāo)準(zhǔn)”來獲得更多有關(guān)構(gòu)件命名的信息。

3.8.2域

命名/格式

類的域名遵循與變量標(biāo)識符同樣的約定除了它們應(yīng)以F為前綴,來表明這是一個(gè)域

的名稱。

可視化

所有的域都必需是私有的。想在類的范圍之外存取域得通過屬性來使用。

3.8.3方法

3.83.1命名/格式

方法的命名應(yīng)遵循本文檔中有關(guān)過程和函數(shù)的約定敘述。

3.83.2使用靜態(tài)的方法

如果使用一個(gè)靜態(tài)的方法,那么該方法就不能被該類的后代類所繼承。

3.8.3.3使用虛擬/動(dòng)態(tài)的方法

如果你打算該類的方法能被后代的類所繼承就得使用虛擬的方法。只有在該方法

有多個(gè)繼承時(shí)(直接的或間接的)才使用動(dòng)態(tài)的方法。例如,一個(gè)類類型包含一個(gè)可繼承

的方法,而100個(gè)后代類要繼承這種方法,那么這個(gè)方法就會動(dòng)態(tài)地產(chǎn)生為100個(gè)后代類

使用的內(nèi)存。

3.83.4使用抽象的方法

如果在一個(gè)類中使用抽象的方法,該類就不能被創(chuàng)建。只有在那些永遠(yuǎn)不會被創(chuàng)建

的類中使用抽象的方法。

3.83.5屬性存取方法

所有存取類的方法都只能出現(xiàn)在類的private或protected部分。屬性存取方法的

命名應(yīng)遵循過程和函數(shù)的約定規(guī)則。讀取存取方法(萬法讀取器)必需以單詞Get為前

綴。寫入存取方法(方法寫入器)必需以單詞Set為前緩。方法寫入器的參數(shù)的名字應(yīng)

為Value,并且它的類型應(yīng)是它所操作的屬性的類型。例如:

TSompClass=class(TObject.)

private

FsomeField:Integer;

protected

functionGetSomcField:Integer;

procedureSetSomeField(Value:Integer);

public

propertySomcField:IntegerreadGetSomeFicldwriteSetSomeField;

end;

3.8.4屬性

3.8.4.1命名/格式

屬性如果是表示為一個(gè)私有域的存取器的話,那么它的名字應(yīng)是它們所操作的域的

名字除去解釋符F。

屬性的名字應(yīng)是名詞,不是動(dòng)詞。屬性表示的是數(shù)據(jù),而方法表示的是行為。

數(shù)組類型的名稱應(yīng)為復(fù)數(shù)。一般情況下屬性的名稱應(yīng)為單數(shù)。

3.8.4.2使用存取的方法

盡管沒有要求,但還是建議盡量少地為一個(gè)表示私有域的屬性而使用寫入存取方法

四、文件

4.1工程文件

4.1.1命名

工程文件應(yīng)取個(gè)描述性的名字。例如,Delphi4開發(fā)者指南錯(cuò)誤管理器的工程名

字是:DDGBugs.dpr。一個(gè)有關(guān)系統(tǒng)信息的程序的名字就應(yīng)象Syslnfo.dpr0

4.2窗體文件

4.2.1命名

一個(gè)窗體文件的取名應(yīng)可以描述使用該窗體的目的,并加以后綴frmo例如,一個(gè)

“關(guān)于”的窗體的文件名應(yīng)是Aboutfrm.dpr。主窗體的文件名應(yīng)是Mainfrm.dpr。

4.3數(shù)據(jù)模板文件

4.3.1命名

數(shù)據(jù)模板的取名應(yīng)能表示使用該數(shù)據(jù)模板的目的,它的名稱應(yīng)加以兩個(gè)字符的后綴

DM。例如,自定義數(shù)據(jù)模板的文件名字應(yīng)為CustomersDM.dfm0

4.4遠(yuǎn)端數(shù)據(jù)模板文件

4.4.1命名

遠(yuǎn)端數(shù)據(jù)模板的取名應(yīng)能表示使用該遠(yuǎn)端數(shù)據(jù)模板的目的,它的名稱應(yīng)加以三個(gè)字

符的后綴RDM。例如,自定義遠(yuǎn)端數(shù)據(jù)模板的文件名字應(yīng)為CustomersRDM.dfm。

4.5Unit文件

4.5.1通用Unit結(jié)構(gòu)

unit的名字

Unit文件應(yīng)取一個(gè)可描述性的名字。例如,包含應(yīng)用程序主窗體的單元應(yīng)叫做

Mainfrm.pas。

uses子句

在interface部分的uses子句應(yīng)包含在interface部分中的代碼所需要的單元。

去掉那些Delphi可以自動(dòng)加入到程序中的單元。

在implementation部分的uses子句應(yīng)只包含在implementation部分中的代碼所

需要的單元的名字。去捏不必要的單元。

interface部分

interface部分應(yīng)包含只那些其它單元所需要存取類型的定義、變量、過程/函數(shù)

的預(yù)定義等等。否則,就應(yīng)放在implementation部分定義。

implementation部分

implementation部分應(yīng)包含那些只在本單元中私用的類型定義、變量、過程/函數(shù)

定義等等。

initialization部分

不要在initialization部分放入耗時(shí)長的代碼,這將使程序的第一個(gè)界面出現(xiàn)

得比較緩慢。

finalization部分

在這里要保證釋放你在Initialization部分所分配的任何資源。

4.5.2窗體單元

命名

一個(gè)窗體的單元文件應(yīng)擁有與它所對應(yīng)的窗體文件同樣的名稱。例如,“關(guān)于”窗

體的單元名稱應(yīng)為Aboutfrm.pas,而主窗體的單元名稱應(yīng)為Mainfrm.pas0

4.5.3數(shù)據(jù)模板單元

4.53.1命名

一個(gè)數(shù)據(jù)模板的單元文件應(yīng)擁有與它所對應(yīng)的數(shù)據(jù)模板文件同樣的名稱。例如,一

個(gè)自定義數(shù)據(jù)模板單元的名稱應(yīng)為CustomersDM.pas。

4.5.4一股目的單元

命名

一般目的單元的取名應(yīng)符合使用該單元的目的。例如,一個(gè)實(shí)用程序單元取名為

BugUtilities.paso一個(gè)包含全局變量的單元取名為CustomerGlobals.paso

注意,該單元的名字不能與它的工程中所使用的所有包中的單元的名字相同。不贊

成使用一般的或通用的單元名字。

4.5.5構(gòu)件單元

命名

構(gòu)件單元應(yīng)放在獨(dú)立的目錄,以將它們同定義構(gòu)件組或構(gòu)件集合的單元區(qū)分開來。

它們要永遠(yuǎn)同工程在不同的目錄。單元名字應(yīng)同它們的內(nèi)容相符。

注意:查閱“用戶定義的構(gòu)件”部分來獲得更多有關(guān)構(gòu)件命名標(biāo)準(zhǔn)的信息。

4.6文件頭

建議在所有源文件、工程文件、單元等等中使后信息化文件頭。一個(gè)良好的文件

頭應(yīng)包含以下信息:

{

版權(quán)…著作的年、月、日…

}

五、窗體和數(shù)據(jù)模板

5.1窗體

5.1.1窗體類型命名標(biāo)準(zhǔn)

窗體類型的取名應(yīng)能表達(dá)使用該窗體的目的。類型定義應(yīng)加以前綴Tfrmo前綴后

面跟隨著描述性的名字。例如,一個(gè)“關(guān)于”的窗體的類型的名字應(yīng)為:

TfrmAbout=class;TForm);

主窗體的定義為:

TfrmMain=class(TForm);

一個(gè)用戶接入窗體的名字應(yīng)象:

TfrmCustomcrEntry=class(TForm);

5.1.2窗體實(shí)例命名標(biāo)準(zhǔn)

窗體實(shí)例應(yīng)是沒有帶前綴T的相應(yīng)類的名字。例如,對應(yīng)于前面窗體類型而言,其

實(shí)例的名字應(yīng)為:

類型名稱實(shí)例名稱

TfrmAboutfrmAbout

TfrmMainfrmMain

TfrmCustomcrEntryfrmCustomerEntry

5.1.3自動(dòng)創(chuàng)建窗體

只有主窗體可以是目動(dòng)創(chuàng)建的除非有其它更好的理由不這樣做。所有其它的窗體

必需從工程選項(xiàng)對話框中的自動(dòng)創(chuàng)建列表中移走。查閱以下部分來獲得更多的信息。

5.1.4模式窗體實(shí)例化函數(shù)

所有的窗體單元都應(yīng)包含一個(gè)窗體實(shí)例化函數(shù),該函數(shù)用來創(chuàng)建、設(shè)置、模式地顯

示窗體,并釋放窗體。該函數(shù)應(yīng)返回窗體的模式結(jié)果。該函數(shù)要傳遞的參數(shù)應(yīng)遵循本文

檔指定的“參數(shù)傳遞”標(biāo)準(zhǔn)。通過這種方式封裝的函數(shù)性有助于代碼的再利用和維護(hù)。

該窗體的變量要從單元中移走,并再窗體實(shí)例的函數(shù)中進(jìn)行本地式地定義。注意,

這就意味著該窗體必需從工程/選項(xiàng)對話框中的自動(dòng)創(chuàng)建列表中剔除。參考本文檔后面

的“自動(dòng)創(chuàng)建窗體”。

例如,下面的單元展示了再GetUserData窗體中的一個(gè)函數(shù)。

unitUserDatafrm;

interface

uses

windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls;

type

TfrmUserData=class(TForm)

edtUserXame:TEdit;

edtUserlD:TEdit;

private

{Privatedeclarations)

public

{Publicdeclarations}

end;

functionGetUserData(varaUserName:String;varaUserlD:Integer):

Word;

implementation

{$R*.DFM}

functionGetUserData(varallserNamc:String;varaUserTD:Integer):

word;

var

frmUserData:TfrmuscrData;

begin

frmUserData:=Tfrmusei'Dcita.Create(Application);

try

frmUserData.Caption:='GellingUserData,;

Result:=frmUserData.ShowModal;

if(Result=mrOK)then

begin

aUserXame:=frmUserData.edtUserName.Text;

alserlD:=StrToInt(frmUserData.edtUserlD.Text);

end;

finally

frmUserData.Free;

end;

end;

end.

5.2數(shù)據(jù)模板

5.2.1數(shù)據(jù)模板命名標(biāo)準(zhǔn)

數(shù)據(jù)模板的取名要符合使用該數(shù)據(jù)模板的目的。類型的定義應(yīng)加以前綴T,后面緊

接著描述性的名字,最后要加以后綴單詞“DataModuS"。例如,一個(gè)自定義的數(shù)據(jù)模

板有時(shí)候應(yīng)該象:

TCustomerDataModu1e=class(TDataModu1e)

一個(gè)命令式的數(shù)據(jù)模板的名字應(yīng)象:

TOrdersDataModule=class(TDataModu1e)

5.2.2數(shù)據(jù)模板實(shí)例命名標(biāo)準(zhǔn)

數(shù)據(jù)模板實(shí)例的名稱應(yīng)是對應(yīng)不帶前綴T的類型的名稱。例如,對于前面的窗體類

型而言,其實(shí)例的名稱應(yīng)為:

類型名稱實(shí)例名稱

TCustomerDataModu1eCustomerDataModule

TOrdersDataModuleOrdersDataModule

六、包

6.1使用運(yùn)行包和設(shè)計(jì)包的比較

運(yùn)行時(shí)刻的包應(yīng)只包含其它構(gòu)件包所要求的單元或構(gòu)件。另外,包含屬性/構(gòu)件編

輯器和其它只為設(shè)計(jì)的代碼應(yīng)放入到設(shè)計(jì)時(shí)刻包中。注冊單元應(yīng)放在設(shè)計(jì)包中。

6.2文件命名標(biāo)準(zhǔn)

包的名稱應(yīng)依照下面的例子:

“iiilibw.pkg”-設(shè)計(jì)時(shí)刻包

“iiistdw.pkg”-運(yùn)行時(shí)刻包

字符“iii”表示一個(gè)3字符標(biāo)識前綴。這個(gè)前綴用來表明公司、個(gè)人或其它有標(biāo)

識意義的實(shí)體。

字符“vv”表示為該包想要對應(yīng)Delphi某個(gè)版本的包的版本號。

注意,包的名字中包含“l(fā)ib”或“std”的意思是表明這是一個(gè)設(shè)計(jì)時(shí)刻包還是一

個(gè)運(yùn)行時(shí)刻包。

如果既是設(shè)計(jì)時(shí)刻包乂是運(yùn)行時(shí)刻包,該文件的命名是同上面一樣的,例如,為

Delphi4開發(fā)者指南做的包的名稱應(yīng)為:

DdgLib40.pkg-設(shè)計(jì)時(shí)刻包

DdgStd40.pkg-運(yùn)行時(shí)刻包

七、構(gòu)件

7.1用戶自定義構(gòu)件

在標(biāo)準(zhǔn)構(gòu)件中命名出來的構(gòu)件的名稱同在“類類型”部分定義中的一樣定義成一

個(gè)類類型,不同的是它們有一個(gè)3字符的指示前綴,這個(gè)前綴可以表示公司、個(gè)人或其

它實(shí)體。例如,一個(gè)為Delphi4開發(fā)者指南編寫的時(shí)鐘構(gòu)件的名稱定義為:

TddgClock=class:TComponent)

注意,那三個(gè)前綴字符是小寫的。

7.2構(gòu)件單元

構(gòu)件單元應(yīng)只包含一個(gè)主要的構(gòu)件,一個(gè)主要的枸件是指出現(xiàn)在構(gòu)件欄中的構(gòu)件。

主要構(gòu)件的輔助構(gòu)件/對象應(yīng)放入到同一個(gè)單元中。

7.3使用注冊單元

構(gòu)件的注冊過程應(yīng)從構(gòu)件本身的單元中剔除,并放入到一個(gè)獨(dú)立的單元中。這個(gè)注

冊單元可以用來注冊任何構(gòu)件、屬性編輯器、構(gòu)件編輯器、專家器等。

構(gòu)件的注冊只應(yīng)在設(shè)計(jì)時(shí)刻包中進(jìn)行,注冊單元反包含在設(shè)計(jì)時(shí)刻包中而不應(yīng)放在

運(yùn)行時(shí)刻包中。

推薦使用的注冊單元的名稱是:

X某某Reg.pas

上面的3個(gè)前綴字符“X某某”用來表示一個(gè)公司、個(gè)人或任何其它的實(shí)體。例如,

在Delphi4開發(fā)者指南中的注冊單元的名稱應(yīng)為DdgReg.pas。

7.4構(gòu)件實(shí)例命名約定

所有的構(gòu)件都應(yīng)取個(gè)描述性的名稱。由Delphi創(chuàng)建的缺省名的構(gòu)件不會被遺棄。

在設(shè)計(jì)構(gòu)件類型時(shí)應(yīng)設(shè)計(jì)一個(gè)小寫的前綴。使用前綴而不使用后綴的原因是在搜尋時(shí),

在對象檢查器和代碼探索器中搜尋構(gòu)件的名字比搜尋構(gòu)件的類型更容易實(shí)現(xiàn)。

7.5構(gòu)件的前綴

以下構(gòu)件的前綴可以用來設(shè)計(jì)Delphi4中的標(biāo)準(zhǔn)構(gòu)件。請?jiān)诖肆斜碇屑尤氲谌?/p>

構(gòu)件的前綴。

7.6Standard頁

前綴構(gòu)件

mmTMainMenu

pmTPopupMenu

mmiTMainMenuItem

pmiTPopupMenuItern

前綴構(gòu)件

IblTLabel

edtTEdit

memTMemo

btnTButton

cbTCheckBox

rbTRadioBox

lbTListBox

ebbTComboBox

sebTScrollBar

gbTGroupBox

rgTRadioGroup

pnlTPanel

cmdlTCommandList

7.7Additional頁

bbtnTBitBtn

sbtnTSpeedButton

medtTMaskEdit

sgTStringGrid

dgTDrawGrid

imgTImage

shpTShape

bvlTBevel

sbxTScrollBox

clbTCheckListbox

splTSplitter

stxTStciticText

chtTChart

7.8Win32頁

tbcTTabControl

pgcTPageControl

imglTTmageList

redtTRichEdit

thrTTrackBar

prbTProgressBar

udTUpDuwn

hkTHotKcy

aniTAnimate

dtpTDateTimePicker

tvTTreeView

IvTListView

hdrTHcadcrControl

前綴構(gòu)件

stbTStatusBar

tlbTToolBar

clbTCoolBar

7.9System頁

tmTTimer

pbTPaintBox

mpTMediaPlayer

olecTOleContainer

ddccTDDEClientltem

ddciTDDEC1lentItem

ddscTDDEServerConv

ddsiTDDESei'verltem

7.10Internet頁

cskTCIieiilSuukel

sskTScrvcrSocket

wbdTWebDispatcher

PPTPageProducer

tpTQueryTableProducer

dstpTDataSetTableProducer

nmdtTNMDayTime

necTNMEcho

nfTNMFinger

nftpTNMFtp

nhttpTNMHttp

nMsgTNMMsg

nmsgTNMMSGServ

nntpTNMNNTP

npopTNMPop3

nuupTNMUUProcessor

smtpTNMSMTP

nstTNMStrm

nstsTNMStrmServ

ntmTNMTime

nudpTNMUdp

pskTPowerSock

ngsTNMGeneralServer

htmlTHtml

urlTNMUrl

smlTSinip1eMail

7.11DataAccess頁

前綴構(gòu)件

dsTDataSource

tblTTable

qryTQuery

spTStoredProc

dbTDataBase

ssnTSession

bmTBatchMove

usqlTUpdateSQL

7.12DataControls頁

dbgTDBGrid

dbnTDBNavigator

dbtTDBText

dbeTDBEdit

dbmTDBMemo

dbiTDBImage

dblbTDBListBox

dbcbTDBComboBox

dbchTDBCheckBox

dbrgTDBRadioGroup

dbllTDBLookupListBox

db1cTDBLookupComboBox

dbreTDBRichEdit

dbcgTDBCtrlGrid

dbchTDBChart

7.13DecisionCube頁

debTDecisionCube

deqTDecisionQuery

desTDecisionSource

depTDecisionPivot

degTDecisionGrid

degrTDecisionGrtiph

7.14QReport頁

qrTQuickReport

qrsdTQRSubDetail

qrbTQRBand

qrcbTQRChildBciiid

qrgTQRGi'oup

qrlTQRLabel

前綴構(gòu)件

qrtTQRText

qreTQRExpr

qrsTQRSysData

qrmTQRMemo

qrrtTQRRichText

qrdrTQRDBRichText

qrshTQRShape

qriTQRTmage

qrdiTQRDBMImage

qrcrTQRCompositeReport

qrpTQRPreview

qrchTQRChart

7.15Dialogs頁

對話框構(gòu)件是由構(gòu)件封裝的真正的窗體,因此,它們應(yīng)遵循窗體的命名約定。類型

已由構(gòu)件的名稱定義。它的實(shí)例的名稱是Delphi自動(dòng)生成的類型實(shí)例名字去掉數(shù)字后

綴。舉例如下:

類型實(shí)例名字

TOpenDialogOpenDialog

TSaveDialogSaveDialog

TOpenPictureDialogOpenPictureDialog

TSavePictureDialogSavePicturcDialog

TFontDialogFontDialog

TColorDialugColoiDialog

TPrintSetupDialogPrintSetupDialog

TFindDialogFindDialog

TReplaceDialogRoplaceDialog

7.16Win3.1頁

dbllTDBLookupList

dblcTDBLookupCombo

tsTTabSet

olTOutline

tnbTTabbedNoteBook

nbTNoteBook

hdrTHeader

fibTFileListBox

dlbTDirectoryListBox

debTDriveComboBox

febTFliterComboBox

7.17Samples頁

88TGuuge

前綴構(gòu)件

egTColorGrid

spbTSpinEdit

speTSpinEdit

dolTDirectoryOutline

calTCalendar

ibeaTIBEventAlerter

7.18ActiveX頁

cfxTChartFX

vspTVSSpell

fibTFIBook

vtcTVTChart

grpTGraph

7.19Midas頁

prvTProvider

cdsTClientDataSet

qcdsTQueryClientDataSet

dcomTDCOMConnection

oleeTOleEnterpriseConnection

sckTSocketConnection

misTReiuuleSeivei

midTMidasConncction

8.注釋

8.1序言性注釋

序言性注釋加在單元、工程的開頭處,非常重要,主要內(nèi)容如下:

程序名稱作者創(chuàng)建日期最近一次修改日期

功能概述

輸入數(shù)據(jù)或入口參數(shù)輸出數(shù)據(jù)或出口參數(shù)

主要處理流程和主要算法描述主要的數(shù)據(jù)結(jié)構(gòu)

利用的子程序相關(guān)的全程變量、局部變量的含義

調(diào)用時(shí)注意的問題

8.2程序塊注釋

數(shù)據(jù)結(jié)構(gòu)算法或欠理流程注意問題

8.3指令級注釋

語句功能實(shí)現(xiàn)技巧變量含義

以上三種注釋的重要性依次遞降,側(cè)重與序言性注釋和程序塊注釋。

9.注意事項(xiàng)及建議

9.1代碼執(zhí)行效率:

在編寫代碼時(shí)(特別是數(shù)據(jù)庫方面的代碼時(shí)),要考慮執(zhí)行效率。盡量避免使用

Table,DBGrid等與數(shù)據(jù)庫聯(lián)系緊密的控件。避免使用RecordCount之類影響執(zhí)行效率

的語句。在對數(shù)據(jù)庫進(jìn)行操作時(shí),盡量使用Query控件直接用SQL語句進(jìn)行操作。減少

全局變量的定義和使用。

9.2風(fēng)格的統(tǒng)一:

在設(shè)計(jì)界面時(shí),要保持風(fēng)格的統(tǒng)一性,使相類似界面的控件分布、窗體大小、字體

大小等方面要一致。提示信息時(shí)統(tǒng)一使用MessageBox()o提示信息和按鈕等要盡量遵

循Windows標(biāo)準(zhǔn)。提示信息要明確、友好。

9.3函數(shù)和過程:

若超過兩處的代碼要使用類似的功能模塊,要將該功能模塊設(shè)計(jì)為函數(shù)或過程。該

函數(shù)或過程的代碼至少要有一定的代碼數(shù)量,否則沒有必要并且會增加閱讀代碼的難度

。在程序中自定義的函數(shù)或過程不宜太多太大。

9.4異常處理:

在可能出現(xiàn)異常的地方要編寫代碼("y…Except)處理出現(xiàn)的異常,這樣會避免意

想不到的錯(cuò)誤。還可以對異常做進(jìn)一步處理。

9.5輸入的控制:

確定比較恰當(dāng)?shù)腡abOrder順序,在不用鼠標(biāo)的情況下也可以完成操作。在輸入時(shí),

要控制輸入的合法性(如數(shù)字),在輸入前就要加以控制以避免不合法的數(shù)據(jù)。

9.6支持多數(shù)據(jù)庫:

因?yàn)檐浖m用多數(shù)據(jù)庫,因此在代碼編寫時(shí)要注意盡量使用標(biāo)準(zhǔn)SQL語句,盡量

避免使用數(shù)據(jù)庫提供的函數(shù)。必要時(shí)按數(shù)據(jù)庫類型分情況處理。請參看附錄:多數(shù)據(jù)庫

支持分析。

附錄:

多數(shù)據(jù)庫支持分析

一、目的與任務(wù)

1、形成一套支持多數(shù)據(jù)庫的解決方案,在各細(xì)小的問題上都要力求清楚透徹,使程

序員在寫程序時(shí)有據(jù)可查。

2、提供訪問各數(shù)據(jù)庫的底層公用程序。

3、負(fù)責(zé)程序員開發(fā)過程中的數(shù)據(jù)庫問題咨詢。

4、檢查軟件對多數(shù)據(jù)庫的支持程度和效果,監(jiān)督程序員支持多數(shù)庫的開發(fā)過程。

二、支持的數(shù)據(jù)庫

1、MSSQLServer6.5

2、Oracle7.x

3、DB25.0

4、SybaseSQLServer11.5

5、SybaseSQLAnywhere5.5

三、對各數(shù)據(jù)庫的詳細(xì)分析

以下的分析內(nèi)容,是以SYBASE數(shù)據(jù)庫作為標(biāo)準(zhǔn)進(jìn)行比較的。因?yàn)槲覀兊某绦騿T對

SYBASE的各方面都很熟悉了,其他數(shù)據(jù)庫在各方面同SYBASE存在有哪些異同點(diǎn),對于不

同的方面如何變通實(shí)現(xiàn)等,是以下要主要分析解決的。

1、標(biāo)準(zhǔn)SQL語法列表(SQL92)

2、各數(shù)據(jù)庫SQL語句/子句之間的差別,如何實(shí)現(xiàn)相互替代或以標(biāo)準(zhǔn)語句實(shí)現(xiàn)。

SELECT:

SYBASE

SELECT[ALL|DISTINCT]select_list

[INTO[[database.]owner.]table_name]

[FROM[[database.]owner.]{table_name|view_name)[HOLDLICK]]

[WHEREsearch_conditions]

[GROUPBY[ALL]aggregates_free_expression[HAVINGsearch_conditions]]

[ORDERBY{[[database.]owner.]{table_name|viewname}}

column_nameIselect_list_numberexpression)"ASCIDESC]]

[COMPUTErow_aggregate(column_name)[rrow_aggregate

(column_name)]...

[BYcolumn_name[,column_name]...]]

[FORBROWSE]

其中:selectlist,

search_conditions,

ORACLE格式:

SELECT[ALL|DISTINCT]select_list

[INTO:variable]

[FROM[[database.]owner.]{tablename|viewname)]

[WHEREsearch_conditions]

[CONNECTBYcondition]

[GROUPBYexpression][HAVINGscarchconditions]

[{UNIONIINTERSECTIMINUS)SELECT-]

[ORDERBY{expression|position}[ASC|DESC]?,,]

[FORUPDATE[OF[table|view].column...]]

[NOWAIT]

其中:select」ist,

search_conditions,

MSSqlServer格式同Sybase格式:

DB2格式:

SELECT[ALL|DISTINCT]select_list

[FROM[owner.](tablename|viewname}]

[WHEREsearch_conditions]

[GROUPBY[ALL]aggregates_free_expression[HAVINGsearchconditions].

[ORDERBY{[owner.]{table_nameIview_name:}

column_nameIexpression)[ASCDESC]]

注:在SQL中不能用數(shù)據(jù)庫名,即一條SQL語名只能從一個(gè)數(shù)據(jù)庫中取數(shù)。

在DB2中不能使用"F_1=F_2+F_3”只能用"F_2+F_3ASF_l",所有規(guī)定在

SELECT語句中只用格式“F_2+F_3AsF_l”(尤其是在數(shù)據(jù)窗口中的計(jì)算列)。

INSERT:

INSERTINTO列1,列2...

{VALUES(值1,值2……))

INSERTINTO列1,列2{子查詢}

INSERTSSYBASE.ORACLE.MSSqlServer.DB2中是相同的。

UPDATE:

UPDATE用戶名。表名。列名。一

SET列名二表達(dá)式,列名二表達(dá)式。。。

[WHERE條件]

UPDATE用戶名。表名。列名。一

SET(列名,列名。。。)=(查詢)。。。

[WHERE條件]

UPDATE在SYBASE、ORACLE、MSSqlServer中是相同的;

UPDATE在DB2中沒有FROM子句,因此在UPDATE中只能通過子直詢來實(shí)現(xiàn)。

DELETE:

DELETE[FROM]用戶名。表名。別名

[WHERE條件]

DELETESSYBASE.ORACLE.MSSqlServer中是相同的;

DELETE在DB2中必須有FROM子句,因此在UPDATE中只能通過子直詢來實(shí)

3.Function之間的差別,用法,舉例,如何實(shí)現(xiàn)相互替代或以標(biāo)準(zhǔn)函數(shù)實(shí)現(xiàn)。

函數(shù)SybaseMsSqlOracleDB2

Server

系統(tǒng)函數(shù):

CoLnameCobjJd.colJd有

)

Col」ength("objname有

“/colname")

Datalength(expression有

)

Db_id([“db_name"])有

Db_name([db_id])有

Host_id()有

Host_name()有

Index_col(Mobjnamef,有

,index_id,key#)

Isnull(expression,value有

)

Object_id(Mobjname,,有

)

Object_name(obj_id)有

Suser_id(["loginname有

”])

Suser_namA([servpr_us有

er_id])

User_id([°namejn_db有

“】)

User_name([user_id])有

數(shù)學(xué)函數(shù):

Abs(n)有有有有

Floor(n)有有有有

Power(m,n)育有育有

Round()有有有有

Sign(n)有有有有

Sqrt(n)有有有有

Ceiling(n)有有自定義有

ceiling(n)

字符串函數(shù):

Ascii(char_expr)有有有有

Ltrim(char_expr)有有函數(shù)多了一個(gè)參有

數(shù),Ltrim(char_e

xpr,[/sef])f

set省略時(shí),表示

刪除左邊空格

Rtrim(char_expr)有有函數(shù)多了一個(gè)參

數(shù),Rtrim(char_

expr,[;sef])

,set省略時(shí),表

示刪除右邊空格.

Char(n)有有Chr(n)有

Datalength(/string,)有有自定義自定義

Datalength('sDatalength(,str

tringf)ing')

Charindex('sub'p有有自定義自定義

Charindex('subCharindex('sub'

arenf)

'.'parent'),'parent*)

Patindex(,f%pattern%有有自定義patindex自定義patindex

('sub','pare('sub'parent

.expression)

nt'),)

不可用通配符不可用通配符

Replicate(char_expr,int有有自定義自定義Replicate()

eger_expr)Replicate()

Space(integer_expr)有有自定義Space。有

Right(char_expr,intege有有自定義right。有

r-expr)

Str(float_expr[,length[,有有可用可用cast(double

To_char(numberasvarcharO)代替

dccima]])

)

代替

Stuff(char_exprl,start.l有有可用Replace自定義

(*Parent','

ength,char_expr2)Stuff(char_exprl

find,replac

startjength,cha

e,)r

r_expr2)

代替

Sub

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論