【问题标题】:Error: F1026 File not found: 'System.Actions.dcu' switching back to Delphi XE2 from XE3错误:F1026 找不到文件:“System.Actions.dcu”从 XE3 切换回 Delphi XE2
【发布时间】:2023-03-31 22:59:01
【问题描述】:

我正在将我的代码从 XE2 移动到 Delphi XE3,但它应该在两者中都可以编译。我注意到某些单元将“System.Actions”自动添加到USES 子句中。这会在返回 XE2 时导致错误:

F1026 找不到文件:'System.Actions.dcu'(单位范围“系统”仅表示 Win64、OSX32、Win32)

我从来没有真正正确理解单位范围。有没有正确的解决方案来解决这个问题,而不是在编译器版本 {$IFDEF} 中包装东西?

谢谢

【问题讨论】:

    标签: delphi migration delphi-xe2 delphi-xe3


    【解决方案1】:

    XE2 中没有Actions 单元。它是 XE3 中的新功能,作为将 Actions 支持引入 FireMonkey 的重构工作的一部分。这是记录在案的:

    What's New in Delphi and C++Builder XE3:

    动作:FireMonkey 现在支持动作和动作列表,这两个功能以前仅在 VCL 中支持:

    重要提示:每个使用动作的 FireMonkey 或 VCL 应用程序都必须在使用部分指定 System.Actions 和 System.Classes 单元。

    Changes in Implementation of VCL Actions

    System.Actions 单元是在 RTL 包中创建的。 Vcl.ActnList 单元中提供独立于框架的动作特性的类被移到这个单元中。 System.Actions 中的类扩展了 TBasicAction 和 TBasicActionLink 类中引入的动作特性的最基本行为。

    重要提示:由于这些更改,您需要将 System.Classes 和 System.Actions 单元添加到使用部分。

    Implementation of Actions in FireMonkey and VCL

    火猴 (FMX)

    独立于框架的实现对于 FireMonkey 和 VCL 来说是通用的: 这一基本动作功能在新的 System.Actions RTL 单元中得到了扩展。

    VCL

    在以前 RAD Studio 版本的 Vcl.ActnList 单元中实现的独立于框架的动作功能现在位于 RTL 中的新 System.Actions 单元中(VCL 和 FireMonkey 通用)。

    重要提示:由于这些更改,您需要将 System.Actions 单元添加到使用操作的 VCL 应用程序的使用部分(或 #includes)中。

    如果您实际上并未在代码中使用操作,则必须删除对 Actions 的引用,否则将 {$IFDEF} 删除。

    【讨论】:

      【解决方案2】:

      Remy 所说的非常正确,但可能有一种更简单的方法可以让您的代码在 XE2 和 XE3 中都工作。只需将单位别名从System.Actions 添加到Vcl.ActnList

      将此添加到您的项目选项中,在 Delphi Compiler 页面上。您需要添加以下内容:

      System.Actions=Vcl.ActnList
      

      请注意,如果您需要在 XE2 和 XE3 中使用相同的 .dproj 文件进行编译,那么您就不走运了。该单元别名设置将停止在 XE3 下编译程序。但是,如果 XE2 和 XE3 有不同的 .dproj 文件,那么这将允许您在两者中使用相同的源。或者,如果您只需要在命令行中为 XE2 编译,那么您可以在此处添加此单元别名。我不知道这是否会对您有所帮助,但我知道单位别名功能在过去不止一次帮助我摆脱了类似的情况。

      【讨论】:

        【解决方案3】:

        如果您有一个项目文件,您仍然可以使用项目路径目录中的“虚拟” 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.
        

        【讨论】:

        • @BitBumper 当这个“虚拟” System.Actions.pas 在项目路径目录中时,如何让 XE3(或更高版本)编译器在 IDE lib 目录中找到他的 System.Actions.dcu?似乎 XE3(或更高版本)无论如何都会首先找到这个虚拟文件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        • 2012-04-27
        相关资源
        最近更新 更多