在Delphi XE2中,我们使用
{$ifdef Win32}
{$ifdef Win64}
确定我们所处的平台。
是否有可以识别VCL和FMX的预定义条件?
答案 0 :(得分:11)
虽然没有记录,但您可以在同一个应用程序中使用VCL和Firemonkey。
没有编译器定义。
如果您正在构建需要同时使用VCL和Firemonkey的东西,我建议将这些单元分开。
一种可能的方式:
在同一单元中混合来自两个不同框架的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.pas
和Vcl.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'}