14

在 Delphi XE2 中,我们使用

{$ifdef Win32}
{$ifdef Win64}

确定我们在哪个平台。

是否有任何可以识别 VCL 和 FMX 的预定义条件?

4

6 回答 6

13

虽然没有记录,但您可以在同一个应用程序中拥有 VCL 和 Firemonkey。

没有编译器定义。

如果您正在构建需要同时成为 VCL 和 Firemonkey 的东西,我建议将这些单元分开。

一种可能的方式:

  • MyLibrary.X.pas - VCL 和 Firemonkey 都将使用的公共代码。
  • MyLibrary.Vcl.X.Pas - Vcl 特定代码
  • MyLibrary.Fmx.X.Pas - Fmx 特定代码

在同一个单元中混合来自两个不同框架的 UI 代码并不是一个好主意。不需要时,它将链接到另一个库。

于 2011-10-11T02:36:55.103 回答
12

正如其他人所说,没有条件指令来确定您的应用程序是 VCL 还是 FireMonkey。我认为确定您的应用程序是 FireMonkey 还是 VCL 的最可靠方法是使用函数而不是条件指令。

就像是

Uses
 Rtti;

function IsVCLApp:Boolean;
begin
 Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'Vcl.Forms.TApplication')=0;
end;

function IsFireMonkeyApp:Boolean;
begin
 Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'FMX.Forms.TApplication')=0;
end;
于 2011-10-11T02:25:20.267 回答
4

没有编译器指令,因为从技术上讲,不存在 firemonkey 应用程序或 vcl 应用程序之类的东西。只有使用这些技术的应用程序。应用程序可以使用 fxm 或 vcl 或两者都使用或都不使用(例如控制台应用程序)。这有点像询问它是否是一个 SQL 应用程序。您当然可以以编程方式检查单个表单的祖先,以查看它们继承自哪个框架。同样,在没有关联形式的单元内,这没有任何意义。

于 2011-10-25T08:38:51.827 回答
3

似乎没有专门为 VCL/FireMonkey 定义的编译器。您需要创建自己的。

可以在文档中找到预定义条件的列表。

于 2011-10-11T01:54:56.290 回答
2

Abbrevia 支持使用这种拆分的 VCL 和 CLX:

QAbUnit1.pas:

{$DEFINE UsingCLX}
unit QAbUnit1;
{$I AbUnit1.pas}

AbUnit1.pas:

{$IFNDEF UsingCLX}
{$DEFINE UsingVCL}
unit AbUnit1;
{$ENDIF}

type
  ...
  TMyWidget = class({$IFDEF UsingVCL}TWinControl{$ENDIF}
                    {$IFDEF UsingCLX}TWidgetControl{$ENDIF})
  ...
  end;

end.

要添加 FireMonkey 支持,我会添加这样的文件:

FmxAbUnit1.pas:

{$DEFINE UsingFMX}
unit FmxAbUnit1;
{$I AbUnit1.pas}
{$ENDIF}

然后对 AbUnit1.pas 进行我需要的任何有条件的更改。

这不像罗伯特建议的那样干净利落,但优点是您的所有编辑都发生在一个文件中,并且条件定义是自动处理的,因此它不需要出现在项目选项中。曾经使用过您的图书馆的人只需包含适当的单元来决定他们想要使用哪一个。Fmx.AbUnit1.pas您也可以通过命名文件和来利用单元范围Vcl.AbUnit1.pas,但我认为 Embarcadero 不鼓励这样做。

于 2011-10-11T19:04:07.387 回答
1

试试这个片段:

{$IF Declared(FMX)}
  // FMX code here. To test this approach you may use {$MESSAGE FATAL 'FMX'}
{$ELSEIF Declared(VCL)}
  // VCL code here. To test this approach you may use {$MESSAGE FATAL 'VCL'}
{$IFEND}

它测试是否使用IF 编译指令声明了相应的命名空间

由于 FMX 与 VCL 不互斥,可能需要添加以下分支:

{$ELSEIF Declared(FMX) and Declared(VCL)}
  // FMX+VCL code here. To test: {$MESSAGE FATAL 'FMX+VCL'}
{$ELSE}
  // no GUI frameworks code here. To test: {$MESSAGE FATAL 'no GUI frameworks'}
于 2019-12-03T06:37:06.333 回答