Difference between revisions of "Lazarus 2.2.0 release notes"

From Lazarus wiki
(LCL Interfaces Changes)
m (Previous release notes: Removed duplicated release notes listing (all n the navbar template))
Line 336: Line 336:
* Remedy: There is no.
* Remedy: There is no.
= Previous release notes =
= Other release notes =
*[[Lazarus 2.0.0 release notes]]
*[[Lazarus 1.8.0 release notes]]
*[[Lazarus 1.6.0 release notes]]
*[[Lazarus 1.4.0 release notes]]
*[[Lazarus 1.2.0 release notes]]
*[[Lazarus 1.0 release notes]]
{{Navbar Lazarus Release Notes}}
{{Navbar Lazarus Release Notes}}

Revision as of 03:55, 8 August 2020

Lazarus 2.2.0 is not yet released. This page is under construction!


  1. commits: xxx
  2. log: svn log -r xxxx:xxxx
  3. resolved bug tracker issues: xxx


LazUtils Changes

FileExistsUTF8 uses SysUtils.FileExists

  • Old behavior: FileExistsUTF8 supported Unicode in fpc 2.6.x under Windows
  • New behavior: FileExistsUTF8 now calls SysUtils.FileExists, which supports Unicode under Windows since fpc 3.0
  • Reason: Simplified

Masks unit

  • An mechanism to disable sets in a specified mask is implemented. For this purpose a new parameter Options: TMaskOptions is introduced. Specifying moDisableSets in the Options parameter will disable interpreting '[' as the begin of a set in the specified mask.
  • The use of the old methods and functions that use the CaseSensitive parameter is deprecated in favour of the use of the overload with the Options parameter.
  • Reason: User request.
  • Example: MatchesMask('[x]','[x]',[moDisableSets]) will return True.


  • Freetype font rendering units were moved to a package of its own "components/freetype/lazfreetype.lpk"
  • Reason: Units have grown to an impressive number

LCL Interfaces Changes

Internal component registration and TLCLComponent.NewInstance was optimized

LCL components are registered and mapped to a widgetset by TLCLComponent.NewInstance. This is an undocumented implementation detail and should not affect any components outside of LCL itself. However some external components could support widgetsets the same way. Then "class procedure WSRegisterClass; override;" is needed having a call to "RegisterWSComponent()". It was added to component OpenGlContext in trunk r63636. Please use it as an example if needed.


  • Qt5 widgetset needs libQt5Pas v 1.2.8 since result of QWidget_winId() is changed from PtrInt to PtrUInt.
 Windows Qt5Pas1.dll is already in lazarus trunk binaries directory.
 Linux distributions should rebuild libQt5Pas packages.
 macOS you should rebuild libQt5Pas against downloaded Qt5Pas libs (Qt5-5.6 is minimum).
  • Qt5 added QLCLOpenGLWidget into libQt5Pas v.1.2.8 for full OpenGL component support.
  • Qt, Qt5 and Gtk2: Form dimensions are accurate now on x11 (frame around form).
 Solution is provided by creating dummy widget before Application.MainForm.Handle is created. This can be disabled via
 command line switch -disableaccurateframe.This feature is used inside WidgetSet.GetWindowRect() only. 
  • Qt and Qt5: Form dimensions are accurate now on MS Windows and macOS.
 This is accomplished by creating winID if form isn't mapped yet inside 

LCL Changes

TLazIntfImage.Create with size and description flags need no CreateData anymore

  • Old: After creating of a TLazIntfImage with size and flags CreateData has to be called
  • New: Creating of a TLazIntfImage with size and flags internal calls CreateData
  • Reason: Simplify, see Issue #35035


  • New event OnAddItem gives possibility for finer control over what to add to the tree.


  • New event OnAddItem gives possibility for finer control over what to add to the listview.
  • New property MaskCaseSensitivity to allow e.g. case-insensitive masks on *nix. The property defaults to platfom standard behaviour.

New Screen temporary cursor

Screen has new methods: BeginTempCursor&EndTempCursor and BeginWaitCursor&EndWaitCursor. These should be used for temporary cursor changes instead of setting the Screen.Cursor property directly. They ensure that valid cursor values are restored.

