Delphi Version Features
This page contains an incomplete list of which features were introduced in which versions of Delphi1.
If you have any additions or corrections please create an issue on GitHub (GitHub account required).
Feature |
Version |
& operator for treating keywords as identifiers |
Delphi 2006 |
{$ALIGN} compiler directive can take additional parameter 16 to set 16 byte alignment6 |
Delphi XE |
{$CODEALIGN} compiler directive6 |
Delphi XE |
{$EXCESSPRECISION} compiler directive for 64 bit compilers only6 |
Delphi XE2 |
{$EXTERNALSYM} compiler directive6 |
Delphi 4 |
{$HIGHCHARUNICODE} compiler directive6 |
Delphi 2009 |
{$IF} & {$IFEND} compiler directives6 |
Delphi 6 |
{$IFEND} compiler directive no longer required to close {$IF} statements: {$ENDIF} can now be used instead.2 |
Delphi XE4 |
{$LEGACYIFEND} compiler directive2 |
Delphi XE5 |
{$LIBPREFIX} , {$LIBSUFFIX} & {$LIBVERSION} compiler directives6 |
Delphi 6 |
{$MESSAGE} compiler directive |
Delphi 6 |
{$POINTERMATH} directive |
Delphi 2009 |
{$TEXTBLOCK} directive to determine how line breaks are treated in multiline strings. |
Delphi 12 |
{$METHODINFO} compiler directive6 |
Delphi 2006 |
{$NODEFINE} compiler directive6 |
Delphi 4 |
{$POINTERMATH} compiler directive |
Delphi 2009 |
{$REGION} & {$ENDREGION} compiler directives6 |
Delphi 2005 |
{$STRONGLINKTYPES} compiler directive6 |
Delphi XE |
{$TEXTBLOCK} compiler directive to determine how line breaks are treated in multiline strings. |
Delphi 12 |
{$WARN} compiler directive |
Delphi 7 |
{$WRITEABLECONST} compiler directive default value changes from ON to OFF . |
Delphi 6 |
[ref] attribute6 |
Delphi XE3 |
0..9 |
32 bit compiler & support for Windows 957 |
Delphi 2 |
64 bit binary versions of the Delphi 32 and 64 bit compilers |
Delphi 12.2 |
64 bit compiler |
Delphi XE2 |
A |
Abstract classes |
Delphi 2006 |
Actions & action lists |
Delphi 4 |
Android 32 bit compiler & support7 |
Delphi XE5 |
Android 64 bit compiler6 |
Delphi 10.4 |
Anonymous methods / closures |
Delphi 2009 |
AnsiString replaces ShortString as the default string type6,7. |
Delphi 2 |
Atomic intrinsic functions AtomicExchange, AtomicIncrement, AtomicCmpExchange & AtomicDecrement6 |
Delphi XE3 |
Attributes |
Delphi 2010 |
B |
Binary integer literals, e.g. %100101 |
Delphi 11 |
Build groups7 |
Delphi XE |
C |
class constructors / destructors |
Delphi 2010 |
Class data (class var) |
Delphi 2006 |
Class helpers |
Delphi 2005 |
Class helpers and record helpers can no longer access private data of the related class or record6 |
Delphi 10.1 |
Class properties |
Delphi 2005 |
Currency type6 |
Delphi 2 |
Custom managed records |
Delphi 10.4 |
D |
Default intrinsic compiler routine (undocumented) that gets the default value of a given type.6 |
Delphi 2009 |
Default parameters in functions, procedures & methods6 |
Delphi 4 |
delayed keyword (for loading of DLLs) |
Delphi 2010 |
dependency directive (for specifying the dependencies of an external library)6,10 |
Delphi XE4 |
deprecated directive |
Delphi 6 |
deprecated directive with comment |
Delphi 2009 |
DirectX 10 support7 |
Delphi XE3 |
DirectoryExists function moved to SysUtils unit from FileCtrl |
Delphi 6 |
Digit separators in integer and floating point literals: e.g. 1_000_000 |
Delphi 11 |
dispid directive6 |
Delphi 3 |
dispinterface keyword6 |
Delphi 3 |
Docking, Anchors & Constraints in forms7 |
Delphi 4 |
Dynamic array concatenation and addition extensions. Dynamic arrays can be initialised by assigning an array constant, as in DI := [1, 2, 3]; and can be concatenated using code like DI := DI + [1, 2, 3]; or DI := DJ + DK , where DI, DJ & DK are all dynamic integer arrays. See also Dynamic array intrinsic routines. |
Delphi XE7 |
Dynamic array intrinsic routines. The Concat, Insert & Delete compiler intrinsic routines now operate on dynamic arrays. See also Dynamic array concatenation and addition extensions. |
Delphi XE7 |
Dynamic arrays |
Delphi 4 |
E |
EncodePath, EncodeAuth, EncodeQuery & EncodeForm functions |
Delphi 10.1 |
EOSError (instead of EWin32Error) |
Delphi 6 |
ExcludeTrailingPathDelimiter function |
Delphi 6 |
Exit with result parameter |
Delphi 2009 |
experimental hinting directive6 |
Delphi 6 |
Extended type changes size depending upon the hardware and operating system5 |
Delphi XE2 |
F |
FastMM memory manager7 |
Delphi 2006 |
Final methods |
Delphi 2006 |
FireMonkey cross platform framework (FMX)7 |
Delphi XE2 |
FireMonkey cross platform framework v2 (FM2) |
Delphi XE3 |
FixedInt & FixedUInt types - 32 bit signed & unsigned integers respectively across all platforms |
Delphi XE8 |
Floating point number comparison routines added to Math unit3 |
Delphi 6 |
Focus mode in IDE editor8 |
Delphi 12.2 |
for .. in loops |
Delphi 2005 |
Form inheritence7 |
Delphi 2 |
Frames |
Delphi 5 |
Function inlining |
Delphi 2005 |
G |
Generics |
Delphi 2009 |
GetCompilerVersion & GetRTLVersion routines to get compiler & RTL versions as 16 bit unsigned integers with major version in the high byte and minor version in the low byte. |
Delphi 12 |
GetTypeKind intrinsic compiler function (undocumented)6 |
Delphi XE7 |
H |
HasWeakRef intrinsic compiler function (undocumented)6 |
Delphi XE7 |
Hash (System.Hash) unit |
Delphi XE8 |
I |
IInterface |
Delphi 6 |
implements keyword for properties6 |
Delphi 4 |
IncludeTrailingPathDelim function |
Delphi 6 |
Inline variable declarations: e.g. for var I: Integer := 0 to 9 do or, with type inference, for var I := 0 to 9 do |
Delphi 10.3 |
inline keyword |
Delphi 2005 |
Inner exceptions |
Delphi 2009 |
Insert and Delete RTL routines can be used with dynamic arrays in a similar way to how they are used with strings. |
Delphi XE7 |
Int8, Int16 & Int32 types |
Delphi 2009 |
Int64 type |
Delphi 4 |
interface keyword extended to introduce an interface type definition |
Delphi 3 |
Interface to object casting |
Delphi 2010 |
iOS 32 bit compiler & support reintroduced6,7,9 |
Delphi XE4 |
iOS 64 bit compiler6 |
Delphi XE8 |
IOUtils unit |
Delphi 2010 |
IsConstValue intrinsic compiler function (undocumented)6 |
Delphi XE7 |
IsManagedType intrinsic compiler function (undocumented)6 |
Delphi XE7 |
IUnknown (COM based interfaces)7 |
Delphi 3 |
L |
library directive |
Delphi 6 |
Linux compiler for server applications |
Delphi 10.2 |
Linux client platform support added via 3rd party FMXLinux library.8 |
Delphi 10.3.1 |
Live bindings for VCL & FMX7 |
Delphi XE2 |
Long string literal support: string literals can now be longer than 255 characters. |
Delphi 12 |
LongInt & LongWord type sizes become platform dependent: 32 bit on 32 bit platforms, 64 bit on 64 bit platforms. |
Delphi XE8 |
LongWord type |
Delphi 4 |
M |
MacOS ARM 64 bit compiler6,8 |
Delphi 11 |
macOS 32 bit compiler7 |
Delphi XE2 |
macOS 64 bit compiler6 |
Delphi 10.4 |
Margins and Padding properties on TControl |
Delphi 2006 |
MariaDB support added8 |
Delphi 10.2 |
Markdown support in IDE8 |
Delphi 11.2 |
Metropolis UI for Windows 8 back to XP7 |
Windows XE3 |
Mobile form designer7 |
Delphi XE4 |
MSBuild & build events7 |
Delphi 2007 |
Multiline string literals, delimited by triple quotes (''' ) |
Delphi 12 |
MySQL support7 |
Delphi 2006 |
N |
Namespaces [more info]. See also: Unit scope names. |
Delphi 2005 |
NaN number comparisons supported |
Delphi 12 |
NativeInt & NativeUInt types |
Delphi 74 |
NativeInt & NativeUInt types become weak references. They can no longer be used as separate types. |
Delphi 12 |
Nested constants within classes / records |
Delphi 2005 |
Nested types within classes |
Delphi 2005 |
O |
OLE automation7 |
Delphi 2 |
Operator overloading on records |
Delphi 2006 |
out parameters & keyword6 |
Delphi 3 |
overload directive |
Delphi 4 |
Overloading for functions, procedures and methods6,7 |
Delphi 4 |
P |
package keyword and change to install components in packages6 |
Delphi 3 |
Parallel library in RTL6 |
Delphi XE7 |
platform directive |
Delphi 6 |
Pointer type size becomes platform dependent: 32 bit on 32 bit platforms, 64 bit on 64 bit platforms. |
Delphi XE2 |
R |
RaiseLastOSError procedure |
Delphi 6 |
real type changes from 8 bytes in size to 6 bytes and becomes an alias for Double. The Real48 is introduced as a 6 byte replacement for the old real. |
Delphi 4. |
Record Helpers for built in types6 |
Delphi XE3 |
Record helpers for TDateTime and Currency types. |
Delphi 11 |
Records with methods (aka enhanced methods or advanced records) |
Delphi 2006 |
register calling convention6 |
Delphi 2 |
Regular expression library7 |
Delphi XE |
resourcestring statement |
Delphi 3 |
REST services components7 |
Delphi XE5 |
RTTI enhancements |
Delphi 2010 |
S |
SafeLoadLibrary function |
Delphi 5 |
Scoped enumerators (must have type name prefix) |
Delphi 2009 |
Sealed classes |
Delphi 2006 |
Sensor support for VCL & FMX7 |
Delphi XE3 |
Skia integration |
Delphi 12 |
Smart Code Insight with embedded AI |
Delphi 12.2 |
Split editor views in IDE8 |
Delphi 12 |
static methods and properties7 |
Delphi 2005 |
stdcall calling convetion6 |
Delphi 2 |
strict private and strict protected visibility specifiers |
Delphi 2005 |
string type is UnicodeString |
Delphi 2009 |
StrUtils unit |
Delphi 6 |
T |
TApplication.MainFormOnTaskbar property |
Delphi 2007 |
TArray type in System unit. |
Delphi 2010 |
TBytes alias for array of Byte |
Delphi 2007 |
Text format form files |
Delphi 5 |
TForm.ShowInTaskbar property |
Delphi 12 |
TForm.ShowInTaskbar property |
Delphi 12 |
TFormatSettings and overloaded format and conversion routines that use it |
Delphi 7 |
threadvar keyword and threading support6 |
Delphi 2 |
TNoRefCountObject non-reference-counted IInterface implementation |
Delphi 11 |
TOrderedDictionary - a sorted generic dictionary class. |
Delphi 12.2 |
TObject.Equals virtual method |
Delphi 2009 |
TObject.GetHashCode virtual method |
Delphi 2009 |
TObject.ToString virtual method |
Delphi 2009 |
TObject.UnitName method |
Delphi 2009 |
Touch & gesture support |
Delphi 2010 |
TPair<TKey,TValue> record |
Delphi 2009 |
TParallelArray - a class to enable running of some operations in parallel threads. |
Delphi 12.2 |
TProc<T1,...>, TFunc<T1,...> & TPredicate<T> |
Delphi 2010 |
TRegistry supports access flags |
Delphi 6 |
TRegistry.OpenKeyReadOnly method |
Delphi 4 |
TryStrToXXXX routines added to SysUtils |
Delphi 6 |
TStream supports 64 bit size and seek offsets |
Delphi 6 |
TStringList.Create(OwnsObjects: Boolean) constructor overload |
Delphi 2009 |
Typed constants can no longer be assigned values by default. The {$J+} compiler directive must be used to restore previous behaviour6. |
Delphi 6 |
Types unit |
Delphi 6 |
U |
UInt8, UInt16 & UInt32 types |
Delphi 2009 |
UInt64 type |
Delphi 7 |
Unicode identifier names |
Delphi 2005 |
Unicode source files |
Delphi 2005 |
Unicode support (inc Windows API) |
Delphi 2009 |
UnicodeString type |
Delphi 2009 |
Unit conversion handling (that's unit as in mm or inches, not unit as in source code unit) |
Delphi 6 |
Unit scope names [More info]. See also: Namespaces. |
Delphi XE2 |
UTF8 source files |
Delphi 2005 |
UTF8Decode and UTF8Encode routines |
Delphi 6 |
UTF8String type |
Delphi 6 |
V |
Variants unit |
Delphi 6 |
VCL styles |
Delphi XE2 |
W |
WebStencils - scriptable text-processing engine. |
Delphi 12.2 |
WideString type6 |
Delphi 3 |
Windows 7 & 8.1 styles8 |
Delphi XE6 |
Windows 10 styles8 |
Delphi 10 |
Windows Vista support (glass & themes)7 |
Delphi 2007 |
Windows XP themes7 |
Delphi 7 |
X |
XML support7 |
Delphi 5 |
XMLDoc documentation |
Delphi 2005 |
Z |
Zip file support added with new TZipFile class |
Delphi XE2 |