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

Cha*_*ang 13 delphi delphi-xe2 firemonkey

在Delphi XE2中,我们使用了

{$ifdef Win32}
{$ifdef Win64}
Run Code Online (Sandbox Code Playgroud)

确定我们所处的平台.

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

Rob*_*ove 12

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

没有编译器定义.

如果您正在构建需要VCL和Firemonkey的东西,我会建议分离单位.

一种可能的方式:

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

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


RRU*_*RUZ 10

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

  • 此外,由于您所指的TApplication无法在运行时更改,因此使用TRttiContext完全**是不必要的.您可以将`IsFireMonkeyApp`简化为`Result:= {$ IF DECLARED(TFmxObject)} True {$ ELSE} False {$ IFEND};`它将具有完全相同的行为. (7认同)
  • 这段代码*要求你使用`Forms`而不是'Vcl.Forms`.如果您明确使用`Vcl.Forms`或`Fmx.Forms`,那么您已经在该单元的uses子句中决定使用该平台,因此已经有一种条件方式来检查目标widgetset. (2认同)