Delphi代碼標準文檔

Delphi代碼標準文檔

Revision 1.0.0.5

編者:Riceball([email protected])

 

  本文主要基於“Delphi Development Guide”一書的代碼標準部分而來,編者參考其它的Delphi代碼標準規範,以及結合現目前Delphi社區中流行的程序書寫慣例,作了一些修改和裁剪,你也可以根據自己的需要進行裁剪和修改。如果你有什麼建議,或是希望編者加上你認爲遺漏的東西,歡迎Email至:[email protected]

 

目錄

Delphi代碼標準文檔......................................................................................................... 1

目錄................................................................................................................................. 1

1     前言.......................................................................................................................... 2

2     源程序書寫規範........................................................................................................ 2

2.1          通用源代碼格式規則................................................................................... 2

2.2          Object Pascal語句格式語句書寫規範與用法................................................. 3

3     命名規範................................................................................................................... 8

3.1          過程(Procedure)與函數(Function)................................................................. 8

3.2          變量(Variable).............................................................................................. 9

3.3          類型(Type).................................................................................................. 9

3.3.1       一般類型.............................................................................................. 9

3.3.2       構造類型.............................................................................................. 9

3.3.3       類類型(Class)..................................................................................... 10

3.3.4       元件類型............................................................................................ 11

3.3.5       窗體與對話框類型.............................................................................. 13

3.3.6       數據模塊類型..................................................................................... 15

3.4          文件.......................................................................................................... 16

3.4.1       項目文件............................................................................................ 16

3.4.2       窗體文件............................................................................................ 16

3.4.3       數據模塊文件..................................................................................... 17

3.4.4       遠程數據模塊文件.............................................................................. 17

3.4.5       單元文件............................................................................................ 17

4     源程序文檔註釋規範............................................................................................... 19

5     Delphi代碼自動格式化工具...................................................................................... 22

6     代碼標準文檔更新................................................................................................... 23

7     參考........................................................................................................................ 23

 

1       前言

  本文檔主要是爲Delphi開發人員提供一個源代碼書寫標準,以及程序和文件的命名標準,使他們在編程時有一致格式可遵循。這樣,每個編程人員編寫的代碼能夠被其他人理解。

 

本文檔還沒能包括代碼標準的每個細節,因此你可以在下面網址留意本文檔的最新版本:

http://dev.cq118.com/web/

 

  本文檔不包含用戶界面標準。用戶界面標準是獨立於其他標準的,並且同樣是重要的。

 

  如果你有什麼建議,或是希望編者加上你認爲遺漏的東西,歡迎Email至:[email protected]

 

 

--------------------------------------------------------------------------------

 

2       源程序書寫規範

2.1    通用源代碼格式規則

1)        縮進

  縮進就是每級間有兩個空格。不要在源代碼中放置製表符。這是因爲,製表符的寬度隨着不同的設置和代碼管理實用程序(打印、文檔及版本控制等)而不同。

 

  通過使用Tools|Environment 菜單,在Environment Options 對話框的General頁上,不要選中Use Tab Character Optional Fill 複選框,這樣,製表符就不會被保存。

 

2)        邊距

  邊距設置爲80個字符。源代碼一般不會因寫一個單詞而超過邊距,但本規則比較靈活。只要可能,長度超過一行的語句應當用逗號或運算符換行。換行後,應縮進兩個字符。

 

3)        begin...end 語句

begin 語句必須單獨佔一行。例如,下面第一行是錯誤的,而第二行正確:

 

for i:=0 to 10 do begin // , begin f o r 在同一行

 

for i:=0 to 10 do // , begin 在另外一行中

begin

 

本規則的一個特殊情況是,當begin else 語句的一部分時,例如:

 

if some statement = then

begin

  . . .

end

else begin

  Some Other Statement;

end;

 

注意:end 語句總單獨一行。當begin 不爲else 語句的一部分時,相應的end 語句與begin 語句的縮進量相同。

 

4)        註釋

  我們通常使用“{...}”類型的塊註釋,以前的“(*...*)”類型的塊註釋用於臨時註釋掉暫不使用的代碼,從Delphi 2開始支持“//”行註釋,如果決定不在支持Delphi 2.0以下的版本,可以使用“//”註釋。

 

2.2    Object Pascal語句格式語句書寫規範與用法

1)        括號

  在左括號與下一字符之間沒有空格。同樣,右括號與前一字符也沒有空格。下面的例子演示了正確與不正確的空格。

 

CallProc( Aparameter ); // !

CallProc(Aparameter); // 正確!

 

  不要在語句中包含多餘的括號。在源代碼中,括號只有在確實需要時才使用。下面的例子演示了正確與不正確用法:

 

if (I=42) then // 錯,括號是多餘的

if (I=42) or (J=42) then // 正確,必須使用括號

 

2)        保留字和關鍵字

  Object Pascal 語言的保留字和關鍵字總是完全的小寫。下面是Delphi 5保留字列表:

and

array

as

asm

begin

case

class

const

constructor

destructor

dispinterface

div

do

downto

else

end

except

exports

file

finalization

finally

for

function

goto

if

implementation

in

inherited

initialization

inline

interface

is

label

library

mod

nil

not

object

of

or

out

packed

procedure

program

property

raise

record

repeat

resourcestring

set

shl

shr

string

then

threadvar

to

try

type

unit

until

uses

var

while

with

xor

private

protected

public

published

automated

 

 

 

3)        過程和函數

(1). 格式

  過程名應當以大寫字母開始,且大小寫交錯以增加可讀性。下面是一個不正確的寫法:

 

procedure thisisapoorlyformattedroutinename;

 

改成這樣寫就對了:

 

procedure ThisIsMuchMoreReadableRoutineName;

 

(2). 形參

(1) 格式

  只要可能,同一類型的形參應當歸併在一起:

 

procedure Foo(Param1,Param2,Param3:Imteger;Param4:string);

 

(2) 參數順序

  形參的順序主要要考慮寄存器調用規則。最常用的參數應當作爲第一個參數,按使用頻率依次從左到右排。輸入參數位於輸出參數之前。範圍大的參數應當放在範圍小的參數之前。例如:

 

SomeProc(aPlanet, aContinent, aCountry, aState, aCity).

 

  有些則例外。例如,在事件處理過程中,TObject 類型的Sender 參數往往是第一個要傳遞的參數。

 

(3) 常量參數

  要使記錄、數組、短字符串或接口類型的參數不能被過程修改,就應當把形參標以Const 。這樣,編譯器將以最有效的方式生成代碼,保證傳遞的參數不可變。

 

  如果其他類型的參數希望不被過程所修改,也可以標上Const 。儘管這對效率沒有影響,但這給過程的調用者帶來了更多的信息。

 

4). 變量

(1). 局部變量

  局部變量用於過程內部,果需要的話,應當在過程的入口處立即初始化變量。局部的AnsiString 類型的變量自動被初始化爲空字符串,局部的接口和dispinterface類型的變量自動被初始化爲nil,局部的VariantOleVariant類型的變量自動被初始化爲Unassigned

 

(2). 全局變量

  一般不鼓勵使用全局變量。不過,有時候需要用到。即使如此,也應當把全局變量限制在需要的環境中。例如,一個全局變量可能只在單元的實現部分是全局的。

 

  全局數據如果將由許多單元使用,就應移動到一個公用單元裏被所有對象使用。全局數據可在聲明時直接初始化爲一個值。注意,所有全局變量自動進行零初始化,因此,不要將全局變量初始化爲諸如0 nil、或Unassigned等空值。零初始化的全局變量在.EXE文件中不佔空間。零初始化的數據保存在虛擬的數據段中,而虛擬數據段只在應用程序啓動時才分配內存。非零初始化的全局數據則在.EXE文件中佔空間。

 

5). 類型

(1). 大小寫規則

  類型標識符是保留字,應當全部小寫。Win32 API 類型常常全部大寫,並且遵循諸如Windows.pas或其他API單元中關於特定類型名的規則。對於其他變量名,第一個字母應大寫,其他字母則大小寫交錯。下面是一些例子:

 

var

  MyString: string; // 保留字

  WindowsHandle: HWND; // Win32 API 類型

  I: Integer; //System單元中引入的類型標識

 

(2). 浮點型

  不鼓勵使用Real類型,因爲它只是爲了與老的Pascal代碼兼容而保留的。通常情況下,對於浮點數應當使用DoubleDouble可被處理器優化,是IEEE定義的標準的數據格式。當需要比Double提供的範圍更大時,可以使用ExtendExtendintel專用的類型,Java不支持。當浮點變量的物理字節數很重要時(可能使用其他語言編寫DLL),則應當使用Single

 

(3).VariantOleVariant

  一般不建議使用VariantOleVariant。但是,當數據類型只有在運行期才知道時(常常是在COM和數據庫應用的程序中),這兩個類型對編程就有必要。當進行諸如自動化ActiveX控件的COM編程時,應當使用OleVariant;而對於非COM編程,則應當使用Variant。這是因爲,Variant能夠有效地保存Delphi的原生字符串,而OleVariant則將所有字符串轉換爲OLE字符串(WideChar字符串),且沒有引用計數功能。

 

6). 語句

