我想在uses
子句中使用不同的单位列表,具体取决于对FMX或VCL进行编译。在下面的代码中,我尝试测试可在FMX项目中使用的FireMonkeyVersion
(label1.Text
为'FMX')。当我将$ IF语句移到uses
子句中时,我收到一条错误消息([dcc32 Error] fmx_text.pas(7): E2026 Constant expression expected
)。有什么方法可以获取所需的条件编译吗?
unit fmx_text;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Types;
{$IF FireMonkeyVersion >= 16}
{$DEFINE HAS_FMX}
{$ELSE}
{$DEFINE HAS_VCL}
{$IFEND}
type
TForm2 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.fmx}
procedure TForm2.FormCreate(Sender: TObject);
begin
label1.Text := 'Undefined';
{$IFDEF HAS_FMX}
label1.Text := 'FMX';
{$ENDIF}
{$IFDEF HAS_VCL}
label1.Text := 'VCL';
{$ENDIF}
end;
end.
最佳答案
FireMonkeyVersion
不是编译器定义的值。它是在FMX.Types
单元中声明的命名常量。尝试使用{$IF DECLARED(FireMonkeyVersion)}
,例如:
{$DEFINE HAS_VCL}
{$IF DECLARED(FireMonkeyVersion) AND (FireMonkeyVersion >= 16)}
{$UNDEF HAS_VCL}
{$DEFINE HAS_FMX}
{$IFEND}
但是我看不出要检查其数值的原因。您要么拥有FireMonkey,要么就没有:
{$IF DECLARED(FireMonkeyVersion)}
{$DEFINE HAS_FMX}
{$ELSE}
{$DEFINE HAS_VCL}
{$IFEND}
话虽如此,请记住,有可能(尽管没有得到官方支持)在同一项目中将FireMonkey和VCL混合在一起。因此,您可能需要重新思考差异化框架所要完成的工作。
关于delphi - 有条件地为FMX或VCL编译单元,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12788870/