我遇到了访问冲突错误[模块'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;
答案 0 :(得分:0)
仅考虑到目前为止发布的代码,我看不出问题所在。但是,由于您知道错误的确切位置,我的建议是在代码中的该行设置断点并评估(CTRL + F7)成员 FoItems 以查看它是什么。
通常,当我怀疑我的对象引用不好时,我会评估 ClassName (在您的情况下, FoItems.ClassName )。如果引用无效,则此方法通常会引发异常,返回一个奇怪的名称。
另外,在构造函数中设置断点,以确保FoItems确实被实例化。
我希望这有帮助!