(1). If 語句

  if/then/else語句中,最有可能執行的情況應放在then子句中,不太可能的情況放在else子句中。爲了避免出現許多if語句,可以使用case語句代替。如果多於5級,不要使用if語句。請改用更清楚的方法。不要在if語句中使用多餘的括號。

 

  如果在if語句中有多個條件要測試,應按照計算的複雜程度從右向左排。這樣,可以使代碼充分利用編譯器的短路估算邏輯。例如,如果Condition1Condition2快,Condition2Condition3快,則if語句一般應這樣構造:

 

if Condition1 and Condition2 and Condition3 then

 

  如果Condition3False的機會很大,利用短路估算邏輯,我們也可以將Condition3放在最前面:

 

if Condition3 and Condition1 and Condition2 then

 

(2). case 語句

(1) 概述

  case語句中每種情況的常量應當按數字或字母的順序排列。每種情況的動作語句應當簡短且通常不超過4 - 5 行代碼。如果動作太複雜,應將代碼單獨放在一個過程或函數中。Case語句的else子句只用於默認情況或錯誤檢測。

 

(2) 格式

  case語句遵循一般的縮進和命名規則。

 

(3). while 語句

  建議不要使用Exit過程來退出while循環。如果需要的話,應當使用循環條件退出循環。所有對while循環進行初始化的代碼應當位於while入口前,且不要被無關的語句隔開。任何業務的輔助工作都應在循環後立即進行。

 

(4). for 語句

  如果循環次數是確定的,應當用for語句代替while語句。

 

(5). repeat 語句

  repeat語句類似於while循環,且遵循同樣的規則。

 

(6). with 語句

(1) 概述

  with語句應小心使用。要避免過度使用with語句,尤其是在with語句中使用多個對象或記錄。例如:

 

with Record1,Record2 do

 

  這些情況很容易迷惑編程人員,且導致調試困難。

 

(2) 格式

  with語句也遵循本章關於命名和縮進的規則。

 

7). 結構化異常處理

(1). 概述

  異常處理主要用於糾正錯誤和保護資源。這意味着,凡是分配資源的地方,都必須使用try...finally來保證資源得到釋放。不過,如果是在單元的初始/結束部分或者對象的構造器/析構器中來分配/釋放資源則例外。

 

(2). try...finally的用法

  在可能的情況下,每個資源分配應當與try...finally結構匹配,例如,下面代碼可能導致錯誤:

 

SomeClass1 := TSomeClass.Create;

SomeClass2 := TSomeClass.Create;

try

  { do some code }

finally

  SomeClass1.Free;

  SomeClass2.Free;

end;

 

  上述資源分配的一個安全方案是:

 

SomeClass1 := TSomeClass.Create;

try

  SomeClass2 := TSomeClass.Create;

  try

    { do some code }

  finally

    SomeClass2.Free;

  end;

finally

  SomeClass1.Free;

end;

 

  但有時如果有許多類都需要同時創建,上述方案就顯得非常累贅。這時候,我建議使用下述的一個安全方案:

 

SomeClass1 := nil;

SomeClass2 := nil;

SomeClass1 := TSomeClass.Create;

SomeClass2 := TSomeClass.Create;

try

  { do some code }

finally

  FreeAndNil(SomeClass1);

  FreeAndNil(SomeClass2);

end;

 

(3). try...except的用法

  如果你希望在發生異常時執行一些任務,可以使用try...except。通常,沒有必要爲了簡單地顯示一個錯誤信息而使用try...except,因爲Application對象能夠自動根據上下文做到這一點。如果要在子句中激活默認的異常處理,可以再次觸發異常。

 

(4). try...except...else的用法

  不鼓勵使用帶else子句的try...except,因爲這將阻塞所有的異常,包括你沒有準備處理的異常。

 

3       命名規範

3.1    過程(Procedure)與函數(Function)

1).命名

  過程與函數名應當有意義。進行一個動作的過程最好在名稱前加上表示動作的動詞爲前綴。例如:

 

procedure FormatHardDrive;

 

  設置輸入參數值的過程名應當以Set 爲其前綴,例如:

 

procedure SetUserName;

 

  獲取數值的過程名應當以Get 爲其前綴,例如:

 

function GetUserName:string;

 

2).形參

  所有形參的名稱都應當表達出它的用途。如果合適的話,形參的名稱最好以字母a 爲前綴,例如:

 

procedure SomeProc(aUserName:string; aUserAge:integer);

 

  當參數名與類的特性或字段同名時,前綴a 就有必要了。

 

3).命名衝突

  當兩個單元中含有相同名稱的過程時,如果調用該過程,實際被調用的是Uses 子句中較後出現的那個單元中的過程。爲避免這種情況,可在方法名前加想要的單元名,例如:

 

SysUtils.FindClose(SR);

 

Windows.FindClose(Handle);

 

3.2    變量(Variable)

3.2.1      變量命名及格式

