定义一个type PFCALLBACK = function(Param1:integer;Param2:integer):integer;stdcall;回调函数
然后声明function CBFunc(Param1:integer;Param2:integer):integer;stdcall;
接着我在实现回调函数的功能的时候,就是上面这个函数里面无法使用self,它说未定义。而我想在这个实现回调函数功能的函数里
调用窗口上的一个Button功能,要怎么样实现呢?

解决方案 »

  1.   

    沒太明白你的意思,上面這個函數就是傳來二個整數進去,返回一個整數出來。跟BUTTON沒有什麼關系啊?
      

  2.   

    如果你一定要调用button功能,你就在参数中增加一个参数好了。
    一般情况下,回调函数都是全局的,因此你要调用某个实例中的对象,就需要传入参数了。
    如下:
    type PFCALLBACK = function(Param1:integer;Param2:integer;Button: TButton):integer;stdcall;
      

  3.   

    你的函数里的self指向谁呢?你的函数又不是类的成员函数。
      

  4.   

    回一楼的,这个回调函数我只是打了个比方,写的比较简单一点,我实际操作的回调函数是需要返回一些值的,我需要根据那些值在窗口上的listview里面显示出来,并且还要根据需要调用buttonClick
      

  5.   

    你传啥进去也没self啊,除非你自己给一个参数起名叫Self
      

  6.   


    定义一个type PFCALLBACK = function(Param1:integer;Param2:integer):integer of object;stdcall;回调函数 
    然后声明在窗口类里声明 function CBFunc(Param1:integer;Param2:integer):integer;stdcall; 
      

  7.   


    不行,会报错。我现在只是在我网上看到的一个代码,他原来是在回调函数里面用了self,但我在编译的时候却会报错,我就改成showMessage是可以的。
    我按照你说的改了后却会报错。我把代码贴出来,你看下unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     type PFCALLBACK = function(Param1:integer;Param2:integer):integer  of object;stdcall;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      
     // 定义回调函数的类型
    var
      Form1: TForm1;
      gCallBack:PFCALLBACK;
      function CBFunc(Param1:integer;Param2:integer):integer ;stdcall;
    implementation
    //回调函数需要定义为全局
    {$R *.dfm}///实现回调函数的功能
    function CBFunc(Param1:integer;Param2:integer):integer;
    var i:integer;
    begin
    //messagebox(application.Handle,'回调函数','提示信息',mb_ok);
      for i:=0 to 100 do
      begin
          sleep(100);
          //self.ListBox1.Items.Add('回调函数'); //在这里会报错,所以我只能注释掉
          ShowMessage('回调函数');
      end;
    end;
    ///
    function MyThreadFunc(P:pointer):Longint;stdcall;
    begin
      gCallBack(0,1);//简单传个参数
    end;procedure testpro ;
    var i:integer;
       hThread:Thandle;//定义一个句柄
      ThreadID:DWord;
    begin
      for i:=0 to 4 do
      begin
          messagebox(application.Handle,'123','提示信息',mb_ok);
          if (i=2) then
          begin
              hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
          end;
      end;
    end;
    ///
    function TestCallBack( Func:PFCALLBACK ):integer;
    begin
      gCallBack:=Func;
      testpro;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //testpro;
      TestCallBack(@CBFunc);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     self.ListBox1.Clear;
    end;
    end.
      

  8.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PFCALLBACK = function(Param1:integer;Param2:integer):integer ;stdcall;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end; // 定义回调函数的类型
    var
      Form1: TForm1;
      gCallBack:PFCALLBACK;
      function CBFunc(Param1:integer;Param2:integer):integer ;stdcall;
    implementation{$R *.dfm}///实现回调函数的功能
    function CBFunc(Param1:integer; Param2:integer):integer;
    var i:integer;
    begin
     messagebox(application.Handle,'回调函数','提示信息',mb_ok);
      for i:=0 to 100 do
      begin
          sleep(100);
          Form1.ListBox1.Items.Add('回调函数'); //在这里会报错,所以我只能注释掉
          ShowMessage('回调函数');
      end;
    end;
    ///
    function MyThreadFunc(P:pointer):Longint;stdcall;
    begin
      gCallBack(0, 1);//简单传个参数
    end;procedure testpro ;
    var
      i:integer;
      hThread:Thandle;//定义一个句柄
      ThreadID:DWord;
    begin
      for i:=0 to 4 do
      begin
          messagebox(application.Handle,'123','提示信息',mb_ok);
          if (i=2) then
          begin
              hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
          end;
      end;
    end;
    ///
    function TestCallBack(Func :PFCALLBACK ):integer;
    begin
      gCallBack:=Func;
      testpro;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //testpro;
      TestCallBack(CBFunc);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     self.ListBox1.Clear;
    end;
    end.
    你用窗口名字代替Self不就可以了
      

  9.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PFCALLBACK = function(Param1:integer;Param2:integer):integer of object ;stdcall;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        function CBFunc(Param1:integer;Param2:integer):integer ;stdcall;
        { Public declarations }
      end; // 定义回调函数的类型
    var
      Form1: TForm1;
      gCallBack:PFCALLBACK;implementation{$R *.dfm}///实现回调函数的功能
    function TForm1.CBFunc(Param1:integer; Param2:integer):integer;
    var i:integer;
    begin
     messagebox(application.Handle,'回调函数','提示信息',mb_ok);
      for i:=0 to 100 do
      begin
          sleep(100);
          Form1.ListBox1.Items.Add('回调函数'); //在这里会报错,所以我只能注释掉
          ShowMessage('回调函数');
      end;
    end;
    ///
    function MyThreadFunc(P:pointer):Longint;stdcall;
    begin
      gCallBack(0, 1);//简单传个参数
    end;procedure testpro ;
    var
      i:integer;
      hThread:Thandle;//定义一个句柄
      ThreadID:DWord;
    begin
      for i:=0 to 4 do
      begin
          messagebox(application.Handle,'123','提示信息',mb_ok);
          if (i=2) then
          begin
              hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
          end;
      end;
    end;
    ///
    function TestCallBack(Func :PFCALLBACK ):integer;
    begin
      gCallBack:=Func;
      testpro;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //testpro;
      TestCallBack(CBFunc);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     self.ListBox1.Clear;
    end;
    end.这样改就可以使用Self 
      

  10.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PFCALLBACK = function(Param1:integer;Param2:integer):integer of object ;stdcall;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        function CBFunc(Param1:integer;Param2:integer):integer ;stdcall;
        { Public declarations }
      end; // 定义回调函数的类型
    var
      Form1: TForm1;
      gCallBack:PFCALLBACK;implementation{$R *.dfm}///实现回调函数的功能
    function TForm1.CBFunc(Param1:integer; Param2:integer):integer;
    var i:integer;
    begin
     messagebox(application.Handle,'回调函数','提示信息',mb_ok);
      for i:=0 to 100 do
      begin
          sleep(100);
          Self.ListBox1.Items.Add('回调函数'); //在这里会报错,所以我只能注释掉
          ShowMessage('回调函数');
      end;
    end;
    ///
    function MyThreadFunc(P:pointer):Longint;stdcall;
    begin
      gCallBack(0, 1);//简单传个参数
    end;procedure testpro ;
    var
      i:integer;
      hThread:Thandle;//定义一个句柄
      ThreadID:DWord;
    begin
      for i:=0 to 4 do
      begin
          messagebox(application.Handle,'123','提示信息',mb_ok);
          if (i=2) then
          begin
              hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
          end;
      end;
    end;
    ///
    function TestCallBack(Func :PFCALLBACK ):integer;
    begin
      gCallBack:=Func;
      testpro;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //testpro;
      TestCallBack(CBFunc);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     self.ListBox1.Clear;
    end;
    end.
    这样改就可以使用Self