如何比较一个事件及其相应的过程来避免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;
我正在尝试检查事件 (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;