首先所有變量必須起有意義的名字,使其它組員可以很容易讀懂變量所代表的意義,變量命名可以採用同義的英文命名,可使用幾個英文單詞,但每一單詞的首字母必須大寫。例如:

var

  WriteFormat:string

同時對於一些特定類型可採用一定的簡寫如下:

指針類型

 P

紀錄類型

 Rec

數組類型

 Arr

 Class

循環控制變量通常使用單一的字符如:i, j, k 另外使用一個有意義的名字例如:UserIndex ,也是准許的。

  布爾變量名必須能清楚表示出True False 值的意義。

 

3.2.2      局部變量

  局部變量遵循其他變量的命名規則。

 

3.2.3      全局變量

儘量不使用全局變量,如必須使用全局變量則必須加前綴‘g’,同時應在變量名稱中體現變量的類型。例如:
  gprecUserCount: point;//
名稱爲UserCount的全局變量,其類型爲指向一結構的指針
但是在模塊內部可以使用全局變量。所有模塊內全局變量必須用‘F’爲前綴。如果幾個模塊之間需要進行資料交換,則需要通過聲明屬性的方法來實現。例如:
type
  TFormOverdraftReturn = class(TForm)
  private
   { Private declarations }
   FuserName: string;
   FuserCount: Integer;
   Procedure SetUserName(Value: string);
   Function GetUserName: string;
  public
   { Public declarations }
   property UserName: string read GetUserName write SetUserName;
   property UserCount: Integer read FuserCount write FuserCount;
  end;

3.3    類型(Type)

3.3.1      大小寫協議

保留字的類型名稱必須全部小寫。Win32 API 的類型通常全部大寫,對於其它類型則首字母大寫,其餘字母小寫,例如:

var

  MyString: string;   // reserved word

  WindowHandle: HWND; // Win32 API type

  I: Integer;    // type identifier introduced in System unit

3.3.2      一般類型

1). 枚舉型

  枚舉類型名必須代表枚舉的用途。名稱前要加T字符作爲前綴,表示這是個數據類型。枚舉類型的標識符列表的前綴應包含2 - 3個小寫字符,來彼此關聯。例如:

 

TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);

 

  枚舉類型的變量實例的名稱與類型相同,但沒有前綴T ,也可以給變量一個更加特殊名稱,諸如:FavoriteSongTypelFavoriteSongType2等等。

 

3.3.3      構造類型

1). 數組類型

  數組類型名應表達出該數組的用途。類型名必須加字母“T”爲前綴。如果要聲明一個指向數組類型的指針,則必須加字母P 爲前綴,且聲明在類型聲明之前。例如:

 

type

  PCycleArray = ^TCycleArray;

  TCycleArray=array[1..100] of integer;

 

實際上,數組類型的變量實例與類型名稱相同,但沒有“T”前綴。

 

2). 記錄類型

  記錄類型名應表達出記錄的用途。類型名必須加字母T爲前綴。如果要聲明一個指向記錄類型的指計,則必須加字母P爲前綴,且其聲明在類型聲明之前。例如:

 

type

  PEmployee = ^TEmployee;

  TEmployee = record

    EmployeeName: string;

    EmployeeRate: Double;

  end;

 

3.3.4      (Class)

1). 命名與格式

  類的名稱應當表達出類的用途。一般的類名前要加字母“T”,如果是接口類那麼類名前要加“I”,錯誤異常類的類名前要加“E”,而類引用類型(Class-reference type)則要在類名後加“Class”,抽象類一般是在類名前還要加“Custom”。例如:

 

type

  TCustomCipher = class(TObject);

  TCipher = class(TCustomCipher);

  ICipher = interface;

  TCipherClass = class of TCustomer

  ECipherException = class(Exception);

 

  類的實例名稱通常與類名相同,只不過沒有前綴“T”。

 

var

  Customer: TCustomer;

 

注意:關於元件的命名,請參閱“元件類型”。

 

2).字段

(1) 命名與格式

  字段的命名遵循與變量相同的規則,只不過要加前綴F ,表示這是字段。

 

(2) 可見性

  所有字段必須爲私有。如果要在類的作用域之外訪問字段,可藉助於類的屬性來實現。

 

3).方法

(1) 命名與格式

  方法的命名遵循與過程和函數相同的規則。

 

(2) 靜態方法

  當你不希望一個方法被派生類覆蓋時,應當使用靜態方法。

 

(3) 虛擬方法(virtual)與動態方法(dynamic)

  當你希望一個方法能被派生類覆蓋,應當使用虛擬方法(virtual)。如果類的方法要被多個派生類直接或間接地使用,則應當用動態方法(dynamic)。例如,某一個類含有一個被頻繁覆蓋的方法,並有100個派生類,則應將方法定義爲動態的,這樣可以減少內存的開銷。

 

