[Delphi] 比较事件响应者是否是特定的函数

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
   ...

好吧,看起来麻烦了一点,在官方改进编译器以支持前面的写法之前,这算是一个折中吧。

分享到: