【发布时间】:2014-11-26 22:32:43
【问题描述】:
我正在尝试修改我的 Delphi 2010 代码以在 XE7 中编译(并希望保留在 2010 年编译它的能力)。因此,在包含我的主窗体的单元中,我添加了条件指令。以下在 2010 年运行良好
uses
{$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
但 XE7 会自动在末尾添加一个 System.Actions 以创建一个 uses 子句,该子句现在声明了 System.Actions 两次(见下文),并给出错误消息 [dcc32 Error] MyForm.pas(10): E2004 Identifier redeclared: 'System.Actions'。为什么 XE7 不接受条件指令中的单位?
uses
{$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
System.Actions; // <- automatically added
【问题讨论】:
-
因为表单相关单元中的 interface uses 子句属于 IDE 本身,它会为放置在表单上的任何组件添加当前版本所需的任何内容。克服这个问题的唯一方法是从表单中删除组件,将声明放在
private部分而不是默认的published部分,然后在运行时创建组件。您正在与 IDE 本身作斗争,而且您不会赢得这场战斗。 -
但是我已经拥有了所有需要的单元,不是吗? Delphi 正在处理
{$IF CompilerVersion >= 24}System.Actions{$IFEND}部分。如果我做了一个像 (`{$IF CompilerVersion >= 24}System.Action*s{$IFEND} 这样的“错别字”,它会抱怨。所以,它知道在接口使用中 System.Actions 的存在。可能是IDE 和 Compiler 不同步? -
IDE 不知道条件定义。它只是知道你在表单上有某个组件,它在uses子句中找不到那个单元,所以它添加了它。正如我所说,接口使用子句属于IDE,而不是你。如果组件在表单上,IDE 将确保该单元直接包含在使用子句中。为了清楚起见,我将第三次重复:表单相关单元中的
interfaceuses 子句属于IDE,用于放置在表单上的任何组件。 -
好的。你问,我提供信息。我不会和你争论,但自从 Delphi 2 发布以来我一直在处理这个问题,我需要支持 16 位和 32 位版本的组件之间的条件定义。 :-) 你正在与 IDE 进行一场失败的战斗——它总是会赢。
-
顺便说一句,我认为您在这里缺少的部分是 IDE 不会编译代码来确定组件的 uses 子句中是(或不是)什么。它只是解析 use 子句以查看它是否具有表单上组件所需的所有单元,这就是为什么它看不到条件句中包含的内容。 (条件句用于编译器,IDE 不为此目的进行编译。)
标签: delphi delphi-2010 conditional-compilation delphi-xe7