(4) 抽象方法(abstract)

  如果一個類要創建實例,則不要使用抽象方法。抽象方法只能在那些從不創建實例的基類中使用。

 

(5) 屬性訪問方法

  所有屬性訪問方法應當定義在類的私有或保護部分。屬性訪問方法遵循與過程和函數相同的規則。用於讀的方法應當加“Get”前綴,用於寫的方法應當加“Set”前綴,並且有一個叫Value的參數,其類型與屬性的類型相同。例如:

 

TSomeClass = class(TObject)

private

FSomeField: Integer;

protected

function GetSomeField: Integer;

procedure SetSomeField(Value: Integer);

public

property SomeField: Integer read GetSomeField write SetSomeField;

end;

 

  儘管不是必須,但還是建議你使用寫訪問方法來訪問代表私有字段屬性。

 

4).屬性

  屬性作爲私有字段的訪問器,遵循與字段相同的命名規則,只不過沒有F前綴。屬性名應爲名詞,而不是動詞。屬性是數據,而方法是動作。數組屬性名應當是複數,而一般的屬性應當是單數。

 

3.3.5      元件類型

1). 元件類型的命名標準

  元件的命名與類的命名類似,只不過當它與其它元件名稱衝突時,你可以加上3個字符的前綴,用以標識公司、個人或其他實體。例如,一個時鐘元件可以這樣聲明:

 

TddgClock = class(TComponent)

 

注意,作爲前綴的3 個字符要小寫。

 

2). 元件實例的命名規則

  元件實例的名稱應當能夠描述其實際意義,這裏命名規則使用了一個變更的匈牙利前綴命名規範。使用前綴而不使用後綴的原因是在搜尋時,在對象檢查器和代碼探索器中搜尋構件的名字比搜尋構件的類型更容易。在這個標準中,元件實例名包括兩個部分:前綴和性質標識名。

 

(1). 元件的前綴

  元件的前綴多是表現元件類型的字母縮寫。參見下面表中的元件前綴:

 

元件類名 元件前綴

TActionList, TAction表示動作的列表項 act

TButton, TSpeedButton, TBitBtn等所有的按鈕類 btn

TCheckBox, TDBCheckBox等所有的檢查框 chk

TRadioButton單選按鈕類 rdo

TToolBar工具條 tb

TMainMenu所有的主菜單類 mm

TMainMenuItem所有的菜單項類 mi

TPopupMenu所有的彈出式菜單類 pm

TPopupMenuItem所有的彈出式菜單項類 pmi

TLabel, TStaticText等所有用來顯示的標籤類 lbl

TPanel等所有的面板類 pnl

TPageControl等所有的頁式控件類 pgc

TEdit, TMaskEdit等所有的單行編輯框類 edt

TMemo, TRichEdit等所有的多行編輯框類 mmo

TDrawGrid, TStringGrid等所有的網格類 grd

TAnimate等所有的動畫類 ani

TImageList等所有的圖片列表類 il

TImage等圖片類 img

TChart圖表類 cht

TComboBox, TDBComboBox等所有的下拉式列表框類 cbo

TListBox, TDBList等所有的列表框類 lst

TTreeView tv

TListView lv

THotKey hk

TSplitter等所有的分隔符類 spt

TOpenDialog等所有的對話框元件類 dlg

TTable等所有的數據表類 tbl

TQuery等所有的SQL查詢類元件 qry

TClientDataSet所有的客戶數據集元件 cds

TDataSource ds

TDatabase db

TSockConnection,TDCOMConnection等連接元件類 con

TQuickRep, TFastReport等所有的報表元件類 rpt

TDDEClientConv,TDDEClientItem等所有的DDE元件類 dde

TMonthCalendar等所有的日曆類 cal

TGroupBox等控件類 grp

 

  如上所示,元件類型前綴是從分析描述元件的類型性質而來的。通常情況下,下面的規則描述如何定義一個元件類型前綴:

 

從元件類型名中移去T前綴。例如TButton變成Button

除了第一個元音,刪去所有元音字母。例如,Button變成bttnEdit變成edt

壓縮雙字母。例如,bttn變成btn

如發生衝突,則在某一元件前綴中加入一個元音。例如在TBatton元件的前綴中加入元音變爲batn,以區別TButton的前綴。

不過,上述規則首先得保證前綴名稱必須符合習慣,做到見名知意,如:TDDEClientConv控件的前綴就是一個例外。

注意:元件的前綴是爲了表示出元件的類型,是按鈕,還是標籤等等,因此沒有必要爲每一個特別元件類建立一個元件前綴,如: TMyButton的元件前綴仍爲btn

 

(2). 元件性質標識名

  元件性質標識名是元件意圖的描述。例如,一個用於關閉窗體的TButton元件實例可命名爲btnClose。一個編輯姓名的元件實例可命名爲edtName

 

