A while ago, I needed several enum types in the same unit with overlapping enumeration values.
Putting each in an encompassing type wasn’t possible and I didn’t want to put each in their own unit.
Luckily, Delphi 2009 introduced the “scoped enum” feature effectively promoting the enumeration type into a scope or namespace.
It is only available at the source code level, as – at least up until Delphi 10.1 Berlin – it is not part of the compiler settings in the project options (see screenshot below).
Since the below was hard to find combined with the word “namespace” I’ve quoted it in full:
Type Switch Syntax {$SCOPEDEUNMS ON}, or {$SCOPEDENUMS OFF} Default {$SCOPEDENUMS OFF} Scope LocalRemarks
The $SCOPEDENUMS directive enables or disables the use of scoped enumerations in Delphi code. More specifically, $SCOPEDENUMS affects only definitions of new enumerations, and only controls the addition of the enumeration’s value symbols to the global scope.
In the {$SCOPEDENUMS ON} state, enumerations are scoped, and enum values are not added to the global scope. To specify a member of a scoped enum, you must include the type of the enum. For example:
type TFoo = (A, B, Foo); {$SCOPEDENUMS ON} TBar = (A, B, Bar); {$SCOPEDENUMS OFF} begin WriteLn(Integer(Foo)); WriteLn(Integer(A)); // TFoo.A WriteLn(Integer(TBar.B)); WriteLn(Integer(TBar.Bar)); WriteLn(Integer(Bar)); // Error end;Note that this is also valid:
Writeln(Integer(TFoo.A));Even though TFoo was not declared with $SCOPEDENUMS ON, the A value can still be explicitly resolved using the enumeration name.
–jeroen
Source: [WayBack] Scoped Enums (Delphi)
via [WayBack] own namespace for nested enums in Delphi – Stack Overflow
The Project Options do not have a “scoped enum” entry under the compiler settings: