使用IInterfaceList Delphi XE3访问冲突错误

时间:2013-07-17 13:27:02

标签: delphi delphi-xe3

我遇到了访问冲突错误[模块'rtl170'中地址5005F6E的访问冲突。使用IInterfaceList读取地址0000000A]。 我的代码看起来像这样:

if  not Assigned(FoRoutingCodes) then Exit;
for i := 0 to FoRoutingCodes.nCount - 1 do
begin
  ...
end;

FoRoutingCodes的声明是:

FoRoutingCodes : IRoutingCodeList;

和IRoutingCodeList的定义

IRoutingCodeList = interface
  function GetCount: Integer;
    ...
  property nCount: Integer read GetCount;
end;

nCount属性的实现是:

function TRoutingCodeList.GetCount: Integer;
begin
  Result := 0;
  if Assigned(FoItems) then
    Result := FoItems.Count; // here i get the access violation error
end;

其中TRoutingCodeList是IRoutingCodeList的实现,而FoItems声明为:

FoItems: IInterfaceList;

我已经使用

解决了这个问题
FoItems: TList<IRoutingCode>;

而不是

FoItems: IInterfaceList;

我是delphi的新手,任何人都可以帮助我理解以前的方法出了什么问题。 我不知道这是否相关,因为我们的产品还有很多其他变化,但只有在我们从Delphi XE转移到Delphi XE3之后才会出现这个问题。

提前致谢。

更新:回应Uwe Raabe

我已经改变了FoItems初始化

constructor TRoutingCodeList.Create;
begin
  FoItems := TInterfaceList.Create;
end;

constructor TRoutingCodeList.Create;
begin
  FoItems := TList<IRoutingCode>.Create;
end;

1 个答案:

答案 0 :(得分:0)

仅考虑到目前为止发布的代码,我看不出问题所在。但是,由于您知道错误的确切位置,我的建议是在代码中的该行设置断点并评估(CTRL + F7)成员 FoItems 以查看它是什么。

通常,当我怀疑我的对象引用不好时,我会评估 ClassName (在您的情况下, FoItems.ClassName )。如果引用无效,则此方法通常会引发异常,返回一个奇怪的名称。

另外,在构造函数中设置断点,以确保FoItems确实被实例化。

我希望这有帮助!