导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/6/14 10:28:17
标题:
加入我的收藏
楼主:
procedure TForm5.FormCreate(Sender: TObject); begin btn1.OnClick := procedure (Sender: TObject) begin ShowMessage('玩delphi的都有病?'); end; end; 我不想为这个点击声明个方法..
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
dmzn (dmzn)
★☆☆☆☆
-
盒子活跃会员
2019/6/14 11:12:31
1楼:
OnClick = procedure (Sender: TObject) of object,是一个带有object指针的方法. 匿名函数是一个普通的procedure.
----------------------------------------------
生活愉快.
作者:
2019/6/14 11:17:58
2楼:
dmzn 那怎么解决?
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
2019/6/14 13:45:03
3楼:
type TNotifyEventRef = reference to procedure(Sender: TObject); function AnonymousEvent(const Proc: TNotifyEventRef): TNotifyEvent; type TVtable = array[0..3] of Pointer; PVtable = ^TVtable; PPVtable = ^PVtable; begin TMethod(Result).Code := PPVtable((@Proc)^)^^[3]; TMethod(Result).Data := Pointer((@Proc)^); end; procedure TForm1.FormCreate(Sender: TObject); begin //变态写法 @Button1.OnClick := PPointer(Cardinal(PPointer( procedure(Sender: TObject) begin ShowMessage('你好,人民币!'); end)^) + $0C)^; //正经写法 Button2.OnClick := AnonymousEvent( procedure(Sender: TObject) begin ShowMessage('Hello,Money!'); end); end;
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/6/14 14:37:28
4楼:
earthsbest 都挺恶心的..
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
2019/6/14 16:03:26
5楼:
type TNotifyEventA = reference to procedure(ASender:TObject); procedure TForm3.Button1Click(Sender: TObject); begin Button2.OnClick := TAnonEvent.Wrap<TNotifyEventA,TNotifyEvent>(procede (sender: tObject) begin Button2.Caption:=DateTimeToStr(Now); ShowMessage('楼主有病?'); end); Button2.OnClick(Sender); end;
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/6/15 0:52:49
6楼:
TNotifyEvent 实际上是一个TMethodType, 包含Code 和 Data.Code 是函数的入口指针, Data就是Self. 匿名函数实际上是一个接口, 接口的虚方法表 前三个表项是QueryInterface, AddRef/Release的指针, 第四个是Invoke, 就是自定义的 匿名函数。 当我们定义一个匿名函数的时候,Delphi实际上生成一个 实现 (implement) 上面所说接口的TInterfacedObject的子类,并且捕获(Capture)堆栈上的本地变量,将它们转换为那个子类的公共变量。 Delphi的这种做法,跟C++标准中 匿名函数和Lamda 函数的编译器处理比较接近。 另外,三楼和五楼的方法, 回避了 Self 的 捕获问题。Delphi 32位编译器的对VCL 事件响应函数calling convention 是register, 64位编译器更是大量利用register来传递参数。Self 变量不存在于本地堆栈上,所以Self 不能被Capture, 需要用其它方法。 最后,说句题外话。 这个论坛上的江湖高人很多,有野狐派,也有学术派。很希望看到 更多的有真正技术含量的帖子,少炫技,多讲道理。少做广告;另外,盗版软件发的话, 也不要那么肆无忌惮 - 那实在是 eye sore 拉低了论坛的格调。
----------------------------------------------
-