Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在单元中断调试信息中定义的泛型_Delphi_Generics_Delphi 2010 - Fatal编程技术网

Delphi 在单元中断调试信息中定义的泛型

Delphi 在单元中断调试信息中定义的泛型,delphi,generics,delphi-2010,Delphi,Generics,Delphi 2010,这一定是Delphi的错误 我有一个单元,它是我持久性框架的基础。在该单元中,我有一个用于所有域对象的基类、一个列表类和一个泛型列表类 就在最近,我注意到,当我在调试时进入单元时,执行将跳到文件中比它应该跳得更远的一点。。。也许四、五行。重新排序文件没有什么区别。该代码也会生成访问冲突,但只有在我调试它时才会发生 我试着找出原因。。。我想到了几件事,比如调试程序中的一些代码注入(例如),或者调试信息与我的单元源代码不同步(例如dcu是从一些旧的源代码中提取的) 最后,我使用干净的Windows+

这一定是Delphi的错误

我有一个单元,它是我持久性框架的基础。在该单元中,我有一个用于所有域对象的基类、一个列表类和一个泛型列表类

就在最近,我注意到,当我在调试时进入单元时,执行将跳到文件中比它应该跳得更远的一点。。。也许四、五行。重新排序文件没有什么区别。该代码也会生成访问冲突,但只有在我调试它时才会发生

我试着找出原因。。。我想到了几件事,比如调试程序中的一些代码注入(例如),或者调试信息与我的单元源代码不同步(例如dcu是从一些旧的源代码中提取的)

最后,我使用干净的Windows+Delphi安装启动了一个VM,只获取了测试该单元所需的内容,并创建了一个小型DUnit项目来测试它。同样的问题

然后我开始一次一个地从单元中取出东西,直到它工作为止。唯一不同的是我删除了泛型列表类

还有谁见过这个问题吗?有人知道怎么避开它吗

提前感谢,

N@


更新:将通用代码重新添加到设备中会使问题再次出现,因此这不是陈旧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;