关于回调的机制。。。请各位大哥帮忙。 项目中有一个FormA , 其中有个procedure1(str1,str2: string); 方法, 也有个button1,当点击button1时创建FormB,并将Self指针、procedure1指针传到FormB中 ,并将FormB模式显示。。现在的问题是:FormB应如何回调FormA的procedure1方法?? 希望大家写清楚点,包括过程的声明、调用格式等。。先谢了。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两个窗体的uses写在不同的地方 我试过在FormB中增加两个域,FParentForm: TForm ; FCallBackProc: TCallBackProc ;其中TCallBackProc=procedure (str1,str2: string) of object;重载FormB的构造函数 constructor TFormB.Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc) ; reintroduce; overload;begin Inherited create (AOwner); // line 1 if ParentForm<>nil then FParentForm:=ParentForm; //line 2 if CallBackProc<> nil then FCallBackProc:=CallBackProc; //line 3end;但编译时通不过,显示第三行 :no enough actual paramethers; 请问又如何为CallBackProc赋值,以便将来使用?? FormA的代码:unit Unit1;interfaceuses Unit2, Forms, Dialogs, StdCtrls, Classes, Controls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}procedure P1(str1, str2: string);begin ShowMessage (str1 + ', ' + str2); //在这个示例中, 只是将回调的参数显示了出来end;procedure TForm1.Button1Click(Sender: TObject);var F : TFormB;begin F:= TFormB.Create(Self); try F.SetCallback(@P1); F.ShowModal(); finally F.Free; end;end;FormB的代码:unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type CallbackProcedure = procedure (str1, str2: String);type TFormB = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private F_P : CallbackProcedure; public procedure SetCallback(P: CallbackProcedure); end;var FormB: TFormB;implementation{$R *.dfm}procedure TFormB.SetCallback(P: CallbackProcedure);begin F_P := P;end;procedure TFormB.Button1Click(Sender: TObject);begin F_P('Hello', 'World'); //回调end;end.end. 我想在构造函数中对FCallBackProc赋值,该怎么处理? 修改一下:FormA的代码:unit Unit1;interfaceuses Unit2, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure P1(str1, str2: String);begin ShowMessage (str1 + ', ' + str2);end;procedure TForm1.Button1Click(Sender: TObject);var F : TFormB;begin F := TFormB.Create(Self, Self, @P1); try F.ShowModal(); finally F.Free(); end;end;end.FormB的代码:unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TCallBackProc = procedure (str1, str2: string); TFormB = class(TForm) Button1: TButton; constructor Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc); overload; procedure Button1Click(Sender: TObject); private FParentForm : TForm; FCallBackProc : TCallBackProc; public end;var FormB: TFormB;implementation{$R *.dfm}constructor TFormB.Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc);begin Inherited create (AOwner); if ParentForm <> nil then FParentForm := ParentForm; //这个参数有这里没有什么作用,楼主可以考虑将其删除 FCallBackProc := CallBackProc;end;procedure TFormB.Button1Click(Sender: TObject);begin FCallBackProc ('Hello', 'World');end;end. formAprocedure TformA.Button1Click(Sender: TObject);begin with TFormB.Create(self,FFindGrid) do ShowModal;end;formBunit FindGrid;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;type TFindGridEvent = procedure (ASubStr: string; AFlag: integer) of object; formB= class(TForm) eSubStr: TEdit; Label1: TLabel; RadioGroup1: TRadioGroup; rbUp: TRadioButton; rbDown: TRadioButton; bitFind: TBitBtn; bitCancel: TBitBtn; procedure bitFindClick(Sender: TObject); private { Private declarations } FFindGrid : TFindGridEvent; public { Public declarations } constructor Create(AOwner: TComponent; AOnFindGrid: TFindGridEvent = nil); reintroduce; end;var formB: TformB;implementation{$R *.dfm}constructor TformB.Create(AOwner: TComponent; AOnFindGrid: TFindGridEvent);begin inherited Create(AOwner); FFindGrid := AOnFindGrid; end;procedure TformB.bitFindClick(Sender: TObject);begin if Trim(eSubStr.Text) = '' then Application.MessageBox('请输入查询条件', '系统提示', MB_OK) else begin if rbUp.Checked then FFindGrid(eSubStr.Text,1) else FFindGrid(eSubStr.Text,0); end;end;end. 把构造函数 constructor Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc); overload;定义到Public下 delphi7.0应用程序中如何调用C#.NET2005编写的动态库 怎样在报表里面循环打印呢? 求Delphi7从入门到精通 关于Excel行数 求一函数16进制转换为ascii 出现“多步操作产生错误,请检查每一步的状态值”错误,求解决 delphi打印问题 有没有上海交通大学的? Delphi里有没有像VB中Left$、Mid$、Right$这样的字符串函数? paintbox重画 请问dngrideh如何在鼠标点击一下时就进入编辑状态,如何在输入内容后不用按回车就保存输入内容阿 关于 TreeView1 控件的使用问题-----------在线等待!!!!
constructor TFormB.Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc) ; reintroduce; overload;
begin
Inherited create (AOwner); // line 1
if ParentForm<>nil then FParentForm:=ParentForm; //line 2
if CallBackProc<> nil then FCallBackProc:=CallBackProc; //line 3
end;但编译时通不过,显示第三行 :no enough actual paramethers; 请问又如何为CallBackProc赋值,以便将来使用??
Unit2, Forms, Dialogs, StdCtrls, Classes, Controls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;var
Form1: TForm1;implementation{$R *.dfm}procedure P1(str1, str2: string);
begin
ShowMessage (str1 + ', ' + str2); //在这个示例中, 只是将回调的参数显示了出来
end;procedure TForm1.Button1Click(Sender: TObject);
var
F : TFormB;
begin
F:= TFormB.Create(Self);
try
F.SetCallback(@P1);
F.ShowModal();
finally
F.Free;
end;
end;
FormB的代码:
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
CallbackProcedure = procedure (str1, str2: String);type
TFormB = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
F_P : CallbackProcedure;
public
procedure SetCallback(P: CallbackProcedure);
end;var
FormB: TFormB;implementation{$R *.dfm}procedure TFormB.SetCallback(P: CallbackProcedure);
begin
F_P := P;
end;procedure TFormB.Button1Click(Sender: TObject);
begin
F_P('Hello', 'World'); //回调
end;end.end.
Unit2, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure P1(str1, str2: String);
begin
ShowMessage (str1 + ', ' + str2);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
F : TFormB;
begin
F := TFormB.Create(Self, Self, @P1);
try
F.ShowModal();
finally
F.Free();
end;
end;end.
FormB的代码:
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TCallBackProc = procedure (str1, str2: string); TFormB = class(TForm)
Button1: TButton;
constructor Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc); overload;
procedure Button1Click(Sender: TObject);
private
FParentForm : TForm;
FCallBackProc : TCallBackProc;
public
end;var
FormB: TFormB;implementation{$R *.dfm}
constructor TFormB.Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: TCallBackProc);
begin
Inherited create (AOwner);
if ParentForm <> nil then FParentForm := ParentForm; //这个参数有这里没有什么作用,楼主可以考虑将其删除
FCallBackProc := CallBackProc;
end;procedure TFormB.Button1Click(Sender: TObject);
begin
FCallBackProc ('Hello', 'World');
end;end.
procedure TformA.Button1Click(Sender: TObject);
begin
with TFormB.Create(self,FFindGrid) do
ShowModal;
end;
formB
unit FindGrid;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TFindGridEvent = procedure (ASubStr: string; AFlag: integer) of object;
formB= class(TForm)
eSubStr: TEdit;
Label1: TLabel;
RadioGroup1: TRadioGroup;
rbUp: TRadioButton;
rbDown: TRadioButton;
bitFind: TBitBtn;
bitCancel: TBitBtn;
procedure bitFindClick(Sender: TObject);
private
{ Private declarations }
FFindGrid : TFindGridEvent;
public
{ Public declarations }
constructor Create(AOwner: TComponent;
AOnFindGrid: TFindGridEvent = nil); reintroduce;
end;var
formB: TformB;implementation{$R *.dfm}
constructor TformB.Create(AOwner: TComponent;
AOnFindGrid: TFindGridEvent);
begin
inherited Create(AOwner);
FFindGrid := AOnFindGrid;
end;procedure TformB.bitFindClick(Sender: TObject);
begin
if Trim(eSubStr.Text) = '' then
Application.MessageBox('请输入查询条件', '系统提示', MB_OK)
else
begin
if rbUp.Checked then
FFindGrid(eSubStr.Text,1)
else
FFindGrid(eSubStr.Text,0);
end;
end;end.
constructor Create(AOwner: TComponent; ParentForm: TForm; CallBackProc:
TCallBackProc); overload;
定义到Public下