我正在尝试检查是否已经使用特定的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;