截止到 XE7 Update 1,Delphi 并没有提供一个条件编译选项来告诉当前程序是否是 FMX 平台的程序,而我们在做跨平台的应用时,许多时候需要知道这一点,那么我们该怎么办?QDAC 3.0 的 QString 单元提供了一个全局变量 IsFMXApp 来帮助用户检测这一点,它实际上是在初始化时,通过检查是否声明了 TFmxObject 类型来确定当前应用程序的类型,代码如下:
【Delphi】
IsFMXApp:=GetClass('TFmxObject')<>nil;
【C++】
IsFMXApp=GetClass(L"TFmxObject");
很简单,就一句代码,这样子就可以在必要时用 IF 语句判断实现条件执行(条件编译暂时做不到):
【Delphi】
if IsFMXApp then ... //FireMonkey else ... //VCL
【C++】
if(IsFMXApp) ...//FMX else ...//VCL
下面的C++代码将显示当前是 FMX 还是 VCL 程序:
void __fastcall TForm1::Button1Click(TObject *Sender) { if (GetClass("TFmxObject")) ShowMessage("FMX"); else ShowMessage("VCL"); }
看下效果:
【补充说明】
1、在 Delphi 中,如果你 uses 了 FMX.Types 单元,那么可以通过下面的条件编译指令来控制。不过话说,你已经包含了 FMX.Types 了,还需要它吗?
{$IF DECLARED(FireMonkeyVersion)} ... FMX {$ENDIF}
2、在 C++ Builder 中,程序可以通过检查宏 INC_FMX 来测试当前程序是否是 FMX 应用,它的定义在 fmx.h(感谢麦子仲肥)。说话同上,已经包含了 fmx.h 了,肯定就是 FireMonkey 应用了,还是有点后知后觉。