通常好象都是这样做的:
function EnumWindowsProc(hWnd: HWnd; lParam: Integer): Boolean; stdcall;
begin
   ...
end;
...
EnumWindows(@EnumWindowsProc, 0);现在如果上面那个回调函数是一个对象方法,程序运行就会有问题。
但是对象方法能不能做回调函数呢?
如果能,又该怎么做呢?

解决方案 »

  1.   

    可以,用MethodAddress方法,
    例如:
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        function EnumWindowsProc(hWnd: HWnd; lParam: Integer): Boolean;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.EnumWindowsProc(hWnd: HWnd; lParam: Integer): Boolean;
    begin
       ShowMessage('hello');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      EnumWindows(Self.MethodAddress('EnumWindowsProc'), 0);
    end;
      

  2.   

    不过要注意的是,在
    function TForm1.EnumWindowsProc(hWnd: HWnd; lParam: Integer): Boolean;
    里使用TForm1上的控件时,一定要加上全名:
    如ListBox1一定要写成Form1.ListBox1
      

  3.   

    补充一下,如果用方法作为回调函数,方法必须是public或published,否则methodAddress会返回nil.