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

Delphi 如何命名文件以区分VCL和FireMonkey代码,delphi,firemonkey,Delphi,Firemonkey,我有一个在Delphi7到10.3上运行的VCL组件。我现在把它移植到FMX 为了避免维护两个代码基,我将在源代码中使用条件定义来分隔任何自定义FMX和VCL代码。当我编译用于分发的组件时,脚本将输出VCL或FMX源文件 我的问题是如何使VCL DCU和FMX DCU在同一系统上共存(对于同时拥有我的组件的VCL和FMX版本的用户),因为这两个文件夹都需要位于Delphi路径上 换句话说,我的VCL单元被命名为:myunit1.pas、myunit2.pas等 以及FMX版本:FMX.myuni

我有一个在Delphi7到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.\uPas文件。我需要“隐藏”vcl源文件夹来编译它(重新排序Delphi路径没有帮助)

如果有其他方法使FireMonkey避免使用vcl文件


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

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

典型用法示例:

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}添加到头中。现在,我的VCL和FMX版本都愉快地共存


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

使用
{$ifdef
确保有条件编译。您可以在任何合适的地方使用此工具,并使用任何
{$define
值适合您的应用程序设计。您不需要单独的源文件来支持VCL和FMX。一个源文件就足够了,您只需要不同的包和不同的输出文件夹,并且您可以注册您的组件,这样IDE将过滤掉FMX项目中的VCL版本,反之亦然。我是正确的吗假设您不想将FMX源代码提供给只购买VCL的用户,反之亦然?这就是您从最初组合的源代码创建不同源文件的原因?您确定这值得付出努力吗?相关:感谢所有反馈。我不介意用户同时拥有VCL和FMX源代码,但我认为可能会将源代码放在单独的文件夹中更容易。Delphi中没有真正的FMX定义(只有一个“如果声明”,这意味着它不能在INC文件中使用,也不能在interface uses子句中有条件地指定单位)。因此我有一个不同的“平台”inc文件在每个文件夹中。仔细想想,它们可以命名为fmx.plat.inc和vcl.plat.inc,编译器会选择正确的一个。那么,Delphi IDE如何实现分离呢?答案是单元范围名称。感谢您的建议,SIL。这将要求我的组件的用户添加$(FrameworkType)我不明白为什么Embarcadero在默认情况下没有引入这样的条件编译器定义符号。对于我来说,库可以混合的论点是无效的,因为每个项目(dproj)只为一个(FMX或VCL)定义。通常,此声明会在项目开始时丢失。为此,我在库的第一行中集成了一个好的注释,其中需要此符号。