我有以下代码:
for i := 0 to FControlList.Count - 1 do
if Supports(IMyControl(FControlList[i]), IMyControlEx) then
begin
MyControlEx := IMyControl(FControlList[i]) as IMyControlEx;
MyControlEx.DoYourMagic(Self, SomeData);
end;
在我的应用程序执行期间多次调用此代码,但在某些特定情况下,它在Supports()方法中失败。更具体地说 - 它似乎属于Supports()方法中的QueryInterface()调用。
我检查过FControlList不是nil而且FControlList [i]不是nil而且它仍然发生。
任何想法都将受到赞赏!!!
答案 0 :(得分:5)
即使FControlList[I]
不是nil
,也不意味着它指向有效数据。底层对象实例可能已经被释放。
我还建议将类型转换为IMyControl
。 Supports
可以将对象和接口作为参数,即使它们是nil
,也可以产生所需的结果。
此外,您可以考虑使用这种方式调用supports
,以获得代码的便利性和可读性:
if Supports(FControlList[i], IMyControlEx, MyControlEx) then
begin
MyControlEx.DoYourMagic(Self, SomeData);
end;