delphi - Delphi 中比较指针与函数值

标签 delphi

如何将包含函数指针的变量的与函数地址进行比较?

我正在维护一些代码,但它在 Delphi 2007 中失败。声明是:

var
  EditorFrameWindow: Function: HWnd Of Object = Nil;

在表单激活中,我有:

procedure TEditForm.FormActivate(Sender: TObject);
begin
  EditorFrameWindow := GetFrameWindow;
end;

在我的表单停用中:

procedure TEditForm.FormDeactivate(Sender: TObject);
begin
  if EditorFrameWindow = GetFrameWindow then
    EditorFrameWindow := nil;
end;

所以发生的情况是表单被停用两次,并且由于没有其他任何内容被激活而失败。 FormDeactivate 被调用,它匹配,并且 EditorFrameWindow 全局设置为 (nil,nil) (根据调试器)。然后它再次被调用,并且存储在变量中的函数被调用,但是当然没有存储,所以它会跳过 nil 并创建一个异常。

我应该怎样做才能阻止这种情况发生? (框架已更改为选项卡式系统,因此操作可能会发生变化。)

最佳答案

procedure TEditForm.FormDeactivate(Sender: TObject);
begin
  if Assigned(EditorFrameWindow) and (EditorFrameWindow = GetFrameWindow) then
    EditorFrameWindow := nil;
end;

工作机会?

编辑:

您不比较函数地址,而是比较这些函数的结果。因此,即使上面的固定代码不再导致异常,它可能仍然无法执行您想要的操作。返回相同结果的另一个函数也会重置事件处理程序。

要真正检查变量是否设置为特定事件处理程序,您需要比较 TMethod 记录中的两个元素。像这样的东西:

procedure TEditForm.FormDeactivate(Sender: TObject);
begin
  if (TMethod(EditorFrameWindow).Code = @TForm1.GetFrameWindow)
    and (TMethod(EditorFrameWindow).Data = Self)
  then
    EditorFrameWindow := nil;
end;

关于delphi - Delphi 中比较指针与函数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1026513/

相关文章:

delphi - Free Pascal 2.6.2 TThread 构造函数出现错误

delphi - 从 TOleContainer 中提取位图?

delphi - 我可以假设 Delphi NOW 函数是线程安全的吗?

delphi - TRegistry - 为什么有些键可读而其他键不可读?

class - 制作Delphi事件类方法

sql-server - 按时间查找可用性

delphi - 如何在 TIdHTTPServer 中接收包含外来字符的查询字符串

Delphi Tokyo 10.2 的 Powershell 静默/无人值守安装 - 用于在 win docker 容器中使用 CI

delphi - 仅知道服务名称即可获取服务的内存信息

delphi - 使用存储在变量中的有符号整数进行算术按位右移 "a shr b"– 结果错误!内部Delphi的错误?