在开始之前,我想指出的是,我已经通过谷歌进行了这样的事情,并且无法找到一个,而且我已经真实而且真实地进行了搜索。
我要求(对于我正在开发的项目)列出所有Delphi(2007年到最新发布的版本,我不再支持2007年以前的任何版本)“语言功能”,以及它们的版本介绍和(如适用)弃用,改进或删除。
之前我已经在Stack Overflow上注意到类似的问题,尽管其中大部分是以“哪个功能最好”的形式表达的,并且被认为是不合适的。
如果有人知道这样的清单(或有足够的空闲时间来编制一个清单),我将非常感激。
接受的答案将包含指向此类列表的链接或列表本身。
答案 0 :(得分:149)
请注意,此答案仅列出新的语言功能
不 新的VCL / FMX功能。
以下是RAD Studio docwiki的链接:
Embarcadero的完整名单:What's New
另见:David I's list
总结:
Delphi 10.3.x,10.4 (还没有出来,这是推测性的)
<强> Delphi 10.3 强>
@
operator is only allowed when hard-casting the array. [weak]
, [unsafe]
and [volatile]
attributes。 <强> Delphi XE8 强>
<强> Delphi XE7 强>
New compiler intrinsic routines (undocumented):
function IsManagedType(T: TypeIdentifier): Boolean;
function HasWeakRef(T: TypeIdentifier): Boolean;
function GetTypeKind(T: TypeIdentifier): TTypeKind;
function IsConstValue(Value): boolean;
<强> Delphi XE6 强>
<强> Delphi XE5 强>
<强> Delphi XE4 强>
在XE4中引入/启用以下新条件:
AUTOREFCOUNT
CPUARM
EXTERNAL_LINKER
IOS
NEXTGEN
UNDERSCOREIMPORTNAME
WEAKREF
WEAKINSTREF
WEAKINTREF
dependency
directive(在XE8之前未记录)。$IF
statements could only be terminated with $IFEND
,$IFDEF
,$IFNDEF
,$IFOPT
指令只能以$ENDIF
终止。在XE4,这改变了,因此$ ENDIF成为$ IF,$ IFDEF,$ IFNDEF和$ IFOPT的接受终止符。
AtomicExchange()
,AtomicIncrement()
,AtomicCmpExchange()
,AtomicDecrement()
Packed
Now Forces Byte Alignment of Records(前XE2不一定这样做)添加了八个新的DEFINE:
ALIGN_STACK
CPUX86
CPUX64
MACOS(Mac操作系统)
MACOS32
PC_MAPPED_EXCEPTIONS
PIC
WIN64
uses
clause. {$ExcessPrecision on/off}
compiler directive(仅限x64){$STRINGCHECKS}
编译器指令; {$ALIGN}
指令的新16字节值:
{$ALIGN}
指令的可接受值现在包括1,2,4,8和16. {$CODEALIGN}
指令,它设置过程或函数的起始地址。 {$STRONGLINKTYPES ON}
指令as
运算符可用于将接口引用强制转换回从中提取它的对象。 is
运算符可用于验证是否从某个类中提取了接口引用。 TObject(SomeInterface)
。 delayed
指令表示在声明时不会加载外部库(如DLL),而是等到第一次调用方法string
现在映射到UnicodeString
; {$HighCharUnicode on|off}
compiler directive function Default(T): T
intrinsic function (Undocumented) {$PointerMath on|off}
; W1057 Implicit string cast from '%s' to '%s'
,W1058 Implicit string cast with potential data loss from '%s' to '%s'
,W1059 Explicit string cast from '%s' to '%s'
,W1060 Explicit string cast with potential data loss from '%s' to '%s'
; Exit
函数可以使用指定结果的参数; resourcestrings
作为Widestrings; TObject
除了VMT指针外还有一个extra hidden pointer to TMonitor
; deprecated
关键字现在可以有其他文字static
方法和属性; strict
private/protected visibility keyword; final
关键字; {$METHODINFO}
指令; for ... in
循环,inline
关键字{$REGION}
/ {$ENDREGION}
指令{$WARN UNSAFE_CODE ON}
TFormatSettings
结构格式化和解析数字,日期时间值和货币的例程过载。[TCustomVariantType][68]
提供operator overloading for custom variant types {$IFDEF MSWINDOWS}
{$IFDEF LINUX}
{$LIBPREFIX}
{$LIBSUFFIX}
{$LIBVERSION}
{$MESSAGE 'message'}
{$SetPEFlags}
{$IF}{$ELSE}
编译器指令experimental
, deprecated
, library
, platform
(但没有其他文字供弃用)OLEVariant
{$J+}
) varargs
外部函数(但仅适用于cdecl
调用约定)没有新的语言功能,但是:
LongWord
和Int64
; Cardinal
是UINT32 (在它是无符号的31位值之前) Real
占用8个字节,与double
相同(以前为6个字节);
{$REALCOMPATIBILITY ON}
编译器指令覆盖; REAL48
替换旧的6字节real
; resourcestrings
{$EXTERNALSYM}
和{$NODEFINE}
指令implements
keyword属性true
存储为-1
而不是1(布尔值不变)packages
安装组件。 out
个参数。 Widestring
interface
和dispinterface
关键字以及COM(dispid
)支持。 答案 1 :(得分:16)
只是为了补充Johan的答案,请在我的博客List of changes between versions of Delphi (Since Delphi 5)
上查看此条目以及列出自delphi 2005以来的大部分新功能以及每个新资源的优秀页面The TIndex
。
答案 2 :(得分:7)
Dephi JEDI项目使用的jedi.inc文件公开了一系列功能定义。如果您的项目与MPL兼容,您甚至可以将其用于特征检测,并省去重新发明特定轮子的麻烦。
例如,如果编译器支持枚举器,则定义SUPPORTS_FOR_IN
。可以将枚举器代码包装在IFDEF
检查该定义中,而不是检查特定的编译器版本。