線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2965
推到 Plurk!
推到 Facebook!

請問在Interface的uses和在implementation的uses的區別

答題得分者是:wameng
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-02 21:53:26 IP:218.86.xxx.xxx 未訂閱
同題,謝謝!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-03 10:41:15 IP:61.222.xxx.xxx 未訂閱
事實上,很多人都解釋的比我好。 在此,我稍做說明。若有不足部分,大家在補上。 就簡易而言。 Interface 的 Uses 是對外單元(Uniy)公開的 ,而 Implementation 的 Uses 為該單元私有的(引用)。 另外補充一點: 1.在Implementation引用的單元(Unit),是不能在引用在該單元的Interface中調用的。 2.在Interface所宣告的類型,可以在別的單元中引用。而implementation 卻不行。 假如: 你在Unit2中定義類型,如果在Unit1的interface中Uses了它, 就可以在Unit1的interface中使用了,否則只能在implementation中使用。 在此建議您閱讀 Delphi 編程標準規範,比較有系統化的概念。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-03 11:02:11 IP:61.222.xxx.xxx 未訂閱
加減看吧。......... Delphi 程序代碼編寫標準指南 版權所有 1998 Xavier Perched和 Steve Teiseira 一、序言 二、通用源代碼格式規則 2.1 縮格 2.2 頁邊空格 2.3 Begin…End 配對 三、Object Pascal 3.1 括號 3.2 保留字和關鍵字 3.3 過程和函數(例程) 3.3.1 命名/格式化 3.3.2 形式參數 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 參數的排序 3.3.2.4 常量參數 3.3.2.5 名稱的衝突 3.4 變數 3.4.1 變數的命名和格式 3.4.2 局部變數 3.4.3 全局變數的使用 3.5 類型 3.5.1 大寫約定 3.5.1.1 浮點指針類型 3.5.1.2 枚舉類型 3.5.1.3 變數和ole變數類型 3.5.2 結構類型 3.5.2.1 數組類型 3.5.2.2 記錄類型 3.6 語句 3.6.1 if 語句 3.6.2 case 語句 3.6.2.1 一般性話題 3.6.2.2 格式 3.6.3 while 語句 3.6.4 for 語句 3.6.5 repeat 語句 3.6.6 with 語句 3.6.6.1 一般話題 3.6.6.2 格式 3.7 結構異常處理 3.7.1 一般話題 3.7.2 try…finally的使用 3.7.3 try…except的使用 3.7.4 try…except…else的使用 3.8 類類型 3.8.1 命名和格式 3.8.2 域 3.8.2.1 命名/格式 3.8.2.2 可視化 3.8.3 方法 3.8.3.1 命名/格式 3.8.3.2 使用靜態的方法 3.8.3.3 使用虛擬/動態的方法 3.8.3.4 使用抽像的方法 3.8.3.5 屬性存取方法 3.8.4 屬性 3.8.4.1 命名/格式 3.8.4.2 使用存取的方法 四、文件 4.1 工程文件 4.1.1 命名 4.2 窗體文件 4.2.1 命名 4.3 數據模板文件 4.3.1 命名 4.4 遠端數據模板文件 4.4.1 命名 4.5 Unit文件 4.5.1 通用Unit結構 4.5.1.1 unit的名字 4.5.1.2 uses子句 4.5.1.3 interface部分 4.5.1.4 implementation部分 4.5.1.5 initialization部分 4.5.1.6 finalization部分 4.5.2 窗體單元 4.5.2.1 命名 4.5.3 數據模板單元 4.5.3.1 命名 4.5.4 一般目的單元 4.5.4.1 命名 4.5.5 元件單元 4.5.5.1 命名 4.6 文件頭 五、窗體和數據模板 5.1 窗體 5.1.1 窗體類型命名標準 5.1.2 窗體實例命名標準 5.1.3 自動創建窗體 5.1.4 模式窗體實例化函數 5.2 數據模板 5.2.1 數據模板命名標準 5.2.2 數據模板實例命名標準 六、包 6.1 使用運行包和設計包的比較 6.2 文件命名標準 七、元件 7.1 用戶自定義元件 7.2 元件單元 7.3 使用註冊單元 7.4 元件實例命名約定 一、序言 本文檔詳述了在Delphi 開發者指南下進行編程的代碼編寫標準。 在通常情況下,本文檔遵循「取消」式格式的指引方針,該方針由Borland國際通過一些例外來使用。在Delphi 開發者指南中包含本文檔的目的在於闡述一種方法,通過該方法,開發小組可以在他們所編寫的代碼中保持一貫 的風格。這樣做的目的是使在開發小組中的每一個程序員都可以明白其他程序員的代碼。這有助於提高代碼編寫 的可讀性和使用的一貫性。 本文檔並不意味著包含了所有存在於代碼中的標準。但是,它的內容已足夠幫你起個好頭。你可以自由的增加修 改這些標準來滿足你的需要。我們不贊成你偏離這些由Borland開發人員所使用的標準太遠。我們推薦這麼做是因 為一旦有新的程序員加入到你的開發小組中,而他們最喜歡和最熟悉的是Borland的標準。像大多數代碼標準文檔 ,本文檔也會根據需要進行改動。因此,你可以到www.xapware.com/ddg中找到最新的更新版本。本文檔不包括用 戶接口標準。本文檔是獨立的但也是同樣重要的。已經有足夠的第三方書籍和Microsoft文檔包括了另外一些指導 方針,而我們決定並不複製這些信息,但我們會指引你到Microsoft Developers Network 和一些資源,在那兒可 以找到你所需的信息。 二、通用源代碼格式規則 2.1 縮格 縮格是指在每一級有兩個空格。不要在源代碼中保留tab字符,這是因為tab字符會隨著不同用戶的不同設置和不同的資源管理工具(打印、文檔、版本控制等)而代表不同的寬度。 你可以通過關閉Environment選項對話框中Editor頁上的「Use tab character」和「Optimal fill」檢查框(通過Tools|Environment)來禁止保存tab字符。 2.2 頁邊空格 頁邊空格會被設置成80字符寬。通常,源碼不會超出這個邊界,但這個方針會有一些彈性。不管是否有可能,那些超出到另一行的語句會在一個逗號或其他操作符之後與前面的語句相連。當一個語句被打斷相連時,它應比原來的那一行語句縮進兩個字符。 2.3 Begin…End 配對 Begin 子句應寫在獨立的一行。例如,下面第一行是錯誤的寫法而第二行是正確的。 for I := 0 to 10 do begin //錯誤,begin同for在同一行 for I := 0 to 10 do //正確,begin出現在獨立的一行 begin 這個規則的例外是當begin子句的出現是作為一個else子句的一部分-參考例子: if some statement then begin … end else begin someOtherStatement; end; end 語句永遠出現在獨立的一行。 當begin語句不是一個else子句的一部分時,相應的end語句永遠縮進到與begin部分相對應的位置。 三、Object Pascal 3.1 括號 永遠不要在括號與括號之間的字符中間留下空格。下面的例子示範了錯誤的與正確地使用括號中的空格: CallProc( Aparameter ); //錯誤 CallProc(Aparameter); //正確 永遠不要在一個語句中使用不必要的括號。括號只應在源代碼中需要的地方使用。以下的例子示範了錯誤和正確的使用: if (I = 42) then //錯誤 - 多餘的括號 if (I = 42) or (J = 42) then //正確 - 需要括號 3.2 保留字和關鍵字 Object Pascal 保留字和關鍵字永遠是全部小寫。 3.3 過程和函數(例程) 3.3.1 命名/格式化 例程的名字永遠應該以大寫的字母開頭並且中間錯落分明以便於可讀性。下面是一個不正確格式的過程名稱: procedure thisisapoorlyformattedroutinename; 下面是一個合適的大小寫例程名稱的例子: procedure ThisIsMuchMoreReadableRoutineName; 例程的名稱應該同它的內容相符。一個會導致某個行為的例程應以動詞開頭。例如: procedure FormatHardDrive; 一個用於設置輸入參數的例程應以單詞set作為前面,例如: procedure SetUserName; 一個用來接收某個值的例程應以單詞get作為前面,例如: procedure GetUserName : string; 3.3.2 形式參數 3.3.2.1 格式化 如果有的話,相同類型的形參應合併在一個語句中: procedure Foo(Param1, Param2, Param3 : Integer; Param4 : string); 3.3.2.2 命名 所有形參的名字應是十分符合它們所代表的意義,特別是應該以傳送到例程中的標誌符的名稱為基礎。一個好的參數名稱應以字符A為前面 - 例如: procedure SomeProc(AuserName : string; AuserAge : integer); 「A」前面按約定表示該參數的名稱是與類類型中的一個屬性或域的名稱相對應的。 3.3.2.3 參數的排序 下面的形參的順序重點說明了註冊者調用約定調用的好處。 - 最常用的參數應放在第一位,其它的參數應按從左到右的順序排列。 - 輸入參數列表應放在輸出參數列表的左邊。 - 將通用的參數放在特殊參數的左邊,例如: procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity) - 排序有可能有些例外,比如事件的處理。類型為TObject的Sender參數經常放在第一位。 3.3.2.4 常量參數 當一個參數為記錄型、數組類型、ShortString、或接口類型並且在例程中不被改變時,這些參數應做上常量標記。這樣做會讓編譯器更加有效率的產生有關這些不改變的參數的代碼。 而例程中另外一些非變參數也可常量來傳送。儘管這樣做沒有產生任何效果和提高效率,這將會給調用例程的使用者提供更多的信息。 3.3.2.5 名稱的衝突 當使用擁有兩個名稱相同的例程的兩個單元時,如果你調用該例程時,在uses子句中排在後面的單元中的例程將會被調用。為了解決這種「在uses子句上的模糊」衝突,要在調用該例程時寫上相關的單元的前面,例如: sysUtile.FindClose(SR); 或 windows.FindClose(Handle); 3.4 變數 3.4.1 變數的命名和格式 變數的命名應以使用它們的目的相符 循環控制變數應採用一個單獨的字符作為名字,比如 I,J,或K,也可以採用更加有意義的名字,比如 UserIndex。 邏輯變數的名字應能充分表達準確的真或假的意思。 3.4.2 局部變數 一個過程中的局部變數應遵循所有其它變數的使用和命名約定。臨時變數的取名應合理。 如果必須的話,在一進入例程就應初始化局部變數。局部的AnsiString變數會自動初始化為一個空的字符串。 局部接口和派分接口類型變數將會自動初始化為nil,並且局部變數和ole變數類型變數會自動初始化為Unassigned 3.4.3 全局變數的使用 使用全局變數是不推薦的。但是,在某些時候還是必須使用,而且它們也只應在必須使用的時候才使用。在這種時候,你應努力只在一段上下文範圍內使用全局變數。例如,一個全局變數只應在一個單元的implemntation部分內是全局的。如果打算在多個單元類使用全局數據,你應將它們移到一個公共的單元中然後被其它所有單元使用。 全局變數可以在var子句中直接初始化為一個值。記住,所有的全局數據會自動初始化為0,因此不要將全局變數初始化為一個「空」值比如 0、nil、』』、Unassigned、等等。這樣做的一個理由是因為零-初始化的全局數據在exe文件中不會佔據任何空間。零-初始化數據被存儲在一個虛擬的數據段,它在應用程序啟動後被分配在一段內存中。非零-初始化的全局數據在硬盤的exe文件佔用空間。 3.5 類型 3.5.1 大寫約定 如果類型的名字是保留字,那麼它應全部小寫。Win32 API類型通常全部大寫,並且你必須遵循在Windows.pas或其他API單元中的詳細類型名稱的約定。對於其他變數名字,地一個字母應為大寫,而其他字母應錯落有致。下面是一些例子: var MyString : string; //保留字 WindowHandle : HWND; //Win32 API 類型 I : Integer; //在System單元中引進的類型標識符 3.5.1.1 浮點指針類型 不推薦使用Real類型,因為它的存在只是為了向前兼容早期的Pascal代碼。在通常情況下用Double來實現浮點指針的需要。並且,Double對處理器和總線而言是做了最優化處理的,它也是IEEE中定義的標準數據格式。只有當需要的範圍超出Double所定義的範圍時才使用Extended。Extended是intel定義的類型且在Java中不支持。只有當浮點指針變數的實際字節大小有其意義時才使用Single。(比如當使用另一種語言的DLLs時)。 3.5.1.2 枚舉類型 枚舉類型的名字需符合使用該類型的目的。該類型的名字需以字符T為前面,以表明這是一個類型。枚舉類型中的標識符列表必須包含兩個或三個字符的前面來對應於該枚舉類型的名字 - 例如: TsongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB); 一個枚舉類型的實例的名字應與不要前面的枚舉類型(SongType)相同,除非有更好的原因來賦予該變數更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。 3.5.1.3 變數和ole變數類型 通常不建議使用變數和Ole變數類型。但在只有運行時刻才能知道數據類型的程序中必須使用該類型,這種情形多出現在COM和數據庫開發中。Ole變數使用在以COM為基礎的編程中例如自動化和ActiveX控制,而變數使用在非COM的編程中,這是因為變數可以十分有效地存儲本地Delphi字符串(同一個字符串變數一樣),但Ole變數會將所有的字符串轉換為Ole字符串(WideChar 字符串)並且並不實例運算 - 它們永遠拷貝。 3.5.2 結構類型 3.5.2.1 數組類型 數組類型的名字需符合它們使用的目的。該類型的名字必須加以前面T。如果須聲明該數組類型的指針,那麼該指針需加以前面P而且應立即聲明在該數組聲明的前面。例如: type PCycleArray = ^TCycleArray; TCycleArray = array[1…100] of integer; 在實際應用中,數組的變數實例的名稱應是其類型的名字去掉前面T。 3.5.2.2 記錄類型 記錄類型的名字應符合使用它們的目的。其類型的聲明應加以前面T。如果要聲明該記錄類型的指針,就應加以前面P並且應緊靠在類型聲明的前面聲明。例如: type PEmployee = ^TEmployee; TEmployee = record EmployeeName : string; EmployeeRate : Double; end; 3.6 語句 3.6.1 if 語句 在if/then/else語句中最常發生的行為應放在then子句中,而其它發生可能性較小的行為應放在else子句中。 盡量避免使用嵌套的if語句,在這種情形下應用多個if語句來判斷各種可能。 不要使用if嵌套超過五級深度。應使代碼編寫得更加清晰、明瞭。 不要在if語句中使用不必要的圓括號。 如果在if語句中有多個條件需測試,這些條件應按計算強度由少到多的順序從左到右排列。這樣做能使編譯器在編譯代碼時獲得布爾估算邏輯的捷徑,從而使你的代碼獲得最佳的優化。舉例來說,如果條件1快過條件2,而條件2快過條件3,那麼在if語句中的排列應是: if 條件1 and 條件2 and 條件3 then 3.6.2 case 語句 3.6.2.1 一般性話題 在一個case語句中的各個獨立的單元應以數字或字母順序排列。 每一個case單元的動作行為應保持簡單而不應該超過四到五行代碼。如果所要執行的動作過於複雜應採用獨立的過程或函數。 Case語句中的else子句只有當需要缺省行為或處理錯誤時才使用。 3.6.2.2 格式 case語句應遵循其它結構的縮格和命名約定。 3.6.3 while 語句 在一個while語句中不建議使用exit過程來跳出循環,盡量僅使用循環條件來跳出循環。 在一個while循環中所用的初始化代碼應緊靠在進入while循環前面出現而不要被其它不相關的語句隔開。 任何結束後的處理應在循環之後立即進行。 3.6.4 for 語句 for語句只有當循環次數已知的情況下才能取代while語句使用。 3.6.5 repeat 語句 repeat語句的使用同while語句一樣,並且遵循同樣的通用方針。 3.6.6 with 語句 3.6.6.1 一般話題 with語句應節省使用,並且帶有大量的警告。避免過度使用with語句並且在with語句中小心使用多個對象、記錄等等。例如: with Record1, Record2 do 這些事情會使程序員感到困惑並難以發現問題所在。 3.6.6.2 格式 with 語句遵循本文檔所說明的命名約定和縮格的格式規則。 3.7 結構異常處理 3.7.1 一般話題 異常的處理大量地使用在錯誤糾正和資源保護方面。這就是說一旦資源被分配,一個try…finally必需加以使用來保證該資源被正確的釋放。這種異常的保護也是指在一個單元的initializition/finalization或一個對象的constructor/destructor中進行資源的分配和釋放。 3.7.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; 3.7.3 try…except的使用 只有當在異常被觸發而你想執行一些任務時才使用try…except。通常,你沒有必要為了只是簡單地在屏幕上顯示一個錯誤信息而使用try…except語句,因為這會被Application對像自動執行。如果你想在except子句中執行完一些任務之後調用缺省的異常處理,使用raise來重新觸發異常到下一個句柄。 3.7.4 try…except…else的使用 try…except中的else子句不建議使用,因為它會打斷所有的異常包括那些你沒有準備的異常。 3.8 類類型 3.8.1 命名和格式 類類型的名稱應符合使用它們的目的。類型名字應加以前面T以表明這是一個類型的定義 - 例如: type Tcustomer = class(TObject) 類型的實例通常是沒有前面T的類型的名字 - 例如: var Customer :Tcustomer; 注意:查閱「元件類型的命名標準」來獲得更多有關元件命名的信息。 3.8.2 域 3.8.2.1 命名/格式 類的域名遵循與變數標識符同樣的約定除了它們應以F為前面,來表明這是一個域的名稱。 3.8.2.2 可視化 所有的域都必需是私有的。想在類的範圍之外存取域得通過屬性來使用。 3.8.3 方法 3.8.3.1 命名/格式 方法的命名應遵循本文檔中有關過程和函數的約定敘述。 3.8.3.2 使用靜態的方法 如果使用一個靜態的方法,那麼該方法就不能被該類的後代類所繼承。 3.8.3.3 使用虛擬/動態的方法 如果你打算該類的方法能被後代的類所繼承就得使用虛擬的方法。只有在該方法有多個繼承時(直接的或間接的 )才使用動態的方法。例如,一個類類型包含一個可繼承的方法,而100個後代類要繼承這種方法,那麼這個方法 就會動態地產生為100個後代類使用的內存。 3.8.3.4 使用抽像的方法 如果在一個類中使用抽像的方法,該類就不能被創建。只有在那些永遠不會被創建的類中使用抽像的方法。 3.8.3.5 屬性存取方法 所有存取類的方法都只能出現在類的private或protected部分。屬性存取方法的命名應遵循過程和函數的約定規 則。讀取存取方法(方法讀取器)必需以單詞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; 3.8.4 屬性 3.8.4.1 命名/格式 屬性如果是表示為一個私有域的存取器的話,那麼它的名字應是它們所操作的域的名字除去解釋符F。 屬性的名字應是名詞,不是動詞。屬性表示的是數據,而方法表示的是行為。 數組類型的名稱應為複數。一般情況下屬性的名稱應為單數。 3.8.4.2 使用存取的方法 儘管沒有要求,但還是建議盡量少地為一個表示私有域的屬性而使用寫入存取方法。 四、文件 4.1 工程文件 4.1.1 命名 工程文件應取個描述性的名字。例如,Delphi 4開發者指南錯誤管理器 的工程名字是:DDGBugs.dpr。一個有關係統信息的程序的名字就應像 SysInfo.dpr。 4.2 窗體文件 4.2.1 命名 一個窗體文件的取名應可以描述使用該窗體的目的,並加以後面Frm。例如,一個「關於」的窗體的文件名應是AboutFrm.dpr。主窗體的文件名應是MainFrm.dpr。 4.3 數據模板文件 4.3.1 命名 數據模板的取名應能表示使用該數據模板的目的,它的名稱應加以兩個字符的後面DM。例如,自定義數據模板的文件名字應為CustomersDM.dfm。 4.4 遠端數據模板文件 4.4.1 命名 遠端數據模板的取名應能表示使用該遠端數據模板的目的,它的名稱應加以三個字符的後面RDM。例如,自定義遠端數據模板的文件名字應為CustomersRDM.dfm。 4.5 Unit文件 4.5.1 通用Unit結構 4.5.1.1 unit的名字 Unit文件應取一個可描述性的名字。例如,包含應用程序主窗體的單元應叫做MainFrm.pas。 4.5.1.2 uses子句 在interface部分的uses子句應包含在interface部分中的代碼所需要的單元。去掉那些Delphi可以自動加入到程序中的單元。 在implementation部分的uses子句應只包含在implementation部分中的代碼所需要的單元的名字。去掉不必要的單元。 4.5.1.3 interface部分 interface部分應包含只那些其它單元所需要存取類型的定義、變數、過程/函數的預定義等等。否則,就應放在implementation部分定義。 4.5.1.4 implementation部分 implementation部分應包含那些只在本單元中私用的類型定義、變數、過程/函數定義等等。 4.5.1.5 initialization部分 不要在initialization 部分放入耗時長的代碼,這將使程序的第一個界面出現 得比較緩慢。 4.5.1.6 finalization部分 在這裡要保證釋放你在Initialization部分所分配的任何資源。 4.5.2 窗體單元 4.5.2.1 命名 一個窗體的單元文件應擁有與它所對應的窗體文件同樣的名稱。例如,「關於」窗體的單元名稱應為 AboutFrm.pas,而主窗體的單元名稱應為MainFrm.pas。 4.5.3 數據模板單元 4.5.3.1 命名 一個數據模板的單元文件應擁有與它所對應的數據模板文件同樣的名稱。例如,一個自定義數據模板單元的名稱應為CustomersDM.pas。 4.5.4 一般目的單元 4.5.4.1 命名 一般目的單元的取名應符合使用該單元的目的。例如,一個實用程序單元取名為BugUtilities.pas。一個包含全局變數的單元取名為CustomerGlobals.pas。 注意,該單元的名字不能與它的工程中所使用的所有包中的單元的名字相同。不贊成使用一般的或通用的單元名字。 4.5.5 元件單元 4.5.5.1 命名 元件單元應放在獨立的目錄,以將它們同定義元件組或元件集合的單元區分開來。它們要永遠同工程在不同的目錄。單元名字應同它們的內容相符。 注意:查閱「用戶定義的元件」部分來獲得更多有關元件命名標準的信息。 4.6 文件頭 建議在所有源文件、工程文件、單元等等中使用信息化文件頭。一個良好的文件頭應包含以下信息: { 版權… 著作的年、月、日… } 五、窗體和數據模板 5.1 窗體 5.1.1 窗體類型命名標準 窗體類型的取名應能表達使用該窗體的目的。類型定義應加以前面T。前面後面跟隨著描述性的名字。最後,應加以Form後面來描述名字。例如,一個「關於」的窗體的類型的名字應為: TAboutFrom = class(TForm); 主窗體的定義為: TMainForm = class(TForm); 一個用戶接入窗體的名字應像: TCustomerEntryForm = class(TForm); 5.1.2 窗體實例命名標準 窗體實例應是沒有帶前面T的相應類的名字。例如,對應於前面窗體類型而言,其實例的名字應為: 類型名稱 實例名稱 TAboutForm AboutForm TMainForm MainForm TCustomerEntryForm CustomerEntryForm 5.1.3 自動創建窗體 只有主窗體可以是自動創建的除非有其它更好的理由不這樣做。所有其它的窗體必需從工程選項對話框中的自動創建列表中移走。查閱以下部分來獲得更多的信息。 5.1.4 模式窗體實例化函數 所有的窗體單元都應包含一個窗體實例化函數,該函數用來創建、設置、模式地顯示窗體,並釋放窗體。該函數應返回窗體的模式結果。該函數要傳遞的參數應遵循本文檔指定的「參數傳遞」標準。通過這種方式封裝的函數性有助於代碼的再利用和維護。 該窗體的變數要從單元中移走,並再窗體實例的函數中進行本地式地定義。注意,這就意味著該窗體必需從工程/選項對話框中的自動創建列表中剔除。參考本文檔後面的「自動創建窗體」。 例如,下面的單元展示了再GetUserData窗體中的一個函數。 unit UserDataFrm; interface uses windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TUserDataForm = 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 UserDataForm : TuserDataForm; begin UserDataForm := TuserDataForm.Create(Application); try UserDataForm.Caption := 『Getting User Data』; Result := UserDataForm.ShowModal; if (Result = mrOK) then begin aUserName := UserDataForm.edtUserName.Text; aUserID := StrToInt(UserDataForm.edtUserID.Text); end; finally UserDataForm.Free; end; end; end. 5.2 數據模板 5.2.1 數據模板命名標準 數據模板的取名要符合使用該數據模板的目的。類型的定義應加以前面T,後面緊接著描述性的名字,最後要加以後面單詞「DataModule」。例如,一個自定義的數據模板有時候應該像: TCustomerDataModule = class(TDataModule) 一個命令式的數據模板的名字應像: TOrdersDataModule = class(TDataModule) 5.2.2 數據模板實例命名標準 數據模板實例的名稱應是對應不帶前面T的類型的名稱。例如,對於前面的窗體類型而言,其實例的名稱應為: 類型名稱 實例名稱 TCustomerDataModule CustomerDataModule TOrdersDataModule OrdersDataModule 六、包 6.1 使用運行包和設計包的比較 運行時刻的包應只包含其它元件包所要求的單元或元件。另外,包含屬性/元件編輯器和其它只為設計的代碼應放入到設計時刻包中。註冊單元應放在設計包中。 6.2 文件命名標準 包的名稱應依照下面的例子: 「iiilibvv.pkg」 - 設計時刻包 「iiistdvv.pkg」 - 運行時刻包 字符「iii」表示一個3字符標識前面。這個前面用來表明公司、個人或其它有標識意義的實體。 字符「vv」表示為該包想要對應Delphi某個版本的包的版本號。 注意,包的名字中包含「lib」或「std」的意思是表明這是一個設計時刻包還是一個運行時刻包。 如果既是設計時刻包又是運行時刻包,該文件的命名是同上面一樣的,例如,為Delphi 4開發者指南做的包的名稱應為: DdgLib40.pkg – 設計時刻包 DdgStd40.pkg – 運行時刻包 七、元件 7.1 用戶自定義元件 在標準元件中命名出來的元件的名稱同在「類類型」部分定義中的一樣定義成一個類類型,不同的是它們有一個3字符的指示前面,這個前面可以表示公司、個人或其它實體。例如,一個為Delphi 4開發者指南編寫的時鐘元件的名稱定義為: TddgClock = class(TComponent) 注意,那三個前面字符是小寫的。 7.2 元件單元 元件單元應只包含一個主要的元件,一個主要的元件是指出現在元件欄中的元件。主要元件的輔助元件/對像應放入到同一個單元中。 7.3 使用註冊單元 元件的註冊過程應從元件本身的單元中剔除,並放入到一個獨立的單元中。這個註冊單元可以用來註冊任何元件、屬性編輯器、元件編輯器、專家器等。 元件的註冊只應在設計時刻包中進行,註冊單元應包含在設計時刻包中而不應放在運行時刻包中。 推薦使用的註冊單元的名稱是: XxxReg.pas 上面的3個前面字符「Xxx」用來表示一個公司、個人或任何其它的實體。例如,在Delphi 4 開發者指南中的註冊單元的名稱應為 DdgReg.pas。 7.4 元件實例命名約定 所有的元件都應取個描述性的名稱。由Delphi創建的缺省名的元件不會被遺棄。在設計元件類型時應設計一個小寫的前面。使用前面而不使用後面的原因是在搜尋時,在對像檢查器和代碼探索器中搜尋元件的名字比搜尋元件的類型更容易實現。
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-03 11:43:04 IP:218.86.xxx.xxx 未訂閱
謝謝wameng大大,講得很詳細
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-03 13:57:05 IP:61.141.xxx.xxx 未訂閱
另外要注意一点: 两个单元互相uses的话,一定要放在 implementation 里面,不能放在 Interface部分。 比如:Form1--Unit1, DataModule1--Unit2 如果要在 Form1里使用到DataModule1里的东西,比如Table1,那么,在Unit1里要引用 Unit2; 同时,你可以能要在 DataModule1里用到 Form1里的东西,比如一个Function,要在Unit2里Uses Unit1; 这种情况下,就是相互交叉引用。必须放在implementation里。
系統時間:2024-05-22 4:43:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!