委托中 Not enough actual parameters 的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 bluesaga
  • 开始时间 开始时间
B

bluesaga

Unregistered / Unconfirmed
GUEST, unregistred user!
定义如下:
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
 
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer); 的实现在哪?
是不是这样子
procedure TDrawService.OnMouseMove(Shift: TShiftState; X, Y: Integer);
begin
end;
 
少了Sender
TMouseMoveProc = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
 
是的
procedure TDrawService.OnMouseMove(Shift: TShiftState; X, Y: Integer);
begin

end;
 
如果是这样的话,你贴出来的代码并没有错.

新建个工程,就放这些代码是没问题的,肯定是其它地方有错误,比如重复声明什么的
 
to zqw0117:
感谢你的支持!
OnMouseMove定义的时候没有Sender,TMouseMoveProc 的定义应该是一样的吧
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer);
 
加了Sender也一样报错。。
 
代码没错啊
是不是FMouseMoveProc := FDrawService.OnMouseMove后面加了()了

FMouseMoveProc := FDrawService.OnMouseMove; //正确
FMouseMoveProc := FDrawService.OnMouseMove(); //错误
 
让我来得到100分吧!
对于过程变量procvar,@procvar是取该过程的入口指针,@@procvar是取该变量的地址。
过程变量放在赋值运算符的右边时,编译器会把它当作函数调用,你写的:FMouseMoveProc := FDrawService.OnMouseMove
就属于这种情况。
而且
TMouseMoveProc = procedure(Shift: TShiftState; X, Y: Integer) of object;
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer);
TMouseMoveProc是对象方法(TMethod结构),OnMouseMove是普通过程。所以要赋值可以这样:
with TMethod(FMouseMoveProc) do
begin
Code:=@FDrawService.OnMouseMove;
Data:=nil;
end;
 
to 地质灾害:
非常感谢你的帮助。
但是按照你的写法,问题依旧。
 
错误的提示在那里?qq283680636,我看看
 
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer); 是TDrawService的一个方法的话,就可以直接写FMouseMoveProc := FDrawService.OnMouseMove;

TDrawService = class
private
FMouseMoveProc: TMouseMoveProc;
procedure OnMouseMove(Shift: TShiftState; X, Y: Integer);
public
constructor Create; override;
end;

constructor TDrawService.Create;
begin
FMouseMoveProc := OnMouseMove;
end;
 
我是循环一个接口数组,如果有匹配的接口,则把这个接口的方法,赋值给这个委托。
for i:=low(FDrawServiceList) to high(FDrawServiceList) do
begin
if FDrawServiceList.IsMine() then
begin
FMouseMoveProc := FDrawServiceList._OnMouseMove;
break;
end;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
724
import
I
I
回复
0
查看
687
import
I
后退
顶部