3.3.6      窗體與對話框類型

1). 窗體類型的命名標準

  窗體或對話框類型的名稱應當表達出窗體的用途,如果是窗體要加“Tfrm”前綴,如果是對話框要加“Tdlg”,後跟描述性名。例如,About窗體類型名稱爲:

 

TfrmAbout = class(TForm)

 

主窗體的類型名稱爲:

 

TfrmMain = class(TForm)

 

客戶登錄窗體的類型名稱爲:

 

TfrmCustomerEntry = class(TForm)

 

登陸對話框的類型名稱爲:

 

TdlgLogin = class(TForm)

 

2). 窗體實例的命名標準

  窗體實例的名稱與相應的類型名稱相同,但沒有前綴T 。例如,前面提到的窗體類型與實例的名稱爲:

 

類型名 實例名

TfrmAbout frmAbout

TfrmMain frmMain

TfrmCustomerEntry frmCustomerEntry

TdlgLogin dlgLogin

 

3). 自動創建的窗體

  除非特別原因,只有主窗體才自動生成。其他所有窗體必須從Project Options對話框的自動生成列表中刪除。更進一步信息,請參閱後面幾節。

 

4). 模式窗體實例化函數

  所有窗體單元都應當含有實例化函數,用於創建、設置、模式顯示和釋放窗體。這個函數將返回由窗體返回的模式結果。傳遞給這個函數的參數遵循參數傳遞的規則。之所以要這樣封裝,是爲了便於代碼的重用和維護。

 

  窗體的變量應當從單元中移走,改在窗體實例化函數中作爲局部變量定義(注意,要求從Project Options對話框的自動生成列表中移走該窗體。請看前面的內容。

 

例如,下面的單元文件演示了GetUserData的實例化函數。

 

Unit UserDataFrm;

 

Interface

 

Uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

Type

 

  TfrmUserData = class(TForm)

    edtUserName: TEdit;

    edtUserID: TEdit;

  private

  { Private declarations }

  public

  { Public declarations }

  end;

 

function GetUserData(var aUserName: String;var aUserID: Integer): Word;

 

implementation

 

{$R *.DFM}

 

function GetUserData(var aUserName: String;var aUserID: Integer): Word;

var

  frmUserData: TfrmUserData;

begin

  frmUserData := TfrmUserData.Create(Application);

  frmUserData.Caption:='Getting User Data' ;

  Result : = frmUserData.ShowModal;

  if Result=mrOK then

  begin

    aUserName := frmUserData.edtUserName.Text;

    aUserID := StrToInt(frmUserData.edtUserID.Text);

  end;

  finally

    frmUserData.Free;

  end;

end;

 

End.

 

5).窗體框架與複合窗體

  如果一個窗體結構過於複雜,就必須將其分化成爲一個主窗體框架以及嵌入到主窗體框架的若干子窗體框架。如:

 

TfrmMainFrame: TfrmInfoFrame,TfrmEditorFrame

 

  使用窗體框架,主要是爲了解決界面和代碼複用問題,以及提高單元代碼的內聚力(劃分後,每一個窗體框架爲一個獨立單元),從而提高軟件工程質量。你必須提煉出界面關聯代碼(可複用的)和應用關聯代碼(不能複用的)。

 

3.3.7      數據模塊類型

1). 數據模塊的命名標準

  數據模塊類型名稱應表達出它的用途,且要加前綴“Tdm”,後跟描述性名稱。例如,Customer數據模塊的類型名稱爲:

 

TdmCustomer = class(TDataModule)

 

Orders 數據模塊的類型名稱爲:

 

TdmOrder = class(TDataModule)

 

2). 數據模塊實例的命名標準

  數據模塊實例的名稱應當與相應的類型名稱相同,但沒有前綴T 。例如,前面的數據模塊類型、實例名稱如下:

 

類型名稱 實例名

TdmCustomer dmCustomer

TdmOrder dmOrder

 

3.4    文件

  建議在所有源文件、項目文件和單元文件使用結構化的文件頭信息。一個文件頭至少應包含以下信息:

 

{

Copyright @ Year by Authors

}

 

  詳細說明,請參閱:單元文件註釋文檔格式。

 

3.4.1      項目文件

1)        項目目錄結構

程序主目錄--Bin(應用程序所在路徑)

          -Db(本地數據庫所在路徑)

          -Doc(文檔所在路徑)

          -Hlp(幫助文件所在路徑)

           -Backup(備份路徑)

           -Tmp(臨時文件路徑)

2)        命名

  項目文件的名稱應當具有描述意義。例如,“The Delphi 5 Developers Guide Bug Manager ”的項目名稱爲DDGBugs.dpr,一個系統信息程序的名稱爲SysInfo.dpr

