在Delphi中(我使用的是D7),如何检查方法变量是否已分配给某些东西?我试过这段代码
function MethodIsOK(M : TMethod) : Boolean;
begin
//Result := M <> Nil;
//Result := Assigned(M);
end;
但是分配Result
的任何一种方式都会产生“不兼容的类型”编译错误
答案 0 :(得分:5)
当基于TMethod
的方法指针传递给内在Assigned()
函数时,无论TMethod.Code
字段如何,它都会返回TMethod.Data
字段是否为非零值(您可以在无效的对象指针上调用对象方法),例如:
function MethodIsOK(M : TMethod) : Boolean;
begin
//Result := Assigned(M);
Result := M.Code <> nil;
end;
Allen Bauer在博客中谈到了这个问题以及为什么Assigned()
被引入以支持设计时代码的方法指针:
Assigned or not Assigned, that is the question…
本机代码(Win16和Win32以及upcomming Win64实现)的方法指针的实现由两个指针组成。一个指向方法的地址,另一个指向对象实例。事实证明,简单的
if methodpointer <> nil then
语句会检查两个指针都是零,这似乎合乎逻辑,对吧?它是。但是,这里有点麻烦。在设计时,原生VCL表单设计师从其帽子中汲取了一些技巧。我们需要一种方法以某种方式为组件的方法指针实例赋值,但也要确保组件实际上没有想到任何分配给它的东西并立即尝试调用方法(BOOM !!)。输入,已分配。通过添加标准函数Assigned,我们可以保留<> nil
语义,并引入一个扭曲。事实证明,对于冒险的人来说,你可以验证这一点,Assigned只检查方法指针中的两个指针之一。从未测试过另一个指针。因此,当您从IDE的Object Inspector中将方法指定给方法指针时,设计者实际上是将内部创建的索引插入到方法指针结构中的另一个(非Assigned-tested)指针中。因此,只要您的组件在调用方法指针之前使用if Assigned(methodpointer) then
,您的组件代码就不会在设计时出现异常。
答案 1 :(得分:1)
该方法包含代码和数据指针,您只需检查指针是否有效