如何命名文件以区分 VCL 和 FireMonkey 代码

How to name files to differentiated VCL and FireMonkey code

我有一个在 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 源文件。我需要 "hide" vcl 源文件夹才能编译(重新排序 Delphi 路径没有帮助)。

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

(恐怕我需要编写一个脚本来为所有文件命名,例如 FMXmyunit1.pas 并更新所有文件中的所有引用)。

因为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 版本的源代码文件,只要它们具有平台相关代码。

好吧,我不知道这是否真的是解决方案,但它对我有用。

我编写了一个应用程序,将我所有的 VCL 文件复制到我的 FireMonkey 文件夹并使用 FMX 前缀重命名它们,即 myunit.pas 变成 FMXmyunit.pas。它还会更新 pas 文件中的所有引用,并将 {$DEFINE FMX} 添加到 header。现在我的 VCL 和 FMX 版本可以愉快地共存了。

此外,我已将我的合并工具 (Beyond Compare) 设置为忽略 FMX 前缀,因此我可以将任一平台版本直接合并到我的本地 Git 副本。