1

我有以下代码:

  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 并且它仍然会发生。

任何想法将不胜感激!!!

4

1 回答 1

5

即使FControlList[I]is not nil,也不意味着它指向有效数据。底层对象实例可能已经被释放。

我还建议删除类型转换为IMyControl. Supports可以将对象和接口作为参数,即使它们是nil,并产生所需的结果。

另外,supports为了代码的方便性和可读性,您可以考虑使用这种调用方式:

if Supports(FControlList[i], IMyControlEx, MyControlEx) then
begin
  MyControlEx.DoYourMagic(Self, SomeData);
end;
于 2010-03-21T11:21:00.310 回答