# Lazarus 0.9.30 release notes

Statistics:

1. commits: 7500+
2. log: svn log -r 21920:29689
3. resolved bug tracker issues: 354

## LCL Interfaces major changes

• Windows CE: Implemented menu support for KeyPad devices (previously worked only in PDA devices) and in general much improved menu support.
• Windows CE: Implemented Clipboard support and implemented TScrollBox.
• Windows CE: Top position of TPageControl tabs is now supported. Note that because tpTop is the default value of the TabPosition property, the default position will change from bottom to top.
• Gtk2: Application.OnActivate() / Application.OnDeactivate() now fires only once per event, not on each form activation/deactivation.
• Gtk2: Application.Minimize, Application.Restore implemented.
• Gtk2: Fixed unpleasant form moving when hidden and then shown again.
• GTK2 was separated from GTK1. The unit gtkint, gtkproc, gtkdef are no longer part of the gtk2 interface. Use unit gtk2int, gtk2proc, gtk2def instead.
• Qt: Application.Minimize, Application.Restore implemented.
• TGetDesignerFormEvent parameter uses TPersistent instead of TComponent. Reason: support for TCollection and TCollectionItem. Effects only designers.
• fpGUI: All components on the Standard tab of the component palette are now working.

## LCL Changes

• Unit chart and its component TBarChart are deprecated, because there is now a much better component in the package TAChartLazarusPkg.
• OpenURL and OpenDocument, new functions in the LCLIntf unit.
• TApplication.ApplicationType: atSmartphone was renamed to atKeyPadDevice to have a more consistent name. Smartphone devices with touch screen should be of atPDA type instead. atKeyPadDevice should be used for very simple phones and other simple devices (GPS, bar code scanner, etc) without touchscreen. atHandheld was removed. The supported types now are atKeyPadDevice, atPDA, atDesktop and atDefault. The correct type is calculated in Application.Initialize if one isn't forced. This property can be used to verify if automatic modifications are in place to adapt the application to the device.
• TButton, TCustomButton are no longer defined in the Buttons.pas unit, but in unit StdCtrls only (previously buttons.pas had own TCustomButton, TButton type declarations). Initial class code move was made before the Lazarus 0.9.22 release because of Delphi compatibility.
• DisableAutoSizing/EnableAutoSizing now work for the whole form, greatly reducing overhead and flicker.
• ReAlign and AdjustSize now do the same - invalidating the bounds and triggering a new computation of the sizes.
• Nested controls now update properly. No need anymore to call ReAlign or Parent.AdjustSize.
• DisableAutoSizing/EnableAutoSizing now work even when changing the Parent of a control, reducing overhead and flicker when docking.
• TControl.DoAutoSize now resizes to preferred size. No need to do that in descendants. It also checks for dependencies.
• TControl.Align ordering of controls is now stable (resizing no longer reorders). There is one incompatibility. See Order of Align
• TControl.AutoSizeCanStart is now deprecated and always true.
• TCustomForm.FormStyle added fsSystemStayOnTop.Meaning is same as with fsStayOnTop except that fsStayOnTop is form on app top, so when application deactivates fsStayOnTop is not on top of other application(s), fsSystemStayOnTop is always on top.
• TLazIntfImage - New function AlphaBlend, which can alpha blend an intfimage into another, using a separate intfimage as the alpha channel.
• TTrackBar - New property Reversed which inverts appereance of TTrackBar.There's a lot of complains from developers about behaviour of TTrackBar when Orientation is vertical.In that case Min is at top and Max is at bottom of trackbar and that's not comfortable because we have to write additional code to invert trackbar appereance.Default value is FALSE which is Delphi compatibile (this property does not exist in Delphi), TRUE should revert appereance so Min is at bottom and Max is at top in case of vertical scrollbar and Min = Right, Max = Left in case of horizontal scrollbar.

## IDE Changes

