如何比较一个事件及其相应的过程来避免E2035和E2036?

How to compare an event and its corresponding procedure avoiding E2035 and E2036?

我正在尝试检查事件 (TNotifyEvent) 是否已经分配了特定的 procedure(Sender: TObject) of object

这是我的示例代码:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if(Button1.OnClick = Button1Click) then
  begin
    //...
  end;
end;

在这种情况下,我收到以下错误消息:

[DCC Error] Unit1.pas(28): E2035 Not enough actual parameters

所以,我试过如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if(@Button1.OnClick = @Button1Click) then
  begin
    //...
  end;
end;

编译时错误改为:

[DCC Error] Unit1.pas(28): E2036 Variable required

如何检查 Button1.OnClick 是否指向 Button1Click

... of object procedures/functions 实现为 闭包 ,它包含 2 个指针 - 隐式 Self 参数的指针,和一个指针到 procedure/function 本身。您可以使用 TMethod 记录访问这些指针以直接比较它们:

procedure TForm1.Button1Click(Sender: TObject);
var
  oc1, oc2: TNotifyEvent;
begin
  oc1 := Button1.OnClick;
  oc2 := Button1Click;
  if (TMethod(oc1).Data = TMethod(oc2).Data) and
     (TMethod(oc1).Code = TMethod(oc2).Code) then
  begin
    //...
  end;
end;