定义如下:
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
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
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.
现在知道错误信息什么意思。
两个定义是一样的,但是为什么编译的时候会报错?
另:加上Sender参数也一样报错。
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.
非常感谢你,按你的例子没问题。
OnMouseMove 我在一个接口中定义了这个方法,FDrawService就是那个接口
FMouseMoveProc := FDrawService.OnMouseMove;
这样就报错,不知道什么原因
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;
我是循环一个接口数组,如果有匹配的接口,则把这个接口的方法,赋值给这个委托。
for i:=low(FDrawServiceList) to high(FDrawServiceList) do
begin
if FDrawServiceList[i].IsMine() then
begin
FMouseMoveProc := FDrawServiceList[i]._OnMouseMove;
break;
end;
end;