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]そうでない場合でもnil、それが有効なデータを指しているという意味ではありません。基になるオブジェクトインスタンスはすでに解放されている可能性があります。

また、にキャストされた型を削除することをお勧めしIMyControlます。Supportsオブジェクトとインターフェイスは、たとえそうであるとしても、パラメータとして受け取りnil、目的の結果を生成できます。

さらにsupports、コードの利便性と読みやすさを求めるこの方法の使用を検討することもできます。

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