gpt4 book ai didi

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

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

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

我正在维护一些代码,但它在 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/

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