5,927
社区成员




procedure TForm5.Button2Click(Sender: TObject);
var
Timer: TTimer;
PosX: Integer;
lblMessage: TLabel;
begin
PosX := 0;
lblMessage := TLabel.Create(Self);
lblMessage.Parent := Self;
lblMessage.Caption := 'Moving Text';
Timer := TTimer.Create(nil);
Timer.Interval := 50;
Timer.OnTimer := procedure(Sender: TObject)
begin
PosX := PosX + 2;
lblMessage.Left := PosX;
end; //这里提示错误E2010 Incompatible types: 'TNotifyEvent' and 'Procedure'的错误
// 。。。
end;
--------提示错误E2010 Incompatible types: 'TNotifyEvent' and 'Procedure'的错误
================================
但我新建项目测试时可以通过的:
procedure TForm5.Button1Click(Sender: TObject);
var
proc: TProc;
begin
proc := procedure
begin
ShowMessage('匿名方法测试成功!');
end;
proc(); // 执行匿名方法
end;
有知道的大佬指点一二!
是可以的:
procedure TForm1.Button2Click(Sender: TObject);
type
TNotifyEventRef = reference to procedure(Sender: TObject);
TVMT = array[0..3] of pointer;
PVMT = ^TVMT;
var
R: TNotifyEventRef;
P: ^PVMT absolute R;
M: TMethod;
n: integer;
begin
R := procedure(Sender: TObject)
begin
Memo1.Lines.Add(n.ToString);
Dec(n);
if n < 1 then Timer1.Enabled := false;
end;
M.Code := P^^[3];
M.Data := P;
n := 10;
Timer1.OnTimer := TNotifyEvent(M);
Timer1.Enabled := true;
end;
因为事件是方法指针(隐含的TMethod),不是普通的函数指针或者方法引用,而匿名函数是方法引用。
技术上是可以转换方法引用到方法指针的,但是存在一定风险,因为方法引用是带引用计数的,超出使用它的作用域之后会被释放掉,此后再触发事件会出现运行时问题(如果匿名函数中捕获了外部变量就会很严重)。
奇怪,我使用函数就可以:
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessageFmt('x + y = %d', [Calc(10, 15,
function(x, y: Integer): Integer
begin
Result := x + y;
end)]);
end;