首页 > 解决方案 > 如何将文件命名为不同的 VCL 和 FireMonkey 代码

问题描述

我有一个在 Delphi 7 到 10.3 上运行的 VCL 组件。我现在将它移植到 FMX。

为了避免维护两个代码库,我将在源代码中使用条件定义来分隔任何自定义 FMX 和 VCL 代码。当我编译组件以进行分发时,脚本将输出 VCL 或 FMX 源文件。

我的问题是如何使 VCL DCU 和 FMX DCU 在同一个系统上共存(对于同时拥有我的组件的 VCL 和 FMX 版本的用户),因为这两个文件夹都需要位于 Delphi 路径上。

换句话说,我的 VCL 单元被命名为:myunit1.pas、myunit2.pas 等。

以及 FMX 版本:fmx.myunit1.pas、fmx.myunit2.pas 等

(理想情况下,我会将 VCL 命名为 vcl.myunit1.pas、vcl.myunit2.pas 等。这样,组件的 VCL 版本只会看到 vcl.-.pas 文件,而 FireMonkey 只会看到 fmx.-.pas文件。不幸的是我不能这样做,因为那样它就不能在旧的 Delphi 版本上工作)。

现在,当我编译 FireMonkey 应用程序时,它会尝试使用非 fmx 前缀的源文件,而不是 fmx._.pas 文件。我需要“隐藏” vcl 源文件夹以使其编译(重新排序 Delphi 路径无济于事)。

如果有其他方法可以让 FireMonkey 避免使用 vcl 文件?

(我担心我需要编写一个脚本来给所有文件一个新名称,例如 FMXmyunit1.pas 并更新所有文件中的所有引用)。

标签: delphifiremonkey

解决方案


因为 Delphi 不提供预定义的编译器条件来区分 Firemonkey 和 VCL 框架,您可以将符号 $(FrameworkType) 添加到应用程序项目设置的条件定义列表中。这可以通过使用条件编译符号FMXVCL.

典型用法示例:

uses
  {$IFDEF FMX}
  FMX.Forms,
  {$ENDIF}
  {$IFDEF VCL}
  VCL.Forms,
  {$ENDIF}

这适用于我自己的纯 VCL 和 FMX 项目的跨平台库,我可以将源文件直接集成到项目中。这种简单的方式,每次都会重新编译DCU。在混合项目的情况下,$(FrameworkType) 包含应用程序的初始框架。

当您交付一个包 (bpl) 时,事情会变得更加复杂。您必须为 FMX 和 VCL 提供两个版本的 bpl。如果您还提供用于调试目的的源代码,唯一的选择是完全区分 FMX 和 VCL 版本的源代码文件,只要它们具有平台相关的代码。


推荐阅读