• Support for FPC resources: You can now use {$R *.lfm} instead of {$i unit1.lrs}.
• Delphi converter has improved a lot. See Delphi_Converter_in_Lazarus
• Build modes, build macros and conditionals now allows different sets of compiler options for projects and packages.
• The option for the project target file name was moved to the paths page under compiler options.
• When creating a new project the default unit output directory is now lib/$(TargetCPU)-$(TargetOS). Target file name is project1. This has no impact on old projects.
• When opening a project the option to 'automatically open designer forms' now opens only the forms that were opened last time. The information is stored in the session.
• Various designer usability improvements:
• arrow and tab keys switching between components
• resize/move cancellation using ESC key
• save/restore of the form window state (minimized/normal/maximized) in the project session
• extended hints: show component TabStop,TabOrder in case of TWinControl, show new size/new position during components resize/reposition
• skip snapping when Alt key is pressed
• Quick fix for can't find unit: search unit in packages and add requirement
• Object inspector improvements:
• Draw read only properties using another color (gray by default)
• New ImageIndex property editor
• Editor
• Highlighting for diffs
• Highlighting for bat and ini (thanks to vrode for porting from original SynEdit)
• Folding for HTML, XML, LFM, Diff
• Hiding (Folding) of comments in Pascal source.
• Allow Multiple Source-Editor Windows
• Allow several Views of the same Source
• User-defined color-schemes. (Color-schemes can be exported, and made available in the list of existing schemes)
• Identifier-completion pop-up is now resizeable
• Optionally save tab history so that closing or moving a tab to another window results in the last used tab to be selected.
• Debugger / Editor
• Inserted/Deleted lines during a debug session are now tracked. Breakpoints and Execution-line are adjusted. (Since the debugger only knows the line numbers from before the change).
• Package file names in packagefiles.xml are now saved without Lazarus source directory. Switching to another Lazarus source directory automatically reloads packages from the new Lazarus source directory.
• IDE now checks if lpi file changed on disk and asks if it should reopen the project.
• The IDE no longer saves the lpi/lps file on every build, but only if something changed.
• Project compiler options can now be saved as default for new projects (see here)
• Packages can now have a normal unit with the same name as the package. For example the package SynEdit has the unit synedit.pp. See here
• If you start multiple instances of the IDE to debug different projects (e.g. client, server) you can now show the project name on the taskbar. See here.
• IDE now preserves the file endings of source files (it uses the line ending of the first line, so it does not preserve mixed line endings). You can change the line ending of a source file via Source Editor / popup menu / File settings / Line ending.
• IDEIntf:
• Incompatibility: PropEditUtils unit is extracted from PropEdits. The function GetLookupRootForComponent was moved there.
• Incompatibility: TIComponentInterface was removed. It only added another layer without any extra functionality. See here for remedies: Extending the IDE.
• IDEIntf: TAbstractFormEditor.CreateComponent added boolean DisableAutoSize. If you pass true the form will flicker far less, but you have to call EnableAutoSizing afterwards.
• SrcEditorIntf:
• Introduced TSourceEditorManagerInterface
• Deprecated SourceEditorWindow, replaced by SourceEditorManagerIntf
• Deprecated some methods on TSourceEditorWindowInterface, now available through TSourceEditorManagerInterface
• The ImageList Editor can split images that contains sub images in both dimensions (Width X Height), e.g., loading a image of size 48 X 32 in a image list with width and height equal to 16 will split into 6 sub images of size 16 x 16. Previously it was only possible to split files where the file width was a factor of the image list width and image height matched image list height. This allows to export/import image lists between different projects and matches a Delphi feature.
• You can now quickly switch between several versions / branches of packages by defining the preferred package file name for each dependency (see here)
• You can now use the IDE directive %H- to hide individual hints, notes and warnings. See Hide hint via directive
• The IDE can be made dockable. This is still experimental. Install either the package AnchorDockingDsgn or EasyDockMgrDsgn.
• Translations
• New macros: MakeLib, Make, IDEBuildOptions. See here IDE Macros
• The ToDo list was moved to a separate package: components/todolist/todolistlaz.lpk. It is installed by default in the released binary packages.

