在探討具體規範前,我們必須先釐清 Delphi 編譯器的特性:
對 Delphi 編譯器而言,CaseID、caseid、CASEID 甚至 cAsEiD 都是**完全相同**的變數。這與 C++, C#, Java, JavaScript (這些是 Case-sensitive) 有著根本上的不同。
既然編譯器不在乎,為什麼大家還是很嚴格遵守大小寫?因為**「人」在乎**。統一的大小寫規範(通常是 PascalCase)能極大提升程式碼的可讀性。
當 Delphi 與外部世界溝通時!例如:
了解以下三種風格,有助於我們理解 Delphi 的選擇:
Delphi 最具特色的就是使用**單一字母前綴**來標示該元素的「種類」或「作用域」。
| 元素類型 (Type) | 前綴 | 命名風格 | 範例與說明 |
|---|---|---|---|
| 類別 (Class/Type) | T | PascalCase | TForm, TCustomer |
| (T 代表 Type,所有類別與自訂型別皆以此開頭) | |||
| 介面 (Interface) | I | PascalCase | IUnknown, IScanner |
| (I 代表 Interface) | |||
| 例外 (Exception) | E | PascalCase | EOutOfMemory, EFileNotFound |
| (E 代表 Exception) | |||
| 指標 (Pointer) | P | PascalCase | PChar, PInteger |
| (P 代表 Pointer) | |||
| 私有欄位 (Field) | F | PascalCase | FCaseID, FWidth |
| (F 代表 Field,僅存在於類別的 private/protected 區段) | |||
| 屬性 (Property) | 無 | PascalCase | CaseID, Width |
| (對外公開的屬性,通常用來讀寫對應的 F 變數) | |||
| 方法參數 (Parameter) | A | PascalCase | AOwner, ACaseID |
| (A 代表 Argument,用以避免與內部 Field 撞名) |
Delphi 對列舉型別有非常優雅的規範:**型別以 T 開頭,列舉值以該型別的 2~3 個字母縮寫作為小寫前綴。**
type
TTransMode = (tsHttp, tsFtp, tsNone);
TFormAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);
在 Delphi 中,檔案名稱(.pas)與程式碼內宣告的單元名稱(unit XXX;)**必須完全一致**。
在 Delphi 的專案架構中,除了單元名稱外,副檔名與特定的檔名後綴也承載了重要的架構意義。
當你開發或匯入 COM、ActiveX 或 Automation Server 時,Delphi IDE 會自動生成以 _TLB 結尾的檔案(例如 CB_IMGPSScan_TLB.pas)。
以下是 Delphi 專案中常見的副檔名及其具體用途:
| 副檔名 | 類型 | 說明 |
|---|---|---|
| .pas | 原始碼 (Source) | Pascal Source File。最常見的程式碼檔案(單元/Unit),包含介面宣告 (interface) 與實作邏輯 (implementation)。 |
| .dpr | 專案檔 (Project) | Delphi Project。專案的主進入點,定義這是一個執行檔 (program) 還是程式庫 (library),並包含專案的啟動邏輯與引入單元列表。 |
| .dfm | 介面檔 (Form) | Delphi Form。儲存視覺化窗體 (Form) 或資料模組 (DataModule) 上所有元件的屬性與佈局設定。一定與同名的 .pas 檔成對出現。 |
| .dcu | 編譯檔 (Compiled) | Delphi Compiled Unit。.pas 檔案成功編譯後產生的二進位結果。最終連結器 (Linker) 會將這些 .dcu 打包成 EXE 或 DLL。 |
| .res | 資源檔 (Resource) | Compiled Resource File。二進位資源檔,包含應用程式圖示 (Icon)、版本資訊或夾帶的檔案。通常在 .dpr 中用 {$R *.res} 編譯指令引入。 | | .tlb | 類型庫 (Type Lib) | Type Library。微軟 COM 標準的二進位檔案,用來描述 ActiveX 元件對外公開的介面、方法與屬性,供其他語言(如 C++, JS)參考呼叫。 | | .ridl | 介面定義 (RIDL) | Restricted Interface Definition Language。較新版 Delphi 用來取代舊式二進位 .tlb 的純文字介面定義檔。開發者可以透過文字或 IDE 編輯它,編譯時會自動生成對應的 .tlb 與 _TLB.pas。 | | .ocx | 控件擴充檔 | OLE Control Extension。本質上是一個特殊格式的 DLL(動態連結函式庫),內部包含了 ActiveX 控件。Windows 系統可以透過 regsvr32 註冊它,讓 IE 瀏覽器或其他應用程式嵌入使用。 | |
對於習慣 C#、Java、Python 或 JavaScript 的開發者,了解 Delphi 專屬的結構名詞如何對應到現代語言是非常重要的。
在 Delphi (Object Pascal) 中,{ } 符號的意義取決於緊跟在 { 後面的第一個字元。這是一個非常基礎但關鍵的語法,讓我們來拆解你的疑問:
{ } 符號的基本意義:註解 (Comments)在最基本的情況下,{ } 是 「區塊註解」。編譯器會完全忽略裡面的內容。
{ TCB_IMGPSScanX }:這是一段 註解。
TCB_IMGPSScanX 類別的實作」。它對程式執行**沒有任何影響**。TCB_IMGPSScanX:這是一段 程式碼 (識別碼)。
TCB_IMGPSScanX 的類別、型別或變數。如果沒定義,編譯就會報錯。{$ } 符號的進階意義:編譯指令 (Compiler Directives)當 { 後面緊跟著 $ 字元時,它就從「註解」變成了 「編譯指令」。這不是給人看的,而是**給編譯器下的指令**。
{$I filename} (Include 指令)你看到的 {$I ...} 是 Include Directive。
CB_IMGPSScanImp_UI.pas 檔案裡的文字**原封不動地抓過來,塞到這個位置**,然後再繼續往下編譯」。CB_IMGPSScanImp.pas 檔案太長了,開發者把它拆成小檔案,最後用這種方式在主檔「匯合」。你提到的這一段:{$I CB_IMGPSScanImp_UI.pas}{$I CB_IMGPSScanImp_Scan.pas}...initialization
這既不是定義,也不是宣告,更不是字串。它是一種 「程式碼組合行為」。
UI.pas、Scan.pas、Data.pas、Utils.pas。這四個檔案裡放的通常是 TCB_IMGPSScanX 的各種 procedure 和 function 實作。initialization 關鍵字。implementation
// 編譯器開始貼上檔案
[貼上 UI.pas 的內容]
[貼上 Scan.pas 的內容]
[貼上 Data.pas 的內容]
[貼上 Utils.pas 的內容]
// 貼完後,剛好銜接這支單元的初始化邏輯 (AxCtrl)
initialization
TActiveFormFactory.Create(...);
SetLicenseKey(...);
end.
{ ... } = 註解(編譯器不看)。{$I ...} = 編譯器指令(叫編譯器去別的檔案搬程式碼過來貼上)。Delphi 提供三種主要的註解方式,以及一些開發者社群常用的視覺化風格:
//)// 開始到該行結束。////):
//// 語法上等同於 //。//// ***** 預設區 ***** ////)。{ }){ } 包圍的所有文字。{$(如 {$R *.DFM}),則代表它是給編譯器的指令,而非一般註解。(* *))(* 開始到 ) 結束。{ } 註解的程式碼時,Delphi 規定 { } 不能包在另一對 { } 裡面,此時必須改用 (* ... *) 來包裹,才能正確註解。/// XML Documentation)在大型檔案(如 CB_IMGPSScanImp.pas)中,常用註解來劃分功能界線:
// ********************************************************************* //
// 這是區塊分隔線風格,常用於自動生成的 TLB 檔
// ********************************************************************* //
{-----------------------------------------------------------------------}
{ 這是另一種常見的手寫分隔線風格 }
{-----------------------------------------------------------------------}