如何比较事件及其相应的过程,以避免E2035和E2036



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

这是我的示例代码:

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错误] unit1.pas(28):e2035实际参数不足

所以,我尝试了以下操作:

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

在编译时,错误将更改为:

[DCC错误] Unit1.pas(28):E2036所需变量

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

... of object过程/函数被用作 closures ,其中包含2个指示器 - 隐式Self参数的指针,以及指向过程/函数本身的指针。您可以使用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;

最新更新