Delphi 在单元中断调试信息中定义的泛型
这一定是Delphi的错误 我有一个单元,它是我持久性框架的基础。在该单元中,我有一个用于所有域对象的基类、一个列表类和一个泛型列表类 就在最近,我注意到,当我在调试时进入单元时,执行将跳到文件中比它应该跳得更远的一点。。。也许四、五行。重新排序文件没有什么区别。该代码也会生成访问冲突,但只有在我调试它时才会发生 我试着找出原因。。。我想到了几件事,比如调试程序中的一些代码注入(例如),或者调试信息与我的单元源代码不同步(例如dcu是从一些旧的源代码中提取的) 最后,我使用干净的Windows+Delphi安装启动了一个VM,只获取了测试该单元所需的内容,并创建了一个小型DUnit项目来测试它。同样的问题 然后我开始一次一个地从单元中取出东西,直到它工作为止。唯一不同的是我删除了泛型列表类 还有谁见过这个问题吗?有人知道怎么避开它吗 提前感谢, N@Delphi 在单元中断调试信息中定义的泛型,delphi,generics,delphi-2010,Delphi,Generics,Delphi 2010,这一定是Delphi的错误 我有一个单元,它是我持久性框架的基础。在该单元中,我有一个用于所有域对象的基类、一个列表类和一个泛型列表类 就在最近,我注意到,当我在调试时进入单元时,执行将跳到文件中比它应该跳得更远的一点。。。也许四、五行。重新排序文件没有什么区别。该代码也会生成访问冲突,但只有在我调试它时才会发生 我试着找出原因。。。我想到了几件事,比如调试程序中的一些代码注入(例如),或者调试信息与我的单元源代码不同步(例如dcu是从一些旧的源代码中提取的) 最后,我使用干净的Windows+
更新:将通用代码重新添加到设备中会使问题再次出现,因此这不是陈旧DCU的问题。您是否确保有问题的设备的所有行都以CR LF结尾?调试器不能只处理CR或LF,而编辑器可以。记事本++、文本板等可以显示是否存在混合。将其加载到[Windows]记事本并重新保存可以解决此问题。通常这是内部/外部编译状态不同步 第一步是删除项目的.dcu文件,然后重新启动Delphi,然后进行完整构建。如果问题仍然存在,请检查
--jeroen最后,我能找到的唯一有效的解决方案是将通用列表移出单元 更新2011-08-03以更好地充实我的解决方案: 我在我的
域
单元中用我的基tdomain对象
类和非泛型版本定义了我的泛型列表基类
为了解决这个问题,我将泛型移动到第二个域.Generics
单元中,它为我解决了这个问题
因此:
以及:
unitdomain.Generics;
接口
类型
TDomainObjectList=类(TDomainObjectList)
//东西
公众的
属性项[AIndex:integer]:T读取GetItem写入SetItem;
类型
TEnumerator=类(TdoMainListNumerator)
公众的
函数GetCurrent:T;
属性当前:T读取GetCurrent;
结束;
公众的
函数GetEnumerator:TEnumerator;
结束;
如果是这样的话,从设备中删除通用代码怎么能解决问题呢?我现在按照您的建议做了,没有任何改变。如果泛型在文件中,则调试信息被破坏;如果泛型在文件中,则调试信息正常。谢谢你的建议,顺便说一句。我这么做了,这就是为什么我在一台安装了干净Delphi的干净机器上检查代码的原因。。。机器上根本没有DCU。在从单元中删除位和几个编译周期后,只有在删除泛型之后才能修复问题。。。事实上,把它放回单元会使问题再次发生。如果它是一个简单的单元,就把它放在问题中。我将尝试用Delphi 2010和Delphi XE复制它。我将把它配对成一个小示例,然后发布它。。。但现在必须等到周一(墨尔本时间)。谢谢你的建议。娜塔莉,我有同样的问题,这真的很烦人,因为我有一个基于通用列表的整个项目。当我开始调试时-惊喜Delphi IDE崩溃了。我开始悬赏你的问题。如果你发现了这个Delphi错误的解决方法,请写在这里。@Andrew我最后创建了第二个单元,其中只有泛型。我会更新我的答案以更好地解释它…非常感谢你的解释!这对我也有用。这些+200点是你的,你治好了我的头痛:)后期更新;我在Delphi 2010中也遇到了同样的问题,但是在Delphi XE中使用单元中的泛型集合并调试它们没有任何问题。如果你已经搬到XE,我会很好奇这是否仍然影响到你。@WarrenP我还没有搬到XE,XE里没有足够的东西让我搬家。。。正在等待Commodore的64位支持。我将在最终升级时再试一次,并更新此帖子。:)
unit Domain;
interface
type
TDomainObject = class
//blah de blah
end;
TDomainObjectList = class (TDomainObject)
//more stuff
end;
TDomainListEnumerator = class
//etc
end;
unit Domain.Generics;
interface
type
TDomainObjectList<T: TDomainObject> = class (TDomainObjectList)
//stuff
public
property Items[AIndex: integer]: T read GetItem write SetItem;
type
TEnumerator = class (TDomainListEnumerator)
public
function GetCurrent: T;
property Current: T read GetCurrent;
end;
public
function GetEnumerator: TEnumerator;
end;