方法是類的行為單元,脫離類的過程/函數同樣遵循同一套規則。本文從零開始系統講解:過程與函數定義、參數傳遞四種模式、默認參數、調用約定、實現區/接口區聲明、前向聲明、開放數組、指針參數、重載、方法指針類型、回調函數、遞歸函數、傳址參數限制等 29 個核心知識點,配備可直接運行的代碼片段。
procedure 無返回值,function 有返回值 (Result 或函數名)。;,調用用 ,。x,y,z: Integer。Result,可參與運算,支持類型轉換 (Byte(Result) := b)。MyFun = MyFun()。s2: string = '默認值',必須在非默認參數之後。var 傳址、out 輸出、const 常量 (編譯器優化,不可修改)。interface 區聲明(uses 之後)。TForm1.MyFun。uses Unit2,必要時 Unit2.MyFun 避免衝突。forward;interface 區聲明則無順序限制。type IntArray = array[0..9] of Integer; 再用作參數。const arr: array of Integer,支援動態數組、常量數組 [1,2,3]。var 但傳 @Var 實際仍可修改原變量(地址傳遞本質)。overload;避免與默認參數產生歧義。@MyProc 獲取代碼地址。type TFunType = function(x: Integer): Integer; 定義兼容簽名的類型。var x: Integer 調用必須傳變量。function Sum(const arr: array of Integer): Integer;
var i: Integer;
begin
Result := 0;
for i in arr do Result := Result + i;
end;
{調用} Sum([1,2,3]); {6}
var a: array of Integer; SetLength(a,10); ... Sum(a);
type TCallback = function(i: Integer): Integer;
function DoubleIt(i: Integer): Integer; begin Result := i*2; end;
function Execute(x: Integer; cb: TCallback): Integer; begin Result := cb(x); end;
{使用}
var cb: TCallback; cb := DoubleIt; Execute(4, cb); {8}
procedure GetDirs(dirName: string; List: TStrings);
var sr: TSearchRec; dir: string;
const attr = faDirectory;
begin
dirName := ExcludeTrailingBackslash(dirName) + '\';
if FindFirst(dirName + '*.*', attr, sr) = 0 then
repeat
if (sr.Attr = attr) and (sr.Name <> '.') and (sr.Name <> '..') then begin
List.Add(dirName + sr.Name);
GetDirs(dirName + sr.Name, List); {遞歸}
end;
until FindNext(sr) <> 0;
FindClose(sr);
end;
| 陷阱 | 現象 | 規避 |
|---|---|---|
| 重載 + 默認參數 | 調用歧義 | 同名函數勿同時使用重載和默認參數 |
| 指針參數無 var | 誤以為不可修改 | 明確語義用 var/out,或文檔註明 |
| 遞歸無終止條件 | 堆疊溢位 | 必設基線條件,必要時用迭代替代 |
| forward 重複實現 | 編譯錯誤 | 僅聲明一次,實現一次 |
| 靜態數組直接作參數 | 編譯錯誤 | 先 type 定義類型 |
方法是 Delphi 程式邏輯的基本構建塊,精通參數傳遞語義、重載規則、遞歸模式、回調機制、方法指針類型,能編寫出靈活復用、高性能、易維護的核心算法與框架代碼。