IDE
- Removed deprecated features: VCL Translation Support & Modeling
- Object Inspector – New string list editor
- Multiline string Editor
- Multiline string literals
- The Find in Files dialog now has a new Subdirectory exclude mask option, which excludes specific folders from being searched when using the Search in directories and Include subdirectories There are default exclusions for both Delphi and C++, and the dialog has been widened to fit the new content.
- Quick Button/RadioGroup/Panel Configuration (not a big deal, some of them were already available via gExperts/CnPack)
- Single App Icon – a comprehensive tool integrated within the RAD Studio IDE, designed to streamline the process of generating icons and splash screens
- Go to Definition.Implementation features, which corresponds to the Ctrl+Shift+Up/Down.
- Editor tabs now have a Copy File Path menu item.
- New tool called “WinAPI Delphi Headers from WinMD” available via GetIt – Internal import tool capable of generating Delphi definitions for the classic Windows APIs using the metadata available by Microsoft in WinMD format. Search for WinMD in GetIt Package Manager.
- The IDE can show color as hex in Code Completion:
VCL
- Controls.TWincontrol.GetControls
- Nativeint becomes a weak alias, meaning that it is not a stand-alone type anymore: blog.marcocantu.com/blog/2023-october-nativeint-weak-alias.html
- IOoutils.TPath has two new methods: GetDesktopPath and GetAppPath.
- “Tile View” support in tlistview
- TForm has a new ShowInTaskbar property, controlling if a form should have a matching entry in the Windows taskbar, even if it’s not the main form.
- New TFormTabsBar control – A universal and ready-to-use solution for hosting multiple child forms in a modern tab-like user interface, as a possible modernization path for existing MDI applications, but also as a way to create brand new applications in VCL.
- VCL – New methods related to DPI. Now instead of Font.Height := MulDiv(Font.Height, M, D) one should use Font.ChangeScale(M, D, isDpiChanged).
- New Double Buffering Mode – Enabling DoubleBuffering in themed controls (such as TButton, TCheckBox, TRadioButton), breaks native system animation when the control changes state. Use CanUseDoubleBuffering method and overridden it (for the TButtonControl controls) class to disable double buffering.
FMX
- FMX: webp Encoder – Animated Codec (through Skia)
- Android Target API Level 33
RTL
- DWM – Added support for some advanced desktop management features in Windows 11. These features do not work on older versions of the operating system. In version 12.0, several new DWMWA_xxx constants have been added to the Winapi.DWmapi.pas unit to enable the new platform features. Activate these features by calling the DWMSetwindowattribute API in the same unit. Also, VCL forms now support the immersive dark mode of Windows 11. Call the new EnableImmersiveDarkmode method of the TForm class to enable it.
Note: DWM is primarily responsible for compositing the desktop (e.g., transparency effects, window animations – but not wallpaper).
- BOM – A new UseBOM property, available in all subclasses. This value can be passed as a parameter to a new overloaded constructor.
Use TEncoding.IsBufferValid method to check if a given buffer contains valid data for a given encoding. This is particularly relevant when determining if a BOM-less text file is UTF-8 or ASCII. Uses the Bjoern Hoehrmann algorithm.
- Use class function System.Generics.Collections.TArray.ToString<T> to convert a list of elements to a string representation with the specified formatting and delimiters.
- GetLinesEnumerator – New enumerators for reading file content – Returns the line-by-line enumerator without loading full file content into the memory. Check the LightSaber\ccTextFile.pas to see how to use it. Memory Efficiency: TFile.GetLinesEnumerator reads the file line by line, which is memory-efficient for large files. Unlike TFile.ReadLines (which loads all lines into a list), this method streams the file incrementally.
Skia
- TSkAnimatedImage – Loads and renders animated images, including vector animations.
- TSkPaintBox: control for painting with Skia APIs directly on the screen.
- TSkAnimatedPaintBox: allows setting the duration of an animation.
- TSkSVG: control to display SVG.
- Skia Shading Language (SKSL)
- Animated codec: WebP Encoder for encoding animated WebP. WebP is one of the most widely used formats on the web due to its superior compression compared to JPEG, resulting in smaller file sizes while maintaining higher quality. It also offers animation capabilities similar to GIFs but with lossless frames, meaning there is no loss of quality and/or some compression. Additionally, it supports transparency, making it a highly versatile format. See the Skia Animated Codec documentation for examples and more information.
- Printer Support and Printing to PDF
When Skia is enabled, Firemonkey’s native Printer for Windows will use Skia as its backend for the physical printer and ensure support for all other platforms through PDF document printing, with the optional XPS printing also available when the target is Windows. On iOS and Android, the printer will generate a printable file, which will be automatically shared upon completion.
Debugger/Compiler
- The Delphi32 compiler now handles NaN comparisons according to IEEE754
- Debugging Delphi code using anonymous methods shows captured variables.
- The debugger tooltip in the editor now scales following the font size and has syntax
- GraphViz – a new compiler switch to help users understand the structure of a project and avoid unneeded circular unit references.
Unfortunately, this can be done only via command line and it requires and eternal tool to see the graph. Example:
dcc32 –graphviz –graphviz-exclude=System.*;Vcl.*;WinApi.* GraphTest.dpr
- On Win32/64, the default behaviour of the RTL floating-point exception (Default8087CW, DefaultMXCSR, DefaultFPSCR, and DefaultFPSCR) was changed aiming to disable all floating-point exceptions by default if a floating-number operation detects incidents.
- Added new TArray methods: IndexOf, LastIndexOf, Contains.
- Generics.Collections and the classic TList now use NativeInt instead of Integer for all indexes.