博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi 2009 中的匿名方法(reference to)
阅读量:6205 次
发布时间:2019-06-21

本文共 2731 字,大约阅读时间需要 9 分钟。

  hot3.png

之前我们可以定义方法类型, 然后通过方法类型的变量来使用方法, 譬如:

unit Unit1;interfaceuses  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;interfaceuses  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;interfaceuses  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;interfaceuses  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.

转载于:https://my.oschina.net/hermer/blog/320520

你可能感兴趣的文章
Windows下使用VisualSVN Server搭建SVN服务器
查看>>
重设MYSQL数据库ROOT用户的密码
查看>>
安装linux的准备
查看>>
linux下编译安装MySQL5.6新版本
查看>>
Linux:ps命令以及进程状态详解
查看>>
Soot生成控制流图
查看>>
Spring 的持久化实例(JDBC, JdbcTemplate、HibernateDaoSupport、JdbcDaoSupport、SqlSessionDaoSupport等)...
查看>>
前端解决跨域问题的8种方案
查看>>
验证码(一)
查看>>
如何利用好新浪微博
查看>>
datastage 重启 续
查看>>
从Zabbix数据库中提取内存采集的数据,做内存使用率计算
查看>>
什么是SAS
查看>>
nginx优化与防盗链
查看>>
Openssl的证书格式转换
查看>>
linux 下实现负载均衡群集(NAT方式)
查看>>
我的友情链接
查看>>
linux学习wdlinux学堂
查看>>
修改maven本地仓库位置
查看>>
spring --aop(日志记录)在工程中实际使用
查看>>