当前位置:  开发笔记 > 编程语言 > 正文

我可以在事件处理程序上使用闭包(即TButton OnClick)

如何解决《我可以在事件处理程序上使用闭包(即TButtonOnClick)》经验,为你挑选了2个好方法。

如果我尝试在事件处理程序上使用闭包,编译器会抱怨:

不兼容的类型:"方法指针和常规过程"

我理解..但有没有办法在方法指针上使用clouser?以及如何定义是否可以?

例如:

Button1.Onclick = procedure( sender : tobject ) begin ... end;

谢谢!



1> 小智..:
@Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) 
begin 
  ((sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!' 

end )^ ) + $0C)^;

适用于Delphi 2010



2> Hans-Eric..:

一个很好的问题.

据我所知,在当前版本的Delphi中不可能做到.这非常不幸,因为这些匿名过程对于快速设置对象的事件处理程序非常有用,例如在xUnit类型的自动测试框架中设置测试夹具时.

CodeGear应该有两种方法来实现此功能:

1:允许创建匿名方法.像这样的东西:

Button1.OnClick := procedure( sender : tobject ) of object begin
  ...
end;

这里的问题是作为匿名方法的自指针放置的内容.可以使用创建匿名方法的对象的self指针,但是只能从对象上下文创建匿名方法.更好的想法可能是在幕后创建一个虚拟对象以包含匿名方法.

2:或者,可以允许事件类型接受方法和过程,只要它们共享定义的签名即可.这样您就可以按照自己的方式创建事件处理程序:

Button1.OnClick := procedure( sender : tobject ) begin
  ...
end;

在我看来,这是最好的解决方案.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有