读书人

难道就没办法把一个类函数转成非类函数

发布时间: 2012-03-13 11:21:12 作者: rapoo

难道就没办法把一个类函数转成非类函数类型吗?
例如,
SetWindowsHookEx方法需要一个TFNHookProc函数
其定义是:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
但我把具体操作写在类函数里面了,
如果硬要把函数提出来,就要把好多成员都提出来,感觉很不好。

MakeObjectInstance都有办法把TWndMethod转成指针,我想应该有办法才对呀。

[解决办法]
参考一下这篇文章, 也许正是楼主想要的答案:
http://www.delphifans.com/infoView/Article_216.html
[解决办法]
普通函数和方法(类函数)的区别就是方法隐含着一个Self参数

procedure TForm1.Button1Click(Sender: TObject); // 方法
--> >
procedure Button1Click(Self: TForm1; Sender: TObject); // 普通函数

//参考如下代码

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function EnumFunc({hwnd: HWND隐含掉}lParam: LPARAM): BOOL; stdcall;
public
{ Public declarations }
end;
//...

procedure TForm1.Button1Click(Sender: TObject);
type
TEnumFunc = function ({hwnd: HWND隐含掉}lParam: LPARAM): BOOL stdcall of object;
var
vEnumFunc: TEnumFunc;
begin
vEnumFunc := EnumFunc;
EnumChildWindows(Handle, TMethod(vEnumFunc).Code, Integer(Self))
end;

function TForm1.EnumFunc(lParam: LPARAM): BOOL;
var
hwnd: THandle absolute Self;
begin
//Self已经不能用 Memo1也不能访问
TForm1(lParam).Memo1.Lines.Add(IntToStr(hwnd));
Result := True;
end;

//其实一般的回调函数都有一个预留参数,在调用的时候写入,在回调的时候读取

读书人网 >.NET

热点推荐