我遇到了访问冲突错误 [模块“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 XE 迁移到 Delphi XE3 之后才出现的。
提前致谢。
更新:回应 Uwe Raabe
我已将 FoItems 初始化从
constructor TRoutingCodeList.Create;
begin
FoItems := TInterfaceList.Create;
end;
至
constructor TRoutingCodeList.Create;
begin
FoItems := TList<IRoutingCode>.Create;
end;