如何将包含函数指针的变量的值与函数地址进行比较?
我正在维护一些代码,但它在 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/