Sign in Join
Wiki copytemporary

Lazarus 3.0 release notes: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## LCL Interfaces Changes
22
33### Cocoa
44
55- IME fully supported, such as Chinese/Japanese/Korean, DeadKeys, Emoji & Symbols.
66- Multi Displays/Monitors fully supported.
77- Docking fully supported, including the IDE.
88- Cursor completely refactored and significantly improved, compatible with macOS Ventura.
99- TPageControl significantly improved.
1010- Many controls improved (TComboxBox/TListBox/TDateTimePicker/TStaticText/TSpeedButton/TPanel etc.)
1111- Many memory leaks fixed.
1212
1313### Qt
1414
1515- Implemented TCheckBox.Alignment and TRadioButton.Alignment.
1616- Implemented TCustomComboBox.AdjustDropDown and TCustomComboBox.ItemWidth.
1717
1818### Qt5
1919
2020- Qt5 uses native event loop on all platforms. C bindings are updated. Minimum C bindings version for lazarus 3.0 is 1.2.15.
2121- Note that most Linux Distributions will not have an appropriate libqt5pas library until their next release after the formal release of Lazarus 3.0. Build your own from the Lazarus source tree or download from <https://github.com/davidbannon/libqt5pas/releases/latest>
2222- Implemented TCheckBox.Alignment and TRadioButton.Alignment.
2323- Implemented TCustomComboBox.AdjustDropDown and TCustomComboBox.ItemWidth.
2424
2525### Qt6
2626
2727- Qt6 widgetset implemented. C bindings are based on Qt6 6.2.0 LTS. Minimum C bindings version for lazarus 3.0 is 6.2.7.
2828- Note that most Linux Distributions will not have an appropriate libqt6pas library until their next release after the formal release of Lazarus 3.0. Build your own from the Lazarus source tree or download from <https://github.com/davidbannon/libqt6pas/releases/latest>
2929- Implemented TCheckBox.Alignment and TRadioButton.Alignment.
3030- Implemented TCustomComboBox.AdjustDropDown and TCustomComboBox.ItemWidth.
3131
3232### Gtk3
3333
3434- Gtk3 pascal bindings are completely reworked.
3535- A number of stability improvements.
3636- Now requires GTK \>= 3.24.24 and Glib2.0 \>= 2.66
3737
3838## LCL Changes
3939
4040### TCustomImageList
4141
4242TCustomImageList made more extensible:
4343
44441. Protected MarkAsChanged method is added, which sets FChanged to true (this allows to make custom triggers for OnChange event).
45452. Virtual protected DoAfterUpdateStarted and DoBeforeUpdateEnded methods are added. They are called in first BeginUpdate and last EndUpdate respectively.
4646
4747### TTaskDialog
4848
4949- Old behaviour Win32: A placeholder icon was used for FooterIcon = tdiNone and MainIcon = tdiNone.
5050- New behaviour Win32: No icon is used for FooterIcon = tdiNone and MainIcon = tdiNone.
5151- Reason: Removing drawing glitch. The text move over to allow more content and better alignment. See [Issue \#39172](https://bugs.freepascal.org/view.php?id=39172)
5252
5353### TSpeedButton
5454
5555- Old behaviour: Multi-line captions could only be entered by code. And multi-line captions were always left-aligned.
5656- New behaviour: Multi-line captions can also be entered in the object inspector. New property Alignment to specify whether the caption should be left-/right-aligned or centered. Default: centered, like in Delphi.
5757- Reason: Better usability.
5858
5959### TLabel.Transparent, .Color and .ParentColor changes
6060
6161- Old behaviour: Transparent property was bound to Color=clNone
6262- New behaviour: Transparent is a standalone property
6363- Reason: Delphi compatibility and to fix ParentColor issues.
6464- Remedy: If you are setting the Color property, Transparent is not automatically switched from True to False now, you have to do it yourself. This is in compliance with Delphi and also solves problems with Color/ParentColor changes.
6565
6666### TPanel.VerticalAlignment
6767
6868- Old behaviour: The panel caption was always centered vertically.
6969- New behaviour: The new property VerticalAlignment (taAlignTop, taAlignBottom, taVerticalCenter) allows to place the caption also at the top or bottom of the panel interior.
7070- Reason: Delphi compatibility and better usability
7171
7272### TCalendar
7373
7474- Properties MinDate and MaxDate are implemented. These limits are only imposed if MaxDate \> MinDate. Unfortunately GTK2/3 widgetsets do not support this, so selecting a date outside the MinDate/MaxDate range will still be possible there.
7575
7676### TCheckbox, TRadioButton
7777
7878- Different calculation of checkbox/radiobutton size in order to correctly take care of Win-10 "ease of access" feature. See [issue \#39398](https://gitlab.com/freepascal.org/lazarus/lazarus/-/issues/39398)
7979- Consequence: lfm files will contain different sizes of these controls (if auto-sized) compared with earlier versions.
8080
8181### Grids
8282
8383- You can now set the cell editors properties ParentColor and ParentFont by including goEditorParentColor resp. goEditorParentFont in the grid's Options2 property.
8484
8585### TShellTreeView
8686
8787- New property `ExpandCollapseMode` defining options whether a collapsing node should clear its child nodes.
8888- Implements custom sorting of the treeview items by setting `FileSortType` to `fstCustom` and providing a custom compare function in the event `OnSortCompare`.
8989
9090### TShellListView
9191
9292- TShellListView now subclasses TListItem, so it can store file info in it.
9393- If you use OnCreateItemClass to create your own descendant of TListItem, it may be advisable to base your own class on TShellListItem instead of on TListItem. This way you will also have access to the TShellListItem's FileInfo property.
9494
9595### TTreeView
9696
9797- Adds ShowSeparators as a published property like ShowLines and ShowRoot.
9898
9999### TTrayIcon gtk2 Only
100100
101101If using the gtk2 tray icon, a new global variable is available that will allow you to predetermine which of the two TrayIcon models you use. See the Wiki for details. This is, and will only ever be, gtk2 only.
102102
103103## IDE Changes
104104
105105### Character map
106106
107107- Resizable characters to improve readability.
108108- The character map was split off from the IDE and moved to separate packages. The designtime package is installed by default so that there is no difference in the IDE. Now users can access it in their own applications after adding the runtime package "charactermappkg.lpk" to the project requirements.
109109
110110### Debugger
111111
112112#### Project Options
113113
114114- "Run(F9)" can either be "Debug" or "Run without debug".
115115
116116
117117In newly created Debug/Release modes, the Release mode will no longer invoke the debugger by default.
118118
119119Existing Debug/Release modes must be edited, to enable this.
120120
121121- Per project "Debugger backend" settings. In addition to choosing a specific backend from the global IDE settings, a backend can be configured just for the project (i.e. special gdb-server settings)
122122
123123#### IDE Dialogs
124124
125-- Improved <u>Watches window</u>
125+- Improved Watches window
126126 - Expand/Unfold for classes, records, etc
127127 - Expand/Unfold with paged browser for arrays
128128 - Drag and Drop to reorder watches
129129 - Drag and Drop to create new "top level" watches from nested entries (in expand/unfolded lists)
130130 - Address column for types with internal pointer (classes, long-string, dyn-array, (real) pointer)
131-- Improved <u>Locals window</u>
131+- Improved Locals window
132132 - Expand/Unfold for classes, records, etc
133133 - Expand/Unfold with paged browser for arrays
134134 - Address column for types with internal pointer (classes, long-string, dyn-array, (real) pointer)
135135 - Power button
136-- Improved <u>Inspect window</u>
136+- Improved Inspect window
137137 - Fixed: Updating value when context changes
138138 - Added options for Function calling / and "Converter" (See FpDebug: SysVarToLstr)
139139 - Added filter to search for text in name or value.
140140 - Added ctrl-Up/Down/Page-Up/Page-Down to navigate the grid.\
141141 Alt-Left/Right for history. And ctrl-Enter to select.
142-- Improved <u>Evaluate/Modify window</u>
142+- Improved Evaluate/Modify window
143143 - New Layout
144144 - Added DisplayFormat
145145 - Added options for Function calling / and "Converter" (See FpDebug: SysVarToLstr)
146-- Improved <u>Assembler window</u>
146+- Improved Assembler window
147147 - Added history navigation (forward/backward)
148148 - For FpDebug: added annotations to jump/call targets, and allow to ctrl-click to disassemble target address
149149
150150#### FpDebug / LazDebuggerFp
151151
152152- Improved "function calling" in watch eval. See [[FpDebug-Watches-FunctionEval]]
153153- %RAX Accessing cpu registers in watch expression (only full registers, not yet AH or AL or EAX on 64bit)
154154- Intrinsic functions: [[FpDebug-Watches-Intrinsic-Functions]]
155155- Intrinsic/extended operators: MyArray\[1..3\] array slice with operator mapping. [[FpDebug-Watches-Intrinsic-Functions|FpDebug-Watches-Intrinsic-Functions#Intrinsic_Operators]]
156156- Option to detect "variant" and call "SysVarToLStr" in the target app.
157157- Suspend/Resume individual threads (must be done while app is paused, and will be applied for subsequent step/run)
158158- Partial improvements to debug in DLL: <https://wiki.freepascal.org/Debugger_Status#Other>
159159- Disassembler now annotates lines for call/jmp/jne/... with info on the target address (function name, file, line)
160160- F7/F8 Step-Into/Over can now be used to start the debugger and run to the first line of the main program begin/end.
161161
162162#### LazDebuggerFpLldb (default on MacOS)
163163
164164- Added Mem-Limits (and String,Pchar,Array) to the debugger config
165165
166166
167167See <https://wiki.freepascal.org/LazDebuggerFp> (MaxMemReadSize, MaxStringLen, MaxArrayLen, MaxNullStringSearchLen)
168168
169169Limiting the default results for watches/locals/stack-params,... can prevent slow evaluation.
170170
171171Arrays can then be browsed in the watches window, using the new "paged browser for arrays" (expand via \[+\])
172172
173173### Floating point properties in the Object Inspector
174174
175175- The Object Inspector now explicitely disallows to set a floating point property's value to +/-Inf or NaN.
176176- Reason: whilst +/-Inf and NaN are valid values for a floating point property, they cannot be streamed (so, the form could not be loaded) and setting it to NaN caused havoc in the IDE.
177177- Remedy: set the value at runtime (in code)
178178
179179### Reading unit names in lfm
180180
181181FPC 3.3.1 component writer supports optionally writing types with their unit names as *unitname/type*. Lazarus can now read this.
182182
183183### Ambiguous Classtypes
184184
185185You can now register two component classes with the same name, e.g. *fresnel.TButton* and *StdCtrls.TButton*. You can even put both on the same form.
186186
187187### Editor
188188
189189\- Highlight for PasDoc
190190
191191### IDE Options
192192
193-In Tools -\> Options -\> Environment -\> Window page these three settings are now <b>ON</b> by default :
193+In Tools -\> Options -\> Environment -\> Window page these three settings are now ON by default :
194194
195195- IDE title starts with project name
196196- IDE title shows project directory
197197- IDE title shows selected build mode
198198
199199It has been requested by many users. If the IDE's title bar has no info about the active project, a user must open Project Inspector or Project Options to see it, which is inconvenient.
200200
201201### Lazarus Examples
202202
203203A new approach to Examples that copies an Example to a fresh working area (avoiding the Linux Read Only Problem) and, possibly an easier to use search model.
204204
205205## IDE Interface Changes
206206
207207## Components
208208
209209### TAChart
210210
211211- The **TLegendClickTools** now is able to detect clicks on series legend items and reports the clicked series in the new **OnSeriesClick** event.
212212- New **TDatapointMarksClickTool** which becomes active when the user clicked on the marks of a series.
213213- New property **TickWidth** for the chart axes.
214214- New property **FullWidth** for the chart title and footer to run their background across the entire chart width.
215215- New property **RandomColors** for `TRandomChartSource`.
216216- New properties **YIndexWhiskerMin**, **YIndexBarMin**, **YIndexCenter**, **YIndexBarMax**, **YIndexWhiskerMax**, and **YDataLayout** in TBoxAndWhiskerSeries for more flexible assignment of y values to the parts of the box/whisher shape.
217217- New option **aipInteger** in the set TAxisIntervalParamOptions which sets axis labels only at integer values and thus supresses the unwanted intermediate labels in bar charts and helps to enforce labels in logarithmic plots at the powers of the logarithmic base (usually 10).
218218- New event **OnAddStyleToLegend** for TChartStyles. It has a boolean parameter `AddToLegend` with which you can determine whether the series level using this style is displayed in the legend.
219219
220220### TDateTimePicker
221221
222222- New properties MonthDisplay and CustomMonthNames. They are meant to replace the MonthNames property, which has been deprecated.
223223- New property DecimalSeparator. Allows a user-specified value to be used instead of a hard-coded Colon character.
224224
225225### TDBDateTimePicker
226226
227227- Adds Options as a published property.
228228- Publishes the DecimalSeparator property.
229229- Publishes the missing Alignment property. Consistent with TDateTimePicker,
230230
231231### T(Float)SpinEditEx
232232
233233- New property **Orientation** which allows to arrange the spin buttons horizontally.
234234
235235### TCheckListBox
236236
237237- Adds HeaderColor and HeaderBackgroundColor properties. Used on list items where the Header property is enabled. Implemented for the Win32 widget set.
238238
239239### Pas2js
240240
241241- lazbuild now can compile pas2js projects by passing the environment variable PAS2JS with the path of the pas2js executable.
242242- Project groups with pas2js projects now can compile without being opened.
243243- New project type [[lazarus pas2js integration|Progressive Web Application]]
244244- New project type [[lazarus pas2js integration|Electron Web Application]]
245245- pas2jsdsgn now uses the SimpleWebServerGUI package, replacing its own http server controller.
246246- F9, Run now builds, starts a HTTP server and a browser
247247
248248### Lazarus Icon Collection
249249
250250- Not a component, but the Lazarus installation now contains a folder with general-purpose icons for usage in toolbars, menus, buttons etc. of any GUI applications (folder *images/general_purpose*).
251251- The images come in various sizes and thus are compatible with the scaled image list of Lazarus v2.0+.
252252- Author: Roland Hahn (https://www.rhsoft.de/).
253253- License: Creative Commons CC0 (no restrictions in usage).
254254
255255### gir2pascal
256256
257257- Sources of [[gir2pascal]] (a tool to convert [GObject Introspection](https://gi.readthedocs.io/) descriptions to Pascal files) are now included in Lazarus source tree ([tools/gir2pascal](https://gitlab.com/freepascal.org/lazarus/lazarus/-/tree/main/tools/gir2pascal) directory) and maintained there.
258258
259259### lazdelphi
260260
261261An IDE addon adding a parser for the Delphi compiler errors and hints. You can run dcc32.exe as external tool or **execute before** command in the compiler options and use the *Delphi Compiler* parser for the output, so that the errors/hints in the Messages window can open the source. See [[Lazarus Delphi Compiler Tool]]
262262
263263### Jedi Code Format
264264
265265- Some improvements in code formatting.
266266- The jcf command line tool is now a text-mode application and no longer requires XWindow on linux to run.
267267
268268### DockedFormEditor
269269
270270In case you are still using the sparta docked form editor, use the **dockedformeditor** package instead.
271271
272272## Changes affecting compatibility
273273
274274### IDE Settings
275275
276276#### Run \> Run Parameters (UPDATED FOR 3.2)
277277
278278The changes originally described introduced a regression. - They do apply to Lazarus 3.0 - As off Lazarus 3.2 (fixes release) the behaviour has been updated
279279
280280`  1. If a non-empty string is set in "run params" \> "working directory", then this will be used as working directory.`\
281281`This should be "as before"`\
282282`     1. IDE-Macros are supported in this path.`\
283283`     2. If that path is relative, then this was not previously supported. It will be resolved against the "Project directory", not the "Output path"`\
284284`This is, because the "Output path" is only used as default Woring dir, if there is on "Host App". And resolving a relative directory against different bases can more easily lead to mistakes.`\
285285`Also the "Project dir" is used as base to resolve a relative "Host app" too.`\
286286`  2. If there is no user-specified "working directory" then the path of the "target exe" is used.`\
287287`     1. If a host app is given, the path of the host app is used.`\
288288`        1. Macros in the host app are allowed`\
289289`        2. A relative host app is resolved against the "Project dir"`\
290290`     2. If there is no host app, the path of the compiled project executable is used. (This should be the "output patch")`\
291291`        1. Macros in the "output path" are allowed`\
292292`        2. A relative path is resolved against the "Project dir"`\
293293`  3. If that does not return a path (if there is neither a project exe, nor a ho`
294294
295295Also see <https://gitlab.com/freepascal.org/lazarus/lazarus/-/issues/40693#note_1727379327>
296296
297-<strike> If your program uses relative paths but the executable is not in the same directory as the main project file (usually with .lpr extension), the IDE will set different current directory for the program as you expected. The current directory set will point to the directory with main project file instead of the directory where the executable is generated, so all relative paths used in the program will be invalid (ParamStr(0) and all other current-directory-specific functions will return wrong path). This happens only if you run your program using IDE (for example, using F9 key). This behavior was modified in the Lazarus 3.0 and breaks the backward compatibility.
297+If your program uses relative paths but the executable is not in the same directory as the main project file (usually with .lpr extension), the IDE will set different current directory for the program as you expected. The current directory set will point to the directory with main project file instead of the directory where the executable is generated, so all relative paths used in the program will be invalid (ParamStr(0) and all other current-directory-specific functions will return wrong path). This happens only if you run your program using IDE (for example, using F9 key). This behavior was modified in the Lazarus 3.0 and breaks the backward compatibility.
298298
299299The Working-dir is now determined as follows
300300
3013011. BuildMode.RunParams "working directory" set by user (New, this can now be relative to project dir)
3023022. Project Dir, if not virtual
3033033. Directory from Host-App (RunParams), or if (and only if) Host-App is empty from Project.exe (If host app is in %PATH, then there is no "working directory")
304304
305305The first 2 steps are the same as before the change. The 3rd step was previously only used for "debugging", but "run without debug" did use: "Launch-App", "Host-App", Project.exe.
306306
307307Change
308308The path of the "Launch App" is no longer considered.
309309
310310The Launch-/Host-App location are now determined as follows
311311
3123121. An app with absolute path is used as given.
3133132. A relative path (including no path at all) is resolved as relative to the Project-dir.
3143143. An app without any path at all (if not found in step 2) is searched in the %PATH environment.
315315
316316Change
317317Search in %PATH was only done by "run without debug", but not by debug. It is now done by both.
318318
319319Change
320320Checking for an exe relative to the project-dir was added.
321321
322322Remedy
323323So now, if you need to use relative paths in the program and be able to run/debug your program using IDE, just go to the "Run Parameters" window and set the
324324
325325`$Path($(OutputFile))`
326326
327-string in the "Working directory" field. </strike>
327+string in the "Working directory" field.
328328
329329### LCL incompatibility
330330
331331#### TLabel: autosized and right-aligned
332332
333333- Old behaviour: Autosized label with Alignment=taRightJustify but Anchors=\[akLeft,...\] grew to left.
334334- New behaviour: The label grows to right now.
335335- Reason: It wasn't possible to implement the behavior also for hidden labels without significant extensions in the LCL. The LCL has a different and more generic feature of control-based anchoring that delivers the same effect (see Remedy down), so it is not needed and wanted to double this feature and make the LCL code more complex and prone to bugs.
336336- Remedy: Use the LCL anchoring to a secondary control. Anchor the right side of the label to another control. Then the autosized label will grow to the left but won't move to the right when the parent is resized like it is done with a simple akRight anchor without a reference control.
337337
338338#### TDateEdit/TTimeEdit
339339
340340The value of NullDate has changed.\
341341Reason:
342342
343343- It was impossible to actually select the date corresponding to NullDate (30 dec 1899 by default) in the control.
344344- Remedy (1): if your code depended on NullDate actually being 0.0, you have to adjust your code.
345345- Remedy (2): if your code used NullDate for a TTimeEdit, change that to the new constant NullTime instead.
346346- Note: NullDate is actually a writeable constant. This was kept for compatibility reasons. It is however a bad idea to change it's value to anything that is an actual date that is within the range of the control.
347347
348348#### Cocoa
349349
350350Some global configuration variables were moved from CocoaInt to CocoaConfig. such as CocoaBasePPI, CocoaIconUse, CocoaToggleBezel, CocoaToggleType etc.
351351
352352#### GTK3
353353
354354GTK3 is no longer supported on earlier Linuxes, such as Ubuntu 20.04. It requires GTK \>= 3.24.24 and Glib2.0 \>= 2.66
355355
356356#### TControl: ChildSizing
357357
358358- Old behavior: When a control overrides `AdjustClientRect` and children are aligned via `ChildSizing` the adjusted clientrect was ignored. A typical example is a `TPanel` with a wide `BevelWidth` where the children were moved into the bevel.
359359- New behavior: The children now are aligned with respect to the adjusted clientrect. In the example of the `TPanel`, the child controls are now positioned such that the bevel is not covered.
360360- Reason: unexpected behavior which also contradicts the behavior of `Align` or `AnchorSides` which do respect the adjusted clientrect.
361361- Remedy: In the rare case that users have met this situation and have compensated the incorrect `ChildSizing` layout by additional border spacings, these additional corrections must be reverted.
362362
363363### LazUtils
364364
365365#### Masks unit
366366
367367The masks unit has been completely rewritten.\
368368Reasons:
369369
370370- speed: the old Matches() method had O(n^2) or even O(n^3) characteristics.
371371- improved control over how the mask is interpreted.
372372
373373New types (for parameters) and a dedicated TMaskWindows class have been added.\
374374TMask.MatchesWindowsMask and the old TMaskOptions type have been deprecated and will be removed in the next release.\
375375===== Ranges and Sets =====
376376
377377- The old masks implementation supported sets, but not ranges. The new implementation supports both sets (\[abc\]) and ranges (\[a-c\]). As a consequence a '-' inside such a construct is now interpreted as part of the range definition, not as a literal '-'.
378378- Reason: ranges are a good thing to have by default (the old implementation simply lacked this). We decided it's a small price to pay.
379379- Remedy: either escape the '-' with EscapeChar (which defaults to '\\') or exclude mocRange from the TMaskOpcodes parameter.
380380
381381##### Constructors do not fail anymore on an invalid mask
382382
383383- When providing an invalid mask to the old T(Windows)Mask(List) constructors an exception was raised.
384384- The new constructors do not raise an exception in this case. Instead an exception is raised in when Matches() is called.
385385- Reason: it's not very nice to have a constructor fail.
386386
387387#### Translations unit
388388
389389Added GetLanguageID function. It returns a record with language code (in ISO 639-1 or ISO 639-2) and country code (in ISO 3166) for current system locale.\
390390Added GetLanguageIDFromLocaleName function. It parses Unix locale name and returns a record with language code and country code. It is useful to parse language identifiers passed e. g. via command-line parameters.
391391
392392Implementation is based on GetLanguageIDs procedure from GetText unit, but is rewritten to have the following properties:
393393
394394- Language and country codes are always returned in ISO formats on Windows.
395395- Unix locale identifier is properly parsed and language/country codes are properly extracted.
396396- Don't assume that language code is always two-letter (ISO 639-1), it can have bigger length (e. g. three letters, like in ISO 639-2).
397397- Locale ID is returned in a record type. This will allow to return additional fields in backwards-compatible manner in future. Currently it contains language code, country code and language ID (combination of language code and country code).
398398
399399These functions are used now throughout the Lazarus codebase. This greatly improves automatic language detection and loading of correct translations by Lazarus:
400400
401401- Three-letter (ISO 639-2) language identifiers are no more truncated to two letters. Thus, translations for such languages will be correctly loaded when available.
402402- Previously on Windows some language and country codes were obtained in non-ISO format, which prevented correct loading of some translations, e. g. Chinese (zh_CN).
403403- On Unix translations with country codes, like Brazilian Portuguese (pt_BR) or Chinese (zh_CN) are correctly loaded now.
404404- macOS is now handled as any other Unix. This removes dependency on language list in Lazarus bundle (which had to be maintained manually) and thus fixes loading of Czech, Hungarian, Brazilian Portuguese, Ukrainian translations.
405405
406406#### LazUTF8 unit
407407
408408- Deprecated LazGetLanguageIDs (returns combination of language and country codes) and LazGetShortLanguageID (returns only language code) procedures.
409409- Reason: this functionality belongs to Translations unit (calls of these procedures are almost always followed by calls to procedures from Translations unit), and these procedures are now thin wrappers of GetLanguageID function from Translations unit.
410410- Remedy: use GetLanguageID function from Translations unit.
411411
412412#### LazUTF8Classes and LazUTF8SysUtils units
413413
414414Everything in these units was deprecated for a long time and now they were removed. LazUTF8SysUtils was earlier renamed to LazSysUtils and this deprecated version was left for a transit period.
415415
416416- Class TStringListUTF8 can be replaced with TStringList.
417417- Class TMemoryStreamUTF8 can be replaced with TMemoryStream.
418418- Global procedure LoadStringsFromFileUTF8 can be replaced with TStrings.LoadFromFile.
419419- Global procedure SaveStringsToFileUTF8 can be replaced with TStrings.SaveToFile.
420420- Functions NowUTC and GetTickCount64 can be found in LazSysUtils.
421421
422422### Components incompatibility
423423
424424#### LazControls
425425
426426###### TSpinEditExBase derived classes
427427
428-- All derived classes form TSpinEditExBase must implement a SameValue method. This method is defined as an <b>abstract</b> method in TSpinEditExBase.
428+- All derived classes form TSpinEditExBase must implement a SameValue method. This method is defined as an abstract method in TSpinEditExBase.
429429- Reason: All derived classes used Math.SameValue. This is wrong for comparing integer types (even if is is safe when comparing relative small values).
430430- Remedy: unfortunately you'll have to adjust your code.
431431
432432###### TFloatSpinEditEx
433433
434434- The property NumbersOnly is no longer published.
435435- Reason: the property makes no sense for this control and only confuses users.
436436- Remedy: if you really need NumbersOnly to be True, you must set it in code.
437437
438438#### FpVectorial
439439
440440- The `Size` element in the FPVectorial `TvFont` record is a floating point value now (type `double`).
441441- Reason: Avoid rounding errors because the drawing coordinates are `double` already.
442442- Remedy: There is rarely a chance that this change will have an effect on user code. Only when the font size is stored in a variable it must be declared as `double` rather than as `integer`.
443443
444444#### TurboPower_ipro
445445
446446- Type declarations and the html nodes were moved from unit IpHtml to separate units, IpHtmlTypes, IpHtmlClasses and IpHtmlNodes. This may break compilation of existing projects.
447447- Reason: Improve maintainability of the extremely long unit IpHtml
448448- Remedy: Add IpHtmlTypes, IpHtmlClasses and/or IpHtmlNodes to the uses clause of the project unit(s) when an "identifier not found" error referring to this package is reported by the compiler.
449449
450450## Other release notes
451451
452452---
453453*From the Free Pascal wiki, page "Lazarus 3.0 release notes", as it stood on 2024-03-17 after a change by Wp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
454454Category: Lazarus
455455Category: Release Notes

Back to history