举个例子,让我们来检查臭名昭著的TStrings.StrictDelimiter
:
{$IF Declared(TStrings.StrictDelimiter)}
{$MESSAGE WARN 'Beware of TStrings.StrictDelimiter which is False by default!'}
{$IFEND}
然而,在条件行上,Declared
编译器内置函数报告语法错误:E2029“) ”预期但找到“.”
。(在XE上测试)
举个例子,让我们来检查臭名昭著的TStrings.StrictDelimiter
:
{$IF Declared(TStrings.StrictDelimiter)}
{$MESSAGE WARN 'Beware of TStrings.StrictDelimiter which is False by default!'}
{$IFEND}
然而,在条件行上,Declared
编译器内置函数报告语法错误:E2029“) ”预期但找到“.”
。(在XE上测试)
对于 Delphi XE2,我正在使用以下内容:
{$IFDEF BDS9}
Result.VersionString := 'Delphi XE2 ' +
{$IF NOT DECLARED(Consts.SStyleFeatureNotSupported)}
'(original release version)'
{$ELSE} {$IF NOT DECLARED(FireMonkeyVersion)} // D2010 chokes when scope (FMX.Types) is mentioned!
'Update 1'
{$ELSE} {$IF NOT DECLARED(System.TestSSE)}
'Update 2'
{$ELSE}
'Update 3'
// TODO : Update this for any following update!
{$IFEND} {$IFEND} {$IFEND}
;
{$ELSE}
{$IFDEF BDS7}
Result.VersionString := 'Delphi 2010';
{$ELSE}
{$MESSAGE ERROR 'Extend this!'}
{$ENDIF}
{$ENDIF}
换句话说:我测试引入自任何特定Delphi版本以来的符号是否存在。同样的结构可以用于设置变量、常量或编译器定义,因此进一步的代码可以使用这些内容。
注意:我保留了过去几年中安装的所有Delphi版本的Source文件夹的备份。将这些文件夹通过BeyondCompare等工具进行比较,并浏览差异文件,很快就能给你一些可以测试的符号...
很遗憾,这种表达式不受支持,您必须知道某个功能是在哪个RTL /编译器版本中引入的,然后使用预定义条件符号,如VER<nnn>
,RTLVersion
,CompilerVersion等。
{$IF declared()}
支持,但存在一个 QC ,您可以进行投票。 - RRUZ