gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:46:04 28 4
gpt4 key购买 nike

我正在尝试检查事件 ( 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 过程/函数被实现为闭包,其中包含 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;

关于delphi - 如何比较一个事件及其相应的过程,避免E2035和E2036?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54673205/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com