Delphi XE2:是否有预定义的条件来识别VCL和FireMonkey?

时间:2011-10-11 01:32:26

标签: delphi delphi-xe2 firemonkey

在Delphi XE2中,我们使用

{$ifdef Win32}
{$ifdef Win64}

确定我们所处的平台。

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

6 个答案:

答案 0 :(得分:11)

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

没有编译器定义。

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

一种可能的方式:

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

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

答案 1 :(得分:9)

正如其他人所说,没有条件指令来确定您的应用程序是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;

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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进行任何条件性更改。

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

答案 5 :(得分: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}

它测试是否使用namespace声明了相应的IF compilation directive

由于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'}