Delphi 中的事件实际上是一个 TMethod 类型的双指针结构体,但是 Delphi 并没有提供简单的写法,如:
if OnClick=Button1Click then
这么写看起来是完美的,但是却是无法编译通过的。所以,我们提供一个额外的模板类来做这个事情:
type TEventComparer<T>=class public class function Equals(M1,M2:T):Boolean; end; { TEventComparer<T> } class function TEventComparer<T>.Equals(M1, M2: T): Boolean; var V1:TMethod absolute M1; V2:TMethod absolute M2; begin Result:=(V1.Code=V2.Code) and (V1.Data=V2.Data); end;
然后我们要比较时,只需写成 TEventComparer<事件类型>.Equals(事件1,事件2)就可以了,如这样:
if TEventComparer<TNotifyEvent>.Equals(OnClick,Button1Click) then ...
好吧,看起来麻烦了一点,在官方改进编译器以支持前面的写法之前,这算是一个折中吧。