unit Unit2;interfacetype
  TMyFunc = function (itest:integer):boolean;  TMyClass = class
  public
    MyFunc: TMyFunc;
    function Func(itest:integer):boolean;
    procedure Test;
  end;  function Func2(itest:integer):boolean;implementationfunction TMyClass.Func(itest:integer):boolean;
begin
  result := True;
end;function Func2(itest:integer):boolean;
begin
  result := True;
end;procedure TMyClass.Test;
begin
  MyFunc := Func2;
  MyFunc := Func; // 为什么这一句无法编译??
end;end.谢谢!

解决方案 »

  1.   

    func返回的是boolean类型的值,
    MyFunc需要的是一个事件的指针,当然编译不过去了。
      

  2.   

    那为什么 MyFunc := Func2; 这一句过去了呢?
      

  3.   

    一个是类方法,一个是普通方法,是有区别的,你要将Func赋值成功,TMyFunc的定义应该是
    TMyFunc = function (itest:integer):boolean of object;
      

  4.   

    TMyFunc = function (owner: sender; itest:integer):boolean;
    这样试下
      

  5.   

    定义里加上of object是可以通过了,但是我这个TMyFunc的定义变了,其他的地方也还是会出现这个问题的。
    如SetWindowsHookEx(iHook, HookProc, hInstance, 0); 
    这时候,如果HookProc如果是未声明为of object时是可以用的,但声明了of object就用不了了。
    我这个HookProc是作为参数传到调用SetWindowsHookEx这样函数的地方的。搜索要同样问题的解决方法:淘金坑说的非常对啊,把类方法转化为32位指针
    但是我不知道怎么做继续请教!
    谢谢!
      

  6.   

    aiirii,你好,我还找到了你回答类似问题的答案:其实我不清楚你要什么,估计你是要这个: FWndProcInstance:  Pointer;//新窗口函数的指针;  
     ...
         FWndProcInstance  :=  MakeObjectInstance(SnapExCallback);  
    问题是你的
    function TSnapPanel.SnapExCallback(var info: SNAP_INFO): Integer; stdcall;和要求的
    原 型:CGSTATUS __stdcall CGOpenSnapEx(HCG hcg,SNAPPROC
    pSnapFunc,void *pParam)根本不同,传进去,会出错的
      

  7.   

    TMyFunc要做为回调函数用的话,你的定义应该加个stdcall的调用约定。
    你的Func定义在类外面不就可以了,也可以定义一个新的函数封装Func的调用,何必非要把一个类函数当回调函数用呢。
      

  8.   

    Func定义在类外面不就可以了:
      Func需要用到类里的东西。
      

  9.   

    你可以试试定义一个回调函数来调用类方法:
    function Func3(itest:integer):boolean;stacall;
    var
      AClass: TMyClass;
    begin
      AClass := TMyClass.Create;
      Result := AClass.Func();
    end;
    回调函数就使用Func3
      

  10.   

    hahafan,谢谢你。
    但是这样还是不行,对TMyClass里的内容进行了一定的操作后再调用.Func()才有用。其实还有另外一个方法,就是把Func()的地址直接付给 一个pointer,但我不知道怎么做。