## Codetools

• Codetools is now a normal package and stored in components/codetools/codetools.lpk. You can not uninstall it, but the IDE will now automatically recompile it, for example when cross compiling.
• Support for objcclass syntax. FPC has changed again the syntax. The support for this is in Lazarus 0.9.31. See FPC PasCocoa.
• support for strict private, strict protected, class sealed, class abstract
• Block completion was improved to better know when it should not complete code and some more cases to complete blocks.
• Class completion: New option to disable adding a comment in front of the first method body. See here
• Smarter auto indentation that mimics the indentation of surrounding code and/or an example file. See here.
• identifier completion now completes compiler predefined types like String, AnsiString, Byte, Boolean, etc and completes some keywords depending on context (e.g. property modifiers like read and write).
• Simple source macros are now parsed (macro on directive of fpc).
• Code completion: Read-Only properties are marked with a lock-icon.

## Components

• AggPas - Anti Grain Geometry for Object Pascal - now supporting FPImage and LCL. AggPas highlights: Subpixel rendering, 8-bit alpha channel, paths, platform independent rendering using pure pascal. Official site: Aggpas. Package file: components/aggpas/lazarus/aggpaslcl.lpk. See the examples in components/aggpas/lazarus/examples.
• AnchorDocking - New packages to make your applications dockable. There is also a package named 'AnchorDockingDsgn' to make the IDE dockable. See Anchor Docking
• EducationLaz - New package to make the IDE easier to use for beginners, pupils and students. See Lazarus for education.

### TAChart

• TAxisTransformations component allowing arbitrary axis transformations, in particular linear, logarithmic and auto-scaling
• Rotated (aka horizontal) line/bar/area series
• TChartAxis.Marks and .Source properties to control the style and placement of axis marks
• TChartToolset component with various tools for interactive usage:
• drag-drop and automatic panning,
• drag-drop, click and animated zooming,
• generalized reticule,
• drag-drop series editing
• Marks.OverlapPolicy property to allow hiding overlapping labels
• Stepped line series
• ChartSource.Sorted property
• Optimized drawing of line series without pointers and labels. Drawing speed is now comparable to "fast line series" of some other charting libraries
• Support for arbitrary label orientation (LabelFont.Orientation property)
• Axis.Group and Marks.AtDataOnly properties to support "segmented" axises (aka chart panes)
• TDateTimeIntervalChartSource component supporting date/time axis values
• TAreaSeries.AreaContourPen, .ZeroLevel and .UseZeroLevel properties
• TBarSeries.ZeroLevel and .BarWidthStyle properties
• TPieSeries.RotateLabels property
• TChart.Proportional property to enforce proportional zooming
• Multi-values variants for all chart source components
• Bubble series
• Box-and-whisker (aka box plot) series
• Stacked line, bar and area series
• Initial implementation of TCalculatedChartSource component, allowing percentage stacked series and sliding-window statistic calculation
• Initial implementation of TChartStyles component, allowing to draw stacked series with varying colors/styles
• Legend symbols for points and pie chart slices
• Multiple legend items for a single series
• User-drawn legend items
• TChartLegendPanel component to display legend separately from the chart
• Color map series
• TChartAxis.ZPosition property
• Automated unit testing
• 6 new demo projects
• Backwards-incompatible changes:
• Built-in reticule is deprecated and will be removed in future versions. Use TReticuleTool instead.
• TChartAxis.Offset and .Scale properties are removed. Use TAxisTransformation instead.
• TLine series is now named TConstantLine
• TChartTitle.Font property is now named LabelFont
• TAreaSeries.Stairs and .InvertedStairs properties are removed. Use ConnectType property instead.
• TChartLegend.Margin property is removed. Use MarginX and MarginY properties instead.
• Series.ShowInLegend property is now named Legend.Visible

