[fpc-devel] System.UITypes and Lazarus

Martin Frb lazarus at mfriebe.de
Sun Feb 9 15:58:05 CET 2025


On 09/02/2025 14:39, Bart via fpc-devel wrote:
> Hi,
>
> The Delphi compatible unit System.UITypes is getting out of sync with Lazarus.
> The reason for this is twofold:
> 1. the faster release cycle of Lazarus
> 2. the fact that Lazarus supports more widgetsets, for which we also
> need enumerations, and Delphi does not have these.
>
> This can lead to errors as described in
> https://gitlab.com/freepascal.org/lazarus/lazarus/-/issues/41300
>
> While this can be worked around, my question (no offense intended) it
> raises some questions in my head.
>


I haven't tested that, but maybe in Lazarus we can work around by 
simulating inheritance (it still will leave some caveats).

If you have in Systym.UITypes
     TFooOptions =(opt1, opt2);

Then you can have in Lazarus
     TLazFooOptions =(opt1, opt2, lazop1, lazopt2);

And the control/component in Lazarus would have a property of
     property Options: TLazFooOptions;


For streaming, "opt1" and "opt2" will be identifiers looked up against 
the type.
So, if an lfm (or other stream contains "opt1", that will load into a 
property of either type.

For in code handling, there could be an operator overload.

So if user-code uses (the enum member) "opt1" from TFooOptions, then it 
can still be assigned and compared.

If user-code has a variable "MyOptsStore: TFooOptions" that works... 
except, when the TLazFooOptions property has one of the lazarus only 
values. => that can only be caught as runtime exception.
Or there is no operator in that direction => which would mean the user 
can use the enum members from UITypes, but not the enum type itself.

Not sure what other new issues that might bring.... (other than a lot of 
work to maintain)

Lazarus units can ensure that the re-definitions have the same starting 
members (though that will be a long and ugly list)
{$IF ord(poPortrait) <> 0} {$ERROR fatal} {$ENDIF}
and also check for the "high()" value in fpc.

Unfortunately FPC does not seem to support full qualified inside the 
IFDEF. While all of those are valid
const
   x = TPrinterOrientation.poPortrait;
   y = system.UITypes.poPortrait;
   z = system.UITypes.TPrinterOrientation.poPortrait;
the qualified ones fail in the IFDEF (tested 3.2.3)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20250209/56ee9eb1/attachment.htm>


More information about the fpc-devel mailing list