Delphi 程式由專案檔(.dpr)與單元檔(.pas)組成。本文詳細解析 program 與 unit 的標準結構、uses 子句的多種引用形式、單元間接/巢狀引用、循環引用的編譯器處理機制與最佳實踐。
program Editor;
uses
Forms,
REAbout, { "關於" 對話框單元 }
REMain; { 主視窗單元 }
{$R *.res} { 資源檔指令 }
begin
Application.Title := 'Text Editor';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
uses 列出專案直接依賴的單元,編譯器按順序編譯並鏈接。Application 是 Forms 單元提供的全域 VCL 應用程式物件。CreateForm 會自動建立、顯示並註冊主視窗。unit Unit1;
interface
uses
{ 介面區依賴:其他單元的類型/常數/函數在此可見 }
implementation
uses
{ 實作區依賴:僅實作細節需要,減少介面區耦合 }
{ 類別方法、過程、函數的具體實作 }
initialization
{ 單元初始化代碼:載入資源、註冊類別、啟動執行緒等 }
finalization
{ 單元終結代碼:釋放資源、註銷、停止執行緒等 }
end.
| 區塊 | 執行時機 | 典型用途 |
|---|---|---|
interface | 編譯期(型別檢查) | 類型聲明、常數、公開函數原型 |
implementation | 編譯期/連結期 | 私有型別、函數實作 |
initialization | 程式啟動,單元載入時 | 資源載入、單例建立、註冊 |
finalization | 程式結束,單元卸載前 | 資源釋放、註銷、清理 |
uses Forms, Main;
uses
Forms,
Main;
uses Windows, Messages, SysUtils, Strings, Classes, Unit2, MyUnit;
uses
Windows, Messages, SysUtils,
Strings in 'C:\Classes\Strings.pas', { 指定完整路徑 }
Classes;
注意:in 'path' 僅能用於專案檔(.dpr),單元檔內 uses 不支援路徑指定。
program Prog;
uses Unit2;
const a = b;
unit Unit2;
interface
uses Unit1;
const b = c;
unit Unit1;
interface
const c = 1;
Prog 僅直接 uses Unit2,但透過 Unit2 → Unit1 間接可見 c。uses 形成「傳遞性可見性」;實作區 uses 不傳遞。unit Unit1;
interface
uses Unit2; { Unit1 介面區引用 Unit2 }
unit Unit2;
interface
uses Unit1; { Unit2 介面區引用 Unit1 }
編譯器規則:
implementation 區引用另一方,或雙方僅在介面區使用對方的「不完整類型」(指標/類別引用)。Circular unit reference。{ Unit1.pas }
unit Unit1;
interface
uses Unit2; { 僅需 Unit2 的類別引用/指標 }
type
TClass1 = class
Ref: TClass2; { 指標/引用,不需完整定義 }
end;
{ Unit2.pas }
unit Unit2;
interface
uses Unit1;
type
TClass2 = class
Ref: TClass1;
end;
或將共用類型抽離至第三個單元 UnitCommon,雙方同時 uses UnitCommon。
implementation uses。Unit_ 前綴或功能域前綴(Data_、UI_、Svc_),避免與 RTL/VCL 單元衝突。initialization 分配的資源必在 finalization 釋放,防止記憶體洩漏。清晰的單元架構是大型 Delphi 專案可維護性的基石。善用介面/實作區分離與條件編譯,能有效控制編譯依賴圖,縮短增量編譯時間。