项目中有一个FormA , 其中有个procedure1(str1,str2: string); 方法,  也有个button1,当点击button1时创建FormB,并将Self指针、procedure1指针传到FormB中 ,并将FormB模式显示。。现在的问题是:FormB应如何回调FormA的procedure1方法?? 希望大家写清楚点,包括过程的声明、调用格式等。。先谢了。。

解决方案 »

  1.   

    两个窗体的uses写在不同的地方
      

  2.   

    我试过在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 3
    end;但编译时通不过,显示第三行 :no enough actual paramethers;  请问又如何为CallBackProc赋值,以便将来使用??
      

  3.   

    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.
      

  4.   

    我想在构造函数中对FCallBackProc赋值,该怎么处理?
      

  5.   

    修改一下: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.
      

  6.   

    formA
    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.
      

  7.   

    把构造函数
        constructor Create(AOwner: TComponent; ParentForm: TForm; CallBackProc: 
    TCallBackProc);  overload;
    定义到Public下