{測試}
procedure TForm1.Button1Click(Sender: TObject);
var
i,x: Integer;
begin
i := 8;
x := MyFun(@i); {調用函數}
ShowMessage(IntToStr(x)); {16}
{現在 i 的值應該不會被修改, 但...}
ShowMessage(IntToStr(i)); {16}
{
沒有 var 或 out 前綴的參數, 應該是傳值的;
有 var 或 out 的參數是傳地址的;
指針就是一個地址, 盡管沒有指定傳地址, 但事實上就是給了一個地址,
所以參數值也會改變!
}
end;
深入方法[23] - 重載
{
{測試}
下面的函數重名, 但參數不一樣, 此類情況必須加 overload 指示字;
調用時, 會根據參數的類型和個數來決定調用哪一個;
這就是重載.
}
function MyFun(s: string): string; overload;
begin
Result := '參數是一個字符串: ' + s;
end;
function MyFun(i: Integer): string; overload;
begin
Result := '參數是一個整數: ' + IntToStr(i);
end;
function MyFun(x,y: Integer): string; overload;
begin
Result := Format('參數是兩個整數: %d 和 %d', [x,y]);
end;procedure TForm1.Button1Click(Sender: TObject);
//另外還要注意關於重載和默認參數的問題, 譬如, 下面的重載是不可行 的:
var
str: string;
begin
str := MyFun('萬一');
ShowMessage(str); {參數是一個字符串: 萬一}
str := MyFun(99);
ShowMessage(str); {參數是一個整數: 99}
str := MyFun(6,8);
ShowMessage(str); {參數是兩個整數: 6 和 8}
end;function MyFun(x,y: Integer): string; overload;
{因為當我們這樣調用時: MyFun(a,b); 系統就不知道要調用哪個了!}
begin
Result := IntToStr(x + y);
end;
function MyFun(x: Integer; y: Integer = 1): string; overload;
begin
Result := IntToStr(x + y);
end;
深入方法[24] - 方法是一個指針{自定義過程}procedure MyProc;
深入方法[25] - 使用方法類型//弄明白這一點, 才好使用回調函數
begin
ShowMessage('ok');
end;
{自定義函數}
function MyFun: string;
begin
Result := 'ok';
end;
{讀取它們的指針}
procedure TForm1.Button1Click(Sender: TObject);
var
p: Pointer;
begin
p := @MyProc;
ShowMessage(IntToStr(Integer(p))); {4570984; 這是動態的}
p := @MyFun;
ShowMessage(IntToStr(Integer(p))); {4571008; 這是動態的}
end;{ 定義方法類型}
深入方法[26] - 回調函數
type
TFunType = function(x: Integer): Integer; {函數類型}
TProcType = procedure(name: string); {過程類型}
{定義一個符合 TFunType 類型的函數}
function MyFun(x: Integer): Integer;
begin
Result := x * 2;
end;
{定義一個符合 TProcType 類型的過程}
procedure MyProc(name: string);
begin
ShowMessage('我是' + name);
end;
{使用}
procedure TForm1.Button1Click(Sender: TObject);
var
Fun : TFunType; {定義一個 TFunType 類型的變量}
Proc: TProcType; {定義一個 TProcType 類型的變量}
begin
Fun := MyFun; {讓變量 Fun 指向和它具有同樣參數和返回值的自定義函數 MyFun}
Proc := MyProc; {讓變量 Proc 指向和它具有同樣參數的自定義過程 MyProc}
{現在這兩個方法的變量 Fun、Proc 可以使用了}
ShowMessage(IntToStr(Fun(4))); {8}
Proc('萬一'); {我是萬一}
end;
//把一個方法當作另一個方法的參數, 就是回調方法, 大家習慣稱作回調函數 type
{把函數當作參數, 再定義一個函數}
TFunType = function(i: Integer): Integer; {聲明一個方法類型}
function MyFun(i: Integer): Integer; {建立類型兼容的函數}
begin
Result := i*2;
end;function MyTest(x: Integer; F: TFunType): Integer;
{測試}
begin
Result := F(x);
end;procedure TForm1.Button1Click(Sender: TObject);
深入方法[27] - 遞歸函數:
var
Fun: TFunType; {聲明一個 TFunType 的變量}
i: Integer;
begin
Fun := MyFun; {讓方法變量 Fun 指向和它類型兼容的一個方法}
{測試 Fun; Fun 是一個方法變量, 現在去執行那個方法, 它就可以當作那個方法來使 用了}
i := Fun(4);
ShowMessage(IntToStr(i)); //8
{把 Fun 當作參數使用; 把函數當作參數使用, 這就是回調函數}
i := MyTest(4,Fun);
ShowMessage(IntToStr(i)); //8
end;