## Debugging

• Step out command implementation (by Flavio)
• Show execution point command
• Single Instruction step (over/into)
• UI Improvements: Toolbars for Watches, Breakpoints, Disassembler
• Watches: Enabled display formats (mem-dump, Hex, Default, ..)
• Improved reaction speed: It is possible to continue stepping without having to wait for all watches, locals, ... to be evaluated

## Changes affecting compatibility

### overriding TControl.SetBounds

Any control overriding SetBounds and checking there if the bounds have changed since the last call will not notify all bounds changes. SetBounds is no longer called before a control is resized by the LCL layouter. SetBounds is called after the bounds were changed by the LCL autosize algorithm.

• Reason:: It created an endless loops for valid code. SetBounds changes the BaseBounds needed by anchoring (e.g. akRight). Formerly the LCL disabled updating the basebounds before calling SetBounds. But if some user code reacts to the change and resizes the control the BaseBounds were not set too, triggering a further LCL anchoring calling SetBounds again with the same bounds and so on. There was a heuristic to spot some of those endless loops and stop them, but this never worked for all cases.
• Remedy: Override ChangeBounds, DoSetBounds or WMSize instead. This works for Lazarus 0.9.28 too.

### TControl.Align order

TControl.Align order of controls is now stable (resizing no longer reorders). There is one incompatibility. See Order of Align

### SourceEditorIntf

SourceEditorIntf is for extensions to the IDE.

SrcEditorIntf.SourceEditorWindow
This has been deprecated. (it will be entirely removed)
• The old version returned the TSourceNotebook object representing the SourceEditor-Window. The lifespan of the SourceEditor-Window was the same as the IDE's lifespan.
• The new (temporary/compatibility) version returns one of the (multiply) existing SourceEditor-Window, if one is available. Otherwise it returns nil. The SourceEditor-Window can now be destroyed (and recreated) while the IDE runs.
SrcEditorIntf.SourceEditorManagerIntf
This has been introduced as replacement.
• It's lifespan covers the full IDE uptime.
• Some methods have simply be moved
• For other methods access to all of the SourceEditor-Window is given. Including a notification system, for creation/destruction of them

### CGI

The CGI package which was installed by default was now removed from the Lazarus source base. The package was obsolete and users are recommended to install and use the package fpWeb located at lazarus/components/fpweb/ instead.

Upon upgrading the IDE may complain about the missing package. This can be corrected by going to the menu "Package"->"Install/Uninstall Packages". In the next dialog, select and remove the CGI packages. There should be no need to rebuild the IDE.

(Note, to build CGI/FCGI/Apache module web server applications using fpweb(fcl-web), install the "weblaz" package. For additional fpweb extensions like ExtJS support, install the "lazwebextra" package too)

### TNotebook and TPage

The components TNotebook and TPage as currently implemented are deprecated and no longer installed in the IDE. The release 0.9.30 will offer some time for users to remove these components from their projects. We recommend that users use TPageControl instead. In 0.9.31 these components will be completely removed and a new implementation for them will be activated, which implements TNotebook as it should be: A custom-drawn untabbed container with multiple pages.

### SynEdit.BeginUpdate / EndUpdate

SynEdit does no longer attempt to paint while in a Begin/EndUpdate block. Older versions did attempt this, but would have occasionally crashed.

The purpose of BeginUpdate is to speed-up applying changes, by telling SynEdit not to calculate internal structures in between those changes. Without those structures SynEdit can not paint reliable.

Code like

 SynEdit.BeginUpdate
SynEdit.Text := s;
Application.ProcessMessages; // attempt to repaint SynEdit
...


does no longer work.

Remedy: remove the Begin/EndUpdate statements / or put the EndUpdate before the ProcessMessages