在 Delphi XE2 中,我们使用的是
{$ifdef Win32}
{$ifdef Win64}
如何识别我们所在的平台。
是否有预定义的条件语句可以识别VCL和FMX?
在 Delphi XE2 中,我们使用的是
{$ifdef Win32}
{$ifdef Win64}
如何识别我们所在的平台。
是否有预定义的条件语句可以识别VCL和FMX?
尽管没有记录,但您可以在同一应用程序中使用VCL和Firemonkey。
没有编译器定义。
如果您正在构建需要同时使用VCL和Firemonkey的东西,则建议分离单位。
一种可能的方法:
在同一单位中混合两个不同框架的UI代码并不是一个好主意。这将在不需要时链接到另一个库中。
正如其他人所说,没有一种条件指令可以确定你的应用程序是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;
Forms
或Vcl.Forms
,代码将正常工作。最后,关于您的最后一条评论,这取决于应用程序的类型,本答案建议使用函数作为替代使用条件指令
。 - RRUZForms
而不是Vcl.Forms
。如果您明确使用了Vcl.Forms
或Fmx.Forms
,那么您已经在单元的uses子句中决定了平台,因此已经有了一种条件检查目标窗口小部件集的方式。 - Zoë PetersonIsFireMonkeyApp
为 Result := {$IF DECLARED(TFmxObject)}True{$ELSE}False{$IFEND};
,它将具有完全相同的行为。 - Zoë PetersonResult := GetClass('TFmxObject') <> nil;
,因为这不需要在作用域中具有 FMX.Types。 - da-soft没有编译器指令,因为技术上讲,并不存在firemonkey应用程序或vcl应用程序,只有使用这些技术的应用程序。 一个应用程序可以使用fxm或vcl或两者都不用(例如控制台应用程序)。 这有点像问它是否是SQL应用程序。当然,您可以通过编程方式检查单个表单的祖先以查看它们继承自哪个框架。 同样,在没有关联表单的单位中,这没有意义。
目前似乎没有专门针对VCL/FireMonkey的编译器定义,您需要自己创建。在文档中可以找到预定义条件列表。
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.
{$DEFINE UsingFMX}
unit FmxAbUnit1;
{$I AbUnit1.pas}
{$ENDIF}
Try this snippet:
{$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}
{$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'}