定义如下:
TMouseMoveProc = procedure(Shift: TShiftState; X, Y: Integer) of object; 
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer); 
FMouseMoveProc: TMouseMoveProc; 
出错代码如下:
FMouseMoveProc := FDrawService.OnMouseMove 
出错信息:
[Error] HisView.pas(111): Not enough actual parameters   

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMouseMoveProc = procedure(Shift: TShiftState; X, Y: Integer) of object;
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        FMouseMoveProc: TMouseMoveProc;
        procedure OnMouseMove(Shift: TShiftState; X, Y: Integer);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.OnMouseMove(Shift: TShiftState; X, Y: Integer);
    beginend;procedure TForm1.Button1Click(Sender: TObject);
    begin
    FMouseMoveProc := OnMouseMove;
    end;end.
      

  2.   

    FDrawService.OnMouseMove 是哪里来的?
      

  3.   

    感谢二位支持!
    现在知道错误信息什么意思。
    两个定义是一样的,但是为什么编译的时候会报错?
    另:加上Sender参数也一样报错。
      

  4.   

    可能你的OnMouseMove有问题,建议改个名字试试。unit Unit3;interfaceuses
      Classes;type
      TMyProcedure=Procedure() of Object;
      testThread = class(TThread)
      private
        F_ProcFuncMemoryAddress:TMyProcedure;
        F_para:String;    Procedure SetThreadFunction(_MyProcedure:TMyProcedure);
        Procedure SetPara(_Para:String);
      protected
        procedure Execute; override;
      published
        property ThreadFunction:TMyProcedure write SetThreadFunction;
        property ThreadPara:String Write SetPara;
      end;implementation{ testThread }procedure testThread.Execute;
    begin
      FreeOnTerminate:=true;
      Synchronize(F_ProcFuncMemoryAddress);
      //F_ProcFuncMemoryAddress(F_para);
    end;procedure testThread.SetPara(_Para: String);
    begin
      F_Para:=_Para;
    end;procedure testThread.SetThreadFunction(_MyProcedure:TMyProcedure);
    begin
      F_ProcFuncMemoryAddress:=_MyProcedure;
    end;end.
      

  5.   

    to 失踪的月亮:
    非常感谢你,按你的例子没问题。
    OnMouseMove 我在一个接口中定义了这个方法,FDrawService就是那个接口
    FMouseMoveProc := FDrawService.OnMouseMove;
    这样就报错,不知道什么原因 
      

  6.   

    应该这样吧FMouseMoveProc := 接口实现 as FDrawService.OnMouseMove; 
      

  7.   

    用两种方法都可以.
    TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        FMouseMoveProc: TMouseMoveProc;
      public
        { Public declarations }
        property MouseMoveProc: TMouseMoveProc read FMouseMoveProc write FMouseMoveProccode;
      end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //第一种方法
      MouseMoveProc := FDrawService.OnMouseMove;
      
      //第二种方法
      FMouseMoveProc(FDrawService.OnMouseMove);
    end;
      

  8.   

    to 失踪的月亮:
    我是循环一个接口数组,如果有匹配的接口,则把这个接口的方法,赋值给这个委托。
      for i:=low(FDrawServiceList) to high(FDrawServiceList) do
      begin
        if FDrawServiceList[i].IsMine() then
        begin
          FMouseMoveProc := FDrawServiceList[i]._OnMouseMove;
          break;
        end;
      end;