程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 理解Delphi的類(十) - 深入方法(8)

理解Delphi的類(十) - 深入方法(8)

編輯:Delphi

{測試}

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;
begin
  Result := IntToStr(x + y);
end;
function MyFun(x: Integer; y: Integer = 1): string; overload;
begin
  Result := IntToStr(x + y);
end;
{因為當我們這樣調用時: MyFun(a,b); 系統就不知道要調用哪個了!}

深入方法[24] - 方法是一個指針{自定義過程}procedure MyProc;
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;
深入方法[25] - 使用方法類型//弄明白這一點, 才好使用回調函數
{ 定義方法類型}
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;
深入方法[26] - 回調函數

//把一個方法當作另一個方法的參數, 就是回調方法, 大家習慣稱作回調函數 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);
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;
深入方法[27] - 遞歸函數:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved