Delphi 2009の匿名メソッド(referenceto)
3167 ワード
メソッド・タイプを定義し、メソッド・タイプの変数を使用してメソッドを使用できます.たとえば、次のようにします.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Type
TFun = function(const num: Integer): Integer; { }
function MySqr(const num: Integer): Integer; { }
begin
Result := num * num;
end;
{ }
procedure TForm1.FormCreate(Sender: TObject);
var
fun: TFun; { }
n: Integer;
begin
fun := MySqr; { }
n := fun(9); { }
ShowMessage(IntToStr(n)); {81}
end;
end.
このようにするのは、「方法」をパラメータとして使用する必要がある場合があります.たとえば、次のようにします.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Type
TFun = function(const num: Integer): Integer; { }
function MySqr(const num: Integer): Integer; { }
begin
Result := num * num;
end;
{ }
procedure MyProc(var x: Integer; fun: TFun);
begin
x := fun(x);
end;
{ }
procedure TForm1.FormCreate(Sender: TObject);
var
n: Integer;
begin
n := 9;
MyProc(n, MySqr);
ShowMessage(IntToStr(n)); {81}
end;
end.
Delphi 2009では、匿名メソッドを使用できます(referenceを使用してメソッドタイプを定義し、コードに書き込みメソッドを使用します).たとえば、次のようになります.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Type
TFun = reference to function(const num: Integer): Integer; { reference }
procedure TForm1.FormCreate(Sender: TObject);
var
fun: TFun;
n: Integer;
begin
{ }
fun := function(const a: Integer): Integer { ; }
begin
Result := a * a;
end;
n := fun(9);
ShowMessage(IntToStr(n)); {81}
{ }
fun := function(const a: Integer): Integer
begin
Result := a + a;
end;
n := fun(9);
ShowMessage(IntToStr(n)); {18}
end;
end.
匿名メソッドを他のメソッドのパラメータとして使用します.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Type
TFun = reference to function(const num: Integer): Integer;
function FunTest(const n: Integer; fun: TFun): string;
begin
Result := Format('%d, %d', [n, fun(n)]);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
f: TFun;
s: string;
begin
f := function(const a: Integer): Integer { ; }
begin
Result := a * a;
end;
s := FunTest(9, f);
ShowMessage(s); {9, 81}
end;
end.