3.4.2      窗體文件

  窗體文件的名稱應當表達出窗體的用途,且具有Frm後綴。類名叫frmXx,文件名叫XxFrm.dfm。例如,About窗體的類名叫frmAbout,文件名叫AboutFrm.dfm;主窗體的類名叫frmMain,文件名叫MainFrm.dfm

 

3.4.3      數據模塊文件

  數據模塊文件的名稱應當表達出數據模塊的作用,且具有DM後綴。例如,Customers數據模塊的文件名叫CustomersDM.dfm

 

3.4.4      遠程數據模塊文件

  遠程數據模塊文件的名稱應當表達出遠程數據模塊的用途。名稱後要加RDM後綴。例如,Customers遠程數據模塊的文件叫CustomersRDM.dfm

 

3.4.5      單元文件

1)        普通單元

(1) 單元名

  單元的名稱應當有描述性。例如,應用程序的主窗體單元叫MaimFrm.pas

 

(2) Uses 子句

  Interface部分的Uses子句應當只包含該部分需要的單元。不要包含可能由Delphi自動添加的單元名。Implementation部分的Uses子句應當只包含該部分需要的單元,不要有多餘的單元。

 

(3) Interface 部分

  Interface部分應當只包含需要被外部單元訪問的類型、變量、過程與函數的聲明。而且,這些聲明應當在Implementation部分之前。

 

(4) Implementation 部分

  Implementation部分包括本單元私有的類型、變量、過程與函數的實現。

 

(5) Initialization 部分

  不要在Initialization部分放置花費時間很多的代碼。否則,將導致應用程序啓動時顯得很慢。

 

(6) Finalization 部分

  確保釋放所有在Initialization部分中分配的資源。

 

2)        窗體單元

  窗體單元文件的名稱與相應的窗體名稱相同,只是要將前綴變成後綴。例如,About窗體的單元名稱叫AboutFrm.pas。主窗體的單元文件名稱叫MainFrm.pas

 

3)        數據模塊單元

  數據模塊單元文件的名稱與相應的數據模塊名稱相同。例如,數據模塊單元的名稱叫CustomersDM.pas

 

4)        通用單元

  通用單元是用於存放函數庫,一般類型,或常量而非元件的單元。通用單元的名稱應當表達出它的用途,名稱前要加“u”前綴。例如,一個實用調試工具單元的名稱叫uDebugUtilities.pas,包含全局變量的單元名稱叫uCustomerGlobals.pas

 

注意,一個項目中單元名稱必須是唯一的。通用單元名不能重名。

 

5)        元件單元

(1). 命名

  元件單元應放在單獨的路徑中,以表明它們是定義元件的單元。它們一般與項目不放在同一路徑下。單元文件名稱應表達出其內容。

 

注意,有關元件命名標準的更多信息,請參閱“元件類型的命名標準”。

 

  元件單元只能含有一個主要元件,這是指出現在元件選項板上的元件。其他輔助性的元件或對象也可以包含在同一單元中。

 

(2). 註冊單元

  元件的註冊過程應當從元件單元中移走,放在一個單獨的單元中。這個註冊單元用於註冊所有元件、屬性編輯器、元件編輯器、嚮導等。

 

  元件註冊應當在設計期包中進行。因此,註冊單元應當包含在設計期包而不是運行期包中。建議註冊單元這樣命名:

 

xxxReg.pas

 

其中,xxx字符前綴,以標識元件包名稱或公司、個人、其他實體。例如,註冊單元命名爲xxxReg.pas

 

6)        包文件(.dpk)命名規則

(1). 運行期包與設計期包

  運行期包中應當只包含所需要的單元。那些屬性編輯器和元件編輯器的單元應當放在設計期包中。註冊單元也應當放在設計期包中。

 

(2). 文件命名標準

  包的命名遵循下列模式:

 

dcliiiDescvvCn.pkg —設計期包

iiiDescvvCn.pkg    —運行期包

 

  其中,iii代表一個2-3字符的前綴,用於標識公司、個人或其他需要標識的事情,也可不要;Desc表示該控件包的簡短描述;vv代表包的版本號,你可以根據需要取捨;前綴“dcl”表示設計期包,沒有該前綴表示運行期包;字母“Cn”表示編譯器類型與編譯器版本號,如:Delphi5=D5, Delphi4=D4, CBuilder3=C3...

 

注意包名稱中的libstd分別表示這是設計期包還是運行期包。例如:

 

dclrbStdCompsD5.pkg Delphi 5的設計期包

rbStdCompsD5.pkg     Delphi 5的運行期包

4       源程序文檔註釋規範

