文章来源:
http://anony3721.blog.163.com/blog/static/5119742010866050589/
一.主单元
1 unit UnMain; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.jpeg, 8 Vcl.ExtCtrls; 9 10 type11 TFrmMain = class(TForm)12 Edit1: TEdit;13 Button1: TButton;14 Image1: TImage;15 procedure Button1Click(Sender: TObject);16 private17 { Private declarations }18 procedure Test(str:string); { 定义一个用于回调的过程}19 public20 { Public declarations }21 end;22 23 var24 FrmMain: TFrmMain;25 26 implementation27 { 引用子窗体单元}28 uses UnChild;29 { $R *.dfm}30 31 procedure TFrmMain.Button1Click(Sender: TObject);32 begin33 { 调用Unit2的接口方法}34 CallUnit2(test);35 end;36 37 { 回调过程的实现部分}38 procedure TFrmMain.test(str: string);39 begin40 { 将str值副给Edit1}41 Edit1.Text:=str;42 end;43 44 end.
二.子单元
1 unit UnChild; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 8 9 type10 TFuncCallBack = procedure(str:string) of object;11 TFrmChild = class(TForm)12 Edit1: TEdit;13 Button1: TButton;14 procedure Button1Click(Sender: TObject);15 private16 public17 { 定义一个回调函数类型的变量}18 aFuncCallBack:TFuncCallBack;19 end;20 { 提供给Unit1调用的接口方法,注意里面的参数的类型}21 procedure CallUnit2(FuncCallBack:TFuncCallBack);22 var23 FrmChild: TFrmChild;24 25 implementation26 27 { $R *.dfm}28 { 接口方法的实现部分}29 procedure CallUnit2(FuncCallBack:TFuncCallBack);30 begin31 Application.CreateForm(TFrmChild,FrmChild);32 { 将参数赋值给FuncCallBack}33 FrmChild.aFuncCallBack:=FuncCallBack;34 FrmChild.ShowModal;35 end;36 37 procedure TFrmChild.Button1Click(Sender: TObject);38 begin39 { 当点击Form2的按钮时将Form2中的Edit的值传递给了Form1中的Edit}40 { 是不是很神奇?我并没有uses Unit1,但却改变了Form1中Edit的Text属性}41 aFuncCallBack(Edit1.Text);42 ModalResult:=mrOk;43 end;44 45 end.