定义一个type PFCALLBACK = function(Param1:integer;Param2:integer):integer;stdcall;回调函数
然后声明function CBFunc(Param1:integer;Param2:integer):integer;stdcall;
接着我在实现回调函数的功能的时候,就是上面这个函数里面无法使用self,它说未定义。而我想在这个实现回调函数功能的函数里
调用窗口上的一个Button功能,要怎么样实现呢?
然后声明function CBFunc(Param1:integer;Param2:integer):integer;stdcall;
接着我在实现回调函数的功能的时候,就是上面这个函数里面无法使用self,它说未定义。而我想在这个实现回调函数功能的函数里
调用窗口上的一个Button功能,要怎么样实现呢?
一般情况下,回调函数都是全局的,因此你要调用某个实例中的对象,就需要传入参数了。
如下:
type PFCALLBACK = function(Param1:integer;Param2:integer;Button: TButton):integer;stdcall;
定义一个type PFCALLBACK = function(Param1:integer;Param2:integer):integer of object;stdcall;回调函数
然后声明在窗口类里声明 function CBFunc(Param1:integer;Param2:integer):integer;stdcall;
不行,会报错。我现在只是在我网上看到的一个代码,他原来是在回调函数里面用了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.
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不就可以了
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
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