トップへ(mam-mam.net/)

関数ポインタと手続きポインタ(ルーチンの参照) ~Delphiソースコード集

検索:

関数ポインタと手続きポインタ(ルーチンの参照) ~Delphiソースコード集

まず最初に本ページでは、
戻り値のあるルーチン(function)を「関数」と呼び、戻り値の無いルーチン(procedure)を「手続き」と呼びます。

関数手続きを参照するには以下のような種類の型の宣言があります。

種類
関数のポインタTFunc = function(i:Integer):Integer;
手続きのポインタTProc = procedure(i:Integer);
関数のメソッドポインタTFuncO = function(i:Integer):Integer of object;
手続きのメソッドポインタTProcO = procedure(i:Integer) of object;
関数の参照型TFuncR = reference to function(i:Integer):Integer;
手続きの参照型TProcR = reference to procedure(i:Integer);

関数のポインタと手続きのポインタ

関数のポインタと手続きのポインタは「関数」や「手続き」を参照できます。
また、「静的クラスメソッドの関数」や「静的クラスメソッドの手続き」を参照できます。

interface

type
  //関数のポインタ型の宣言
  TFunc = function(i:Integer):Integer;
  //手続きのポインタ型の宣言
  TProc = procedure(i:Integer);

  TMyClassClassStatic = class
  public
    class function FuncTest(i:Integer):Integer;static; //静的クラスメソッドの関数
    class procedure ProcTest(i:Integer);static;        //静的クラスメソッドの手続き
  end;

  function FuncTest(i:Integer):Integer;   //関数
  procedure ProcTest(i:Integer);          //手続き


implementation

var
  Func : TFunc;
  Proc : TProc;
begin
  Func := FuncTest;
  Func(1);
  Proc := ProcTest;
  Proc(2);

  //静的クラスメソッドの関数
  Func := TMyClassClassStatic.FuncTest;
  Func(1);
  //静的クラスメソッドの手続き
  Proc := TMyClassClassStatic.ProcTest;
  Proc(2);
end;

関数のメソッドポインタと手続きのメソッドポインタ

関数のメソッドポインタと手続きのメソッドポインタは「クラス(オブジェクト)の関数」や「クラス(オブジェクト)の手続き」を参照できます。
また、「クラスメソッドの関数」や「クラスメソッドの手続き」を参照できます。

interface

type
  //関数メソッドポインタ
  TFuncO=function(i:Integer):Integer of object;
  //手続きのメソッドポインタ
  TProcO=procedure(i:Integer) of object;

  //通常のクラス
  TMyClass = class
  public
    function FuncTest(i:Integer):Integer; //クラスの関数
    procedure ProcTest(i:Integer);        //クラスの手続き
  end;


  TMyClassClass=class
  public
    class function FuncTest(i:Integer):Integer; //クラスメソッドの関数
    class procedure ProcTest(i:Integer);        //クラスメソッドの手続き
  end;


implementation

var
  FuncO : TFuncO;
  ProcO : TProcO;
  MyClass : TMyClass;
begin
  MyClass := TMyClass.Create;
  try
    FuncO:=MyClass.FuncTest;
    FuncO(3);
    ProcO:=MyClass.ProcTest;
    ProcO(4);
  finally
    MyClass.Free;
  end;

  //クラスメソッドの関数
  FuncO := TMyClassClass.FuncTest;
  FuncO(1);
  //クラスメソッドの手続き
  ProcO := TMyClassClass.ProcTest;
  ProcO(2);
end;

関数の参照型と手続きの参照型

関数の参照型と手続きの参照型は、
「関数」や「手続き」を参照できます。
「静的クラスメソッドの関数」や「静的クラスメソッドの手続き」も参照できます。
「クラス(オブジェクト)の関数」や「クラス(オブジェクト)の手続き」も参照できます。
「クラスメソッドの関数」や「クラスメソッドの手続き」も参照できます。
更には、「無名関数」も参照できます。
以下に無名関数の例を示します。

interface

type
  //関数の参照型
  TFuncR = reference to function(i:Integer):Integer;
  //手続きの参照型
  TProcR = reference to procedure(i:Integer);

implementation

var
  FuncR : TFuncR;
  ProcR : TProcR;
begin
  //無名関数
  FuncR := function(i:Integer):Integer
  begin
      Form1.Memo1.Lines.Add(i.ToString);
      Result:=i;
  end;
  FuncR(9);

  //無名手続き
  ProcR := procedure(i:Integer)
  begin
      Form1.Memo1.Lines.Add(i.ToString);
  end;
  ProcR(10);
end;