用例子来说明,以下为一个例子:
功能大体描述:Form1中有一个Edit和一个Button,当点击BUTTON时弹出FORM2,FORM2中也有一个EDIT和一个BUTTON,当点击FORM2中的BUTTON时,将FORM2中的EDIT的TEXT属性赋值给FORM1中的EDIT的TEXT。
unit Unit1;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
interface
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
uses
Windows
,
Messages
,
SysUtils
,
Variants
,
Classes
,
Graphics
,
Controls
,
Forms
,
Dialogs
,
StdCtrls;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
type
TForm1
=
class(TForm)
{主窗体中放一个Edit和一个Button}
Edit1
:
TEdit;
Button1
:
TButton;
procedure Button1Click(Sender
:
TObject);
private
{ Private declarations }
{定义一个用于回调的过程}
procedure test(str
:
string);
public
{ Public declarations }
end;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
var
Form1
:
TForm1;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
implementation
{引用unit2}
uses unit2;
{
$R
*.
dfm}
{回调过程的实现部分}
procedure TForm1
.
test(str
:
string);
begin
{将str值副给Edit1}
Edit1
.
Text
:=
str;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
procedure TForm1
.
Button1Click(Sender
:
TObject);
begin
{调用Unit2的接口方法}
CallUnit2(test);
end;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
end
.
unit Unit2;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
interface
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
uses
Windows
,
Messages
,
SysUtils
,
Variants
,
Classes
,
Graphics
,
Controls
,
Forms
,
Dialogs
,
StdCtrls;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
type
{定义一个回调函数类型}
TFuncCallBack
=
procedure(str
:
string) of object;
TForm2
=
class(TForm)
{Form2中也有一个Edit和一个Button}
Edit1
:
TEdit;
Button1
:
TButton;
procedure Button1Click(Sender
:
TObject);
private
{ Private declarations }
{定义一个回调函数类型的变量}
aFuncCallBack
:
TFuncCallBack;
public
{ Public declarations }
end;
{提供给Unit1调用的接口方法
,
注意里面的参数的类型}
procedure CallUnit2(FuncCallBack
:
TFuncCallBack);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
var
Form2
:
TForm2;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
implementation
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
{
$R
*.
dfm}
{接口方法的实现部分}
procedure CallUnit2(FuncCallBack
:
TFuncCallBack);
begin
Application
.
CreateForm(TForm2
,
Form2);
{将参数赋值给FuncCallBack}
Form2
.
aFuncCallBack
:=
FuncCallBack;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
Form2
.
ShowModal;
end;
procedure TForm2
.
Button1Click(Sender
:
TObject);
begin
{当点击Form2的按钮时将Form2中的Edit的值传递给了Form1中的Edit}
{是不是很神奇?我并没有uses Unit1
,
但却改变了Form1中Edit的Text属性}
aFuncCallBack(Edit1
.
Text);
ModalResult
:=
mrOk;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
end
.
另外,关于回调函数,可以看一下这个地址:
http://www.cnblogs.com/newtekboy/archive/2010/05/23/1742092.html