IDE Changes

  • Added IDE macro $(OutputFile) for the outputfile of the project. This usually corresponds to $(TargetFile), except when having a host application, in which case $(TargetFile) is the host application, while $(OutputFile) is the project executable (or library).
  • Codetools support for anonymous functions
  • "Close tabs to the right" in Source-Notebook
  • Editor
    • Added commands (key-shortcut) for
      • Swap line/selection up/down (selection is extended to full lines)
      • Duplicate line/selection (selection is extended to full lines)
      • Copy/Cut append to clipboard (with space separator, unless already present
      • Copy/Cut (append) line/selection to clipboard (selection is extended to full lines, and also always includes line with caret)
    • Option to prevent Select-All/Paragraph/ToBrace from scrolling
    • Identifier Completion to trigger on any input, not just on dot. (Optional, must be enabled first)
  • Extension of master PO files (a.k.a. templates) is changed from .po to .pot.
    • Example for IDE translation:
Previously we had:
Template: lazaruside.po
German: lazaruside.de.po
Russian: lazaruside.ru.po
Spanish: lazaruside.es.po
Now we have (note extension of the template):
Template: lazaruside.pot
German: lazaruside.de.po
Russian: lazaruside.ru.po
Spanish: lazaruside.es.po
  • Reasons:
    • .pot is 'industry standard' extension for PO template files. As a consequence, PO editors can now open our templates 'out of the box' and automate creation of translations.
    • It is much simpler to detect template files now that dotted unit names are allowed.
  • Remedy: You can safely remove .po template files from your project after you rebuild your project with the new IDE (at this point .pot files should be generated).
  • Debugger
    • GDB(mi) Debugger: Stepping from exception to finally/except now works under Win64 SEH. (Requires updated GDB)
    • GDB(mi) Debugger: Updated GDB for Win64 to 8.2
    • GDB(mi) Applying a condition to a breakpoint will now mark the breakpoint as invalid, if gdb does not accept the condition. The breakpoint may still break (or not), but the condition was not set.
    • Debugger Config: The IDE now provides the ability to set up different debugger-configs as named profiles.
    • LazDebugger-FP (FpDebug) v0.9 is now part of BigIDE, and can be used as alternative backend on Windows and Linux
    • "Run to Cursor" in addition to the existing "Step over to Cursor", the debugger (gdbmi/fpdebug) now provide "Run to Cursor".
  • Project Groups:
    • Option frame under Tools / Options
    • Load last open project group on start (option to disable)
    • More / Undo menu item to undo a delete
    • More / Info menu item to show some stats. At the moment it shows all source directories.
    • Find in Files has a new option "Search in project group".
    • Option to redirect the IDE command Compile/Build project to Compile/Build the selected target in the project group editor. For example Ctrl-F9 can compile the whole project group.

IDE Interface Changes


  • OpenGL: full support for Qt5 widgetset


  • New button to minimize a docked site.


  • New IDE addon, showing a search list of all IDE commands.


  • New chart tools "TAxisClickTool", "TTitleFootClickTool" and "TLegendClickTool": Create OnClick events when the user clicks on a chart axis or its title, the chart title or footer, or the chart legend, respectively. Good for creating an interactive GUI for formatting charts.
  • New property "AllowPanning" to turn built-in panning on/off.
  • New property "LimitToExtent" for zooming tools, avoids zooming out of the chart's full extent.
  • Property editor for TSeriesPointerStyle.
  • TBarSeries:
    • New property "BarShape" for drawing alternative shapes (cylinder, hexagonal prism, pyramid or cone) instead of rectangular bar.
  • TPieSeries:
    • Impoved painting of 3D pie series due to new properties: "DepthBrightnessDelta" allowing to darken or brighten the sides of the pie slices, "Orientation" and "ViewAngle" for different views of the series
    • New property "InnerRadiusPercent" allowing to draw a chart (donut).
    • New property "MarkPositionCentered" for attaching data point labels to the pie center instead of the pie perimeter.
    • New property "StartAngle" to define the position of the first pie slice.
    • New property "AngleRange" to define tha total angular range between first and last slice.
  • TListChartSource can be sorted by X, Y, XList, YList, Color, Text, or in a user-specific way defined by the event OnCompare.
  • New TSortedChartSource which, if inserted between original chart source and series, allows sorting of TUserDefinedChartSource or TCalculatedChartSource by the same criteria as TListChartSource.
  • New property "AdjustSides" of TChartExtentLink allowing to automatically align the sides of aligned charts to each other (in case of differently sized axis labels).

Changes affecting compatibility


  • Trailing lineendings are not forcibly added to multiline strings in PO files anymore. Now multiline strings in PO files match exactly corresponding resource strings.
  • Reasons:
    • PO format does not prohibit multiline strings without trailing lineendings (and e.g. recent versions of Poedit do not complain about them).
    • New behavior unbreaks loading multiline translations from MO files.
  • Note that all multiline strings with mismatching trailing lineendings will be marked as fuzzy during translation update.
  • LConvEncoding in LazUtils: unit had global variable ConvertEncodingErrorRaisesException (boolean) which is now replaced to enum:
  TConvertEncodingErrorMode = (
  ConvertEncodingErrorMode: TConvertEncodingErrorMode = ceemSkip;

LCL incompatibilities

TMaskEdit: hexadecimal and binary characters

Mask support for hexadecimal and binary characters was added (this is a Lazarus extension, Delphi does not support this).

  • Old behavior: the characters 'h', 'H', 'b' and 'B' had no special meaning in the EditMask property
  • New behavior: these characters now are mask characters for hexadecimal and binary input respectively.
  • Reason: nice to have feature (QT5 supports it natively).
  • Remedy: if you need one of these characters as a literal in your EditMask: escape them with a '\'.

TCanvas.PolyBezier default behavior

The default value of the Continuous parameter was changed because it breaks Delphi compatibility.

  • Old behavior: There are several overloads and optional parameters of the canvas' PolyBezier method. In the Delphi-compatible call having only the points array as a parameter, the Continuous argument has the default value false.
  • New behavior: The argument Continuous has the value true now.
  • Reason: The Delphi PolyBezier behavior is different from the Lazarus behaviour with the same call parameters; it draws the Bezier curve like Lazarus using Continuous = true.
  • Remedy: To obtain the old behavior expand the parameter list by the Continuous parameter set to false.

TImageList stores compressed images in LFM

  • Old: TCustomImageList stored binary bitmap data of the base resolution.
  • New: The binary bitmap data streamed to LFM is compressed with ZLib.
  • Reason: smaller LFM and EXE files.
  • Effects: Lazarus 1.8 cannot open LFMs with a TImageList from Lazarus 2.2. Lazarus 2.0 can open them.
  • Remedy: If you want to open a Lazarus 2.2 project in Lazarus 1.8, you first have to open it in Lazarus 2.0, open all forms containing LFMs with a TImageList and resave them. Then you can open these resaved LFMs in Lazarus 1.8.

TCalendar: option dsStartMonday of DisplaySettings replaced by Delphi-compatible FirstDayOfWeek property

  • Old behavior: Changing the start day of a week to Monday works only in QT and QT5 widgetsets. And even there it does not allow for other weekdays like Saturday as needed for the Arabian world. Moveover the option is not compatible with Delphi which uses a separate property FirstDayOfWeek.
  • New behavior: The option dsStartMonday has been removed, use the property FirstDayOfWeek instead. It allows switching to other weekdays as well. The default option, dowDefault, makes the weeks begin with the day defined by the widgetset/OS - which is the old behavior in those cases where dsStartMonday did not work.
  • Reason: Improved Delphi compatibility, more than two weekdays should be allowed as start of the week.
  • Remdy: In most cases dsStartMonday probaby has not been set because it did not work. If it was set, ignore the property when reading (or remove the line dsStartMondy = true from the lfm file), and set FirstDayOfWeek to dowMonday in the Object Inspector.
  • Note 1: The FirstDayOfWeek property is still not supported by all widgetsets. It is respected only for win32, qt and qt5.
  • Note 2: The name of the default option of FirstDayOfWeek, dowDefault, is not exactly Delphi-compliant (dowLocaleDefault) because a "Locale" does not exist in all widgetsets. Since the default value is not stored anyway this incompatibility may be tolerable.

TCustomComboBox.ReadOnly was deleted

  • Old behavior: There was a TCustomComboBox.ReadOnly property (deprecated in 1.8) that was True if the combobox had an editbox and False if not.
  • New behavior: The property was deleted.
  • Reason: Confusing name. It was named "ReadOnly", yet the user was able to change the ItemIndex/Text by picking up an item from the drop-down.
  • Remedy: Use TCustomComboBox.Style.HasEditBox for reading. For writing set a new combobox style directly with the value returned from TCustomComboBox.Style.SetEditBox(True/False).

Components incompatibilities

TAChart: Chart.AllowZoom changed

The property AllowZoom of TChart is meant to give the user the chance to turn the builtin zooming feature on or off.

  • Old behavior: AllowZoom operates also on an external toolset.
  • New behavior: AllowZoom is effective only for the built-in toolset.
  • Reason: More consistent handling of properties
  • Remedy: Use the property Enabled of the external zoom tool to switch zooming off, or don't add a zoom tool at all.

TAChart: DataPointDrawTool.OnDraw event deprecated

The event OnDraw of the data point draw tools (TDataPointCrosshairTool, TDataPointDistanceTool) will be removed and replaced by the new event OnCustomDraw.

  • Old behavior: OnDraw uses the chart's Drawer for painting the crosshair or distance bars.
  • New behavior: the Drawer to be used is passed as a parameter.
  • Reason: When a chart is painted to an external file the chart's Drawer still refers to the screen; therefore, the datapoint cross hair or distance bars are missing in the external file.
  • Remedy: Copy the old OnDraw event handler code to the new OnCustomDraw handler, but replace "Chart.Drawer" by the "ADrawer" given as a event parameter.

TAChart: TChartAxis.OnMarkToText event deprecated

The event OnMarkToText of the chart's axes will be removed and replaced by the new event OnGetMarkText.

  • Old behavior: The old OnMarkToText event does not have a Sender parameter.
  • New behavior: The new OnGetMarkText event has the affected axis as Sender parameter.
  • Reason: When dealing with multiple charts and/or multiple axes, it is currently required to create an individual handler for each axis because it is not possible to determine the axis for which to create axis marks for. This is not required any more with the new event.
  • Remedy: Copy the old OnMarkToText handler code to the new OnGetMarkText handler.

TAChart: OpenGL-related units moved to separate packge TAChartOpenGL

  • Old behavior: OpenGL-related units had been available in the main TAChartLazarusPackage directly. The drawer unit TADrawerOpenGL was not added to the uses list automatically and required a special treatment (see old OpenGL demo project).
  • New behavior: OpenGL-related units are now contained in the new package TAChartOpenGL.
  • Reason: Compilation issues when the system did not contain OpenGL libraries.
  • Remedy: Add package TAChartOpenGL to the requirements of the project. Only needed when project uses the OpenGL drawer.

VirtualTreeViews: Renamed to "laz." prefix

VirtualTreeViews is essentially needed by OnlinePackageManager. Having this original package within the Lazarus installation makes is impossible for users to install a different version of this package.

  • Old behavior: Projects with VirtualTreeViews required the "virtualtreeview_package" and had the unit "virtualtrees" in the uses clause. The registered component classes were named "TVirtualStringTree", "TVirtualDrawTree", "TVTHeaderPopup".
  • New behavior: The package was renamed to "laz.virtualtreeview_package". All file names were changed to have a "laz." prefix, i.e. the uses clause will have to contain "laz.virtualtrees". The registered components are named "TLazVirtualStringTree", "TLazVirtualDrawTree", and "TLazVTHeaderPopup".
  • Reason: Avoid naming conflicts when another version of VirtualTreeViews is installed
  • Remedy: For existing projects requiring the VirtualTreeViews distributed with Lazarus,
    • open the lfm file in an external editor and replace "TVirtualStringTree" by "TLazVirtualStringTree", as well as - if available - "TVirtualDrawTree" by "TLazVirtualDrawTree" and "TVTHeaderPopup" by "TLazVTHeaderPopup".
    • open the project in the IDE, remove package "VirtualTreeView_package" from the project requirements and replace it by "laz.virtualtreeview_package"
    • in the pas file's "uses" clause, replace "virtualtrees" by "laz.virtualtrees"
    • in the pas file replace "TVirtualStringTree" by "TLazVirtualStringTree" (and accordingly for the other VTV components).


SynEdits TextView system has undergone some changes. TextViews (TSynEditStrings) map the physical text (as saved/loaded to/from a file) to what is visible on the screen.

This also affects the coordinate system. In addition to Logical/Physical SynEdit now also has ViewedXY. "Viewed" also maps the Y coordinate.

SynEdit.TextView / TSynEditFoldedView

The protected property SynEdit.TextView is no longer of type TSynEditFoldedView. It may hold any other TextView-class instead.

  • Old behaviour: TSynEditFoldedView was accessible via SynEdit.TextView
  • New behaviour: SynEdit.TextView can be any TextView
  • Remedy: SynEdit.TextViewsManager.SynTextViewByClass[TSynEditFoldedView]

Class hierarchy

  • TSynEditFoldedView is now a TSynEditStrings.


  • Old behaviour: Lines/Count referred to visible lines only
  • New behaviour: Lines/Count referred to al lines.
  • Remedy: Use ViewedLines / ViewedCount


  • Old behaviour: TextToViewIndex/ViewToTextIndex => ViewPos was 1 based
  • New behaviour: TextToViewIndex/ViewToTextIndex => ViewPos was 0 based
  • Remedy: Use ToPos() / ToIdx()

  • Old behaviour: TextPosAddLines with 1 based lines/result
  • New behaviour: AddVisibleOffsetToTextIndex with 0 base lines/result
  • Remedy: Rename and use ToPos() / ToIdx()


  • Old behaviour: AddFoldChangedHandler was reporting changes to folding.
  • New behaviour: AddChangeHandler(senrLineMappingChanged)

senrTextBufferChanging / senrTextBufferChanged

Callbacks on the TextView/TextBuffer were only valid for the current Buffer. If SynEdit shared/unshared the textbuffer, then all handlers needed to be re-registered.

This is no longer needed.

ScreenRowToRow/RowToScreenRow => ScreenXYToTextXY/TextXYToScreenXY

ScreenRowToRow/RowToScreenRow were deprecated, use ScreenXYToTextXY/TextXYToScreenXY

The new functions take a point, instead of just a line/row. This reflects the idea that a single text-line can visible occupy several lines. Or mapping can otherwise relay on the x pos, depending on whatever TextViews are used.

RowColumnToPixels => ScreenXYToPixels

RowColumnToPixels is deprecated, use ScreenXYToPixels


  • Old behaviour: TSynCustomExporter.ExportRange raised an EAbort exception when ALines or Highlighter is unassigned, or when the content of the range to be exported was in fact empty.
  • New behaviour:
    • A verbose exception (ESynExport) is raised when either ALines or Highlighter are unassigned.
    • No exception is raised if the range to be exported is empty, it will simply export nothing in that case.
  • Reason:
    • Raising EAbort if the range to be expoterd is empty doesn't really make sense, at least it should not be forbidden.
    • Not having a Highlighter or not having Lines is a critical error, and as such must raise a verbose exception.
  • Remedy: if you code relied on this behaviour (rasing EAbort), you will have to adjust it.

IDE incompatibilities

LPI&LPS project files: XML structure changed

  • Old behavior: Child elements had an index suffix.
  • New behavior: Child elements have no suffix.
  • Problems: New LPI files cannot be opened in legacy Lazarus installations.
  • Reason: VCS like the new structure better.
  • Remedy: Save your LPI files in compatibility mode. (Project options -> Miscellaneous -> Maximize compatibility of project files)

LPK package files: XML structure changed

  • Old behavior: Child elements had an index suffix.
  • New behavior: Child elements have no suffix.
  • Problems: New LPK files cannot be opened in legacy Lazarus installations.
  • Reason: VCS like the new structure better.
  • Remedy: Save your LPK files in compatibility mode. (Package options -> Usage -> Maximize compatibility of package file)

Packages incompatibilities

ProjectGroups: LPG XML structure changed

  • Old behavior: The <Mode?> elements were not placed within the <BuildModes> element. Child elements had an index suffix.
  • New behavior: Child elements have no suffix.
  • Problems: New LPG files cannot be opened in legacy Lazarus installations.
  • Reason: VCS like the new structure better.
  • Remedy: There is no.

Other release notes