我們將通過文檔(源程序文件聯機註釋)定義標準的Delphi 類(函數等)的概要設計規範(official Delphi Class API Specification),以及定義Delphi 類(函數等)的編程指南手冊。因此,我們可以以兩種方式來寫程序文檔(註釋),一是作爲概要設計的規範,二是作爲編程手冊。兩種程序文檔既有差別,又有它們共同的地方,因此,它們可以同時寫在源程序文檔註釋中,它們兩者的差別在下面有說明。

 

編寫 Delphi 概要設計規範

 

TODO: <>

 

編寫編程指南文檔

 

在概要設計規範的基礎上,增加了教程,例子程序,等等,並對目錄結構進行了重新設計組織和整理。

 

註釋文檔的一般規範

註釋位置

 

爲源程序的相關元素添加文檔註釋很簡單,你只需要將註釋放在元素的聲明(Interface)部分(如果是接口函數或類方法)或實現(implementation)部分(如果是私有函數)。例如:

 

(for Object Pascal)

 

   { The Sort function sorts the list.}

   function MyList.Sort(Options: Integer): BOOLEAN;

   begin

     [...]

   end;

(for C++)

 

   // The Sort function sorts the list.

   bool MyList::Sort(int Options)

   {

     [...]

   }

註釋塊

 

註釋塊是由一系列的沒有被空行分開的單行註釋構成的,下面就是一個註釋塊:

   // This is the first sentence.

   // This is the second,

   // and this the third

而下面的註釋則是兩個註釋塊,因爲它們之間有一個空行把它們分開了:

 

   // This is the first sentence.

 

   // This is the second,

   // and this the third

許多文檔註釋分析工具(如:Doc-O-Matic)會將註釋塊內的所有的句子自動連接在一起,形成一文字段落,如:

 

   // This is the first sentence.

   // This is the second,

   // and this the third

經過分析工具生成的文檔文本爲:

 

   This is the first sentence. This is the second, and this the third.

忽略文檔註釋

 

當註釋行前用“##”開頭時,該行註釋將被文檔註釋分析工具忽略,該行不會生成到文檔中。如:

 

   //## This line will be ignored.

包含有如下標識符的註釋塊也不會被生成到文檔中去:

 

"Ignore Text", "$Log", "$Filename", "$Revision", "$Date", "$Author", "$History", "$Id"

 

單元文件註釋文檔格式

用於描述該單元的用途,作者,功能。放於單元文件的最前面:

 

{

  ##Unit Name: %UNIT%

  ##Initial Date: %DATE%

  Summary

    該單元的摘要說明。

 

  Description

    該單元的詳細說明。

 

  See Also

    參閱

 

  Bugs

    已知問題。

 

  Internal

    內部開發人員參閱,不會對外。

 

  TODO

    待作事項。

 

  Author

    Riceball LEE([email protected])

    Riceball LEE([email protected])

 

  Copyright

    Copyright(C) %YEAR% by Riceball LEE

 

  Current Version

    當前版本號

 

  History

    版本歷史。

}

 

 

unit xxx;

 

函數(屬性)的註釋文檔格式

{

  ##Procedure: %PROCNAME%

  ##Date:      %DAY%-%MONTHSHORTNAME%-%YEAR%

  Summary

    該函數(屬性)的摘要說明。

 

  Parameters

    %ARGUMENTS%

 

  Returns

    %RESULT%

 

  Conditions

    調用該方法(函數)可能需要的條件

 

  Exceptions

    該方法(函數)有可能觸發的異常。

 

  Description

    該函數(屬性)的詳細說明。

 

  See Also

    參閱

 

  Bugs

    已知問題。

 

  Internal

    內部開發人員參閱,在正式發佈的文檔中不會發布。

 

  TODO

    待作事項。

 

  Author

    Riceball LEE([email protected])

    Riceball LEE([email protected])

 

  Copyright

    Copyright(C) %YEAR% by Riceball LEE

 

  Current Version

    當前版本號

 

  History

    版本歷史。

}

 

function xxx;

 

5       Delphi代碼自動格式化工具

儘管大多數的代碼自動格式化工具能夠幫你重排源程序格式,以及更新保留字和標示符的大小寫,但是這最好在使用版本控制前進行,如果你已經使用了版本控制,建議你不要輕易使用代碼自動格式化工具,哪怕多一個空格,版本控制工具也會認爲該行已被修改,從而給程序管理帶來不便。

 

6       代碼標準文檔更新

關於Delphi代碼標準的最新文檔,你可以在 http://dev.cq118.com/web/ 處獲得。

 

7       參考

Delphi 程序設計編碼規範 For Delphi Development Guide(E)

Pascal Standards FAQ (E)

JavaDoc E

Doc-O-matic Document (E)

Artemis Alliance Delphi Coding Standards (E)

Borland官方Object Pascal書寫風格指南 (E)

 

作者Bloghttp://blog.csdn.net/caridle/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章