Delphi Enumerações com escopo (Scoped Enumerations)
A diretiva $SCOPEDENUMS habilita ou desabilita o uso de enumerações com escopo no código Delphi. Mais especificamente, $SCOPEDENUMS afeta apenas as definições de novas enumerações e controla apenas a adição dos símbolos de valor da enumeração ao escopo global.
No estado {$SCOPEDENUMS ON}, as enumerações têm escopo definido,
e os valores enum não são adicionados ao escopo global. Para especificar um membro de uma enumeração com escopo definido, você deve incluir o tipo da enumeração.
Você pode usar enumerações com escopo definido no código Delphi se ativar a diretiva do compilador {$SCOPEDENUMS ON}.
A diretiva do compilador {$SCOPEDENUMS ON ou OFF} ativa ou desativa o uso de enumerações com escopo no código Delphi, o padrão é desativada.
{$SCOPEDENUMS ON} define que as enumerações têm escopo definido e afeta declarações de tipos de enumeração até a diretiva {$SCOPEDENUMS OFF} mais próxima.
Os identificadores da enumeração introduzidos nos tipos de enumeração declarados após a diretiva {$SCOPEDENUMS ON} não são adicionados ao escopo global. Para usar um identificador de enumeração com escopo definido,
você deve qualificá-lo com o nome do tipo de enumeração que introduz esse identificador.
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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)); // Erro! end; |
Observe que isso também é válido:
1 |
Writeln(Integer(TFoo.A)); |
Mesmo que TFoo não tenha sido declarado com $SCOPEDENUMS ON, o valor A ainda pode ser resolvido explicitamente usando o nome da enumeração.
Fontes:
https://docwiki.embarcadero.com/RADStudio/en/Scoped_Enums_(Delphi)
https://docwiki.embarcadero.com/RADStudio/en/Simple_Types_(Delphi)