加载中…
个人资料
步惊云
步惊云
  • 博客等级:
  • 博客积分:0
  • 博客访问:10,636
  • 关注人气:3
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

什么是回调函数?

(2020-05-28 20:55:51)
分类: FMX$Datasnap

回调函数,说穿了就是把回调函数当成主调函数的参数,也就是把回调函数地址传给主调函数,在主调函数体中适时调用回调函数。这样当主调函数调用时,回调函数也被调用了。

在主调函数定义时,在主周函数调用时传实参。

1、定义回调函数原型。

type

//函数或过程数据类型,类型必须与回调函数完全一致,如果是类的成员,要加of object

TProc=procedure (S:string) ;。

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

2、定义回调函数。

回调函数就是一个普通的函数而已。

procedure Test(S:string);

begin

    ShowMessage(S);

end;

3、定义主调函数。

这个是主调函数,该函数是一个特别的函数,特别之处在于这个函数有参数是函数或过程类型。

procedure dotest(value:string;Proc:TProc);

begin

//此处调用回调函数,objectpascal规定可用过程变量名代替函数名进行函数调用

    Proc(value);  //此时传形参

end;

4、执行主调函数

//执行主调函数,此时回调函数的函数名称是主调函数的一个参数

procedure TForm1.Button1Click(Sender: TObject);

begin

    dotest('这是测试程序',test);  //此处传实参

end;

5、回调函数有什么用?

这样做有两个用途。

一是主调函数只要管函数的格式,而不需要知道函数是如何实现的,例如,上述主调函数的参数TProc只是一个函数原型,所有符合这个原型的函数,不管是怎么实现的,总可以传给主调函数调用,这样很灵活。

二是主调函数与回调函数可以不在同一物理空间。例如,客户端调用datasnap rest服务器上的一个主调函数,而这个主调函数有一个参数是回调函数,回调函数的实现是在客户端,这样可以实现服务器对客户端函数的调用。datasnap rest的向客户端推送广播消息,使用的就量回调机制,具体参考http://blog.sina.com.cn/s/blog_61214b550102z0kk.html

回调函数是现代编程的基础技术,在WEB编程时使用非常广泛。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有