我正在将我的代码从 XE2 移到 Delphi XE3,但它应该在两者中编译。我注意到某些单元会自动将“System.Actions”添加到USES 子句中。当返回 XE2 时,这会导致错误:
F1026 找不到文件:'System.Actions.dcu'(单位范围“系统”仅表示 Win64、OSX32、Win32)
我从来没有真正理解单位范围。有没有正确的解决方案来解决这个问题,而不是在编译器版本 {$IFDEF} 中包装东西?
谢谢
我正在将我的代码从 XE2 移到 Delphi XE3,但它应该在两者中编译。我注意到某些单元会自动将“System.Actions”添加到USES 子句中。当返回 XE2 时,这会导致错误:
F1026 找不到文件:'System.Actions.dcu'(单位范围“系统”仅表示 Win64、OSX32、Win32)
我从来没有真正理解单位范围。有没有正确的解决方案来解决这个问题,而不是在编译器版本 {$IFDEF} 中包装东西?
谢谢
Remy 所说的非常正确,但可能有一种更简单的方法可以让您的代码在 XE2 和 XE3 中都工作。只需添加一个单位别名 fromSystem.Actions
到Vcl.ActnList
。
在Delphi 编译器页面上的项目选项中添加它。您需要添加以下内容:
System.Actions=Vcl.ActnList
请注意,如果您需要在 XE2 和 XE3 中使用相同的 .dproj 文件进行编译,那么您就不走运了。该单元别名设置将停止在 XE3 下编译程序。但是,如果 XE2 和 XE3 有不同的 .dproj 文件,那么这将允许您在两者中使用相同的源。或者,如果您只需要在命令行编译 XE2,那么您可以在此处添加此单元别名。我不知道这是否会对您有所帮助,但我知道单位别名功能在过去不止一次帮助我摆脱了类似的情况。
XE2中没有Actions
单元。它是 XE3 中的新功能,作为将 Actions 支持引入 FireMonkey 的重构工作的一部分。这是记录在案的:
动作:FireMonkey 现在支持动作和动作列表,这两个功能以前仅在 VCL 中支持:
重要提示:每个使用动作的 FireMonkey 或 VCL 应用程序都必须在使用部分指定 System.Actions 和 System.Classes 单元。
System.Actions 单元在 RTL 包中创建。Vcl.ActnList 单元中提供独立于框架的动作特性的类被移到这个单元中。System.Actions 中的类扩展了 TBasicAction 和 TBasicActionLink 类中引入的动作特性的最基本行为。
重要提示:由于这些更改,您需要将 System.Classes 和 System.Actions 单元添加到使用部分。
火猴 (FMX)
独立于框架的实现对于 FireMonkey 和 VCL 来说是通用的:这个基本的动作功能在新的 System.Actions RTL 单元中得到了扩展。
VCL
在以前的 RAD Studio 版本中在 Vcl.ActnList 单元中实现的独立于框架的操作功能现在位于 RTL 中的新 System.Actions 单元中(常见于 VCL 和 FireMonkey)。
重要提示:由于这些更改,您需要将 System.Actions 单元添加到使用操作的 VCL 应用程序中的使用部分(或 #includes)。
Actions
如果您实际上没有在代码中使用操作,则必须删除对的引用,否则{$IFDEF}
将其删除。
如果您有一个项目文件,您仍然可以使用项目路径目录中的“虚拟” System.Actions.pas 文件解决问题:该文件将在 XE2 下获取。XE3 编译器将在 IDE /lib 目录中找到他的 System.Actions.dcu。
无论如何:在正常情况下,您应该使用不同的项目文件 - 然后建议使用具有单元别名的解决方案。
虚拟 System.Actions.pas 可能如下所示:
unit System.Actions;
(*
XE2 compatibility unit: since XE3 unit System.Actions will be inserted into every
interface in units which use actions.
compilerswitch in [uses] is ignored by IDE - so this solution enable successful
compilation in XE2 with same project file than XE3
*)
interface
implementation
end.