【问题标题】:Stop Delphi automatically adding units incorrectly [duplicate]停止Delphi自动错误地添加单位[重复]
【发布时间】:2015-08-27 09:19:37
【问题描述】:

我正在将我们的项目从 XE7 更新到 XE8。目前他们仍需要使用 XE7,因此需要一些条件。比如ImageList换了单位,所以XE8中的Vcl.ImgList就是Syste.ImageList。为了使它在两个 Delphi 版本上都能正常工作,uses 子句看起来像这样:

uses
  System.SysUtils, System.Classes, Vcl.Controls
  {$IF CompilerVersion >= 29.0}
  ,System.ImageList
  {$else}
  ,Vcl.ImgList
  {$endif}

  ,cxGraphics;

有时这很好用。然而,Delphi 经常会自动重新添加 System.Imagelist 单元,即使它已经存在,尽管在条件例如

uses
  System.SysUtils, System.Classes, Vcl.Controls
  {$IF CompilerVersion >= 29.0}
  ,System.ImageList
  {$else}
  ,Vcl.ImgList
  {$endif}

  ,cxGraphics, System.ImageList;

编译后,XE8 报错。

[dcc32 Error] dmImagesU.pas(13): E2004 Identifier redeclared: 'System.ImageList'

a) Delphi 为什么要添加单位? b) 有人知道解决方法吗?

【问题讨论】:

  • 您可以尝试使用 {$IFDEF VER290} 代替编译器版本常量。也许会有所帮助?
  • 我删除了我的答案,因为我发现了一个覆盖面更详细的骗子。我在这里删除的答案中写的是使用单位别名,在欺骗中进行了深入讨论。我向您推荐单位别名方法。
  • 我不确定大卫是不是这么简单。这不是一个单元的 1:1 替换/重命名。这两个单元都存在于 XE8 中,有趣的是,当您在 XE8 中创建一个全新的项目时,将 TImageList 组件添加到表单会导致 both 单元被添加到 uses 子句中,不仅仅是 System.ImageList 单元。因此,XE8 似乎需要,或者至少“推荐”Vcl.ImgList 单元(用于类型/常量?)类本身的 System.ImageList 单元。 Embarcadero 让每个人都陷入了另一个混乱。
  • 我认为有 2 个模块,因为 FM 组件。 Syste.Imagelist 中的核心和 VCL.ImgList 中的所有 VCL 内容。
  • @Deltics 问题中的代码是不是?我就是从那里开始工作的。无论如何,如果您想根据版本使用 1 个或 2 个单位,您可以使用别名以相同的方式执行此操作。您只需使用这两个单位,并有条件地将其中一个别名为System。如果您想使用其中一个或,那么您可以使用单个单元并在其中一个项目中使用别名。真的就是这么简单。

标签: delphi delphi-xe7 delphi-xe8 uses-clause


【解决方案1】:

在这种情况下,负责将单元添加到使用中的“解析器”没有正确考虑编译器指令(该问题已在引入 System.Actions.pas 时出现)。

我通常为较旧的 Delphi 版本创建一个虚拟单元,因此我不必在使用中添加任何指令。

因此,在您的情况下,只需创建一个空的 System.ImageList.pas 并将其放在某处

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2017-09-28
    • 2016-02-14
    • 1970-01-01
    • 2016-06-04
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多