【发布时间】: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