Por que eu recebo o erro "type não tem typeInfo" com um tipo de enum
Pergunta
Eu declarei o seguinte tipo de enumeração em que quero que o primeiro membro tenha o valor ordinal de 1 (um) em vez do 0 usual (zero):
type
TMyEnum = (
meFirstValue = 1,
meSecondValue,
meThirdValue
);
Se eu ligar TypeInfo (), por exemplo, como parte de uma chamada para Getenumname (), Eu recebo um erro do compilador:
GetEnumName(TypeInfo(TMyEnum), Ord(aValue));
Erro: "E2134: Type 'tmyenum' não tem tipo"
Por que é isso?
Eu sei que as aulas só têm tipoInfo se forem compiladas com o $ M opção compilador habilitada ou (deriva de alguma classe que foi, como Tpersistent) Mas não achei que houvesse condições especiais para ter o TypeInfo para os tipos de enum.
Solução 2
As informações de tipo não são suportadas para enums em que valores ordinais específicos são atribuídos que resultam em membros da enum ter valores ordinais diferentes daqueles que normalmente seriam atribuídos pelo compilador.
Se valores específicos forem essenciais ou desejáveis, os membros "não utilizados" deverão ser inseridos para "preencher" a enumeração, conforme necessário. por exemplo (indentação adicional apenas para ênfase):
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue
);
Um sub -arrange pode então ser usado para "filtrar" o valor inicial não utilizado:
TValidMyEnum = meFirstValue..meThirdValue;
Embora você queira considerar renomear o tipo de enumeração original para que seu tipo de sub -branda possa ser usado em todo o seu projeto.
Um sub -arrange não é suficiente se o enum contiver "lacunas":
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue,
meNOTUSED2,
meFinalValue {= 5}
);
Nesse caso, não existe uma maneira de estender a verificação do intervalo de tempo de compilação para excluir os membros não utilizados, mas alguns tipos de conjuntos simplificarão o negócio de implementar os necessários tempo de execução Verificações:
type
TMyEnums = set of TMyEnum;
const
meNOTUSED = [meUNUSED1, meUNUSED2]; // .. etc as required
meValidValues = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;
if NOT (aValue in meValidValues) then
// etc
Outras dicas
As enumerações e enumerações descontíguas que não começam em zero não possuem o TypeInfo. Para que o TypeInfo seja implementado, ele precisaria estar em um formato diferente da tkenumeration existente, devido a problemas de compatibilidade com versões anteriores.
Eu pensei em implementar uma reencontro de TKDiscontiância (ou possivelmente melhor membro nomeado) para Delphi 2010, mas o benefício parecia pequeno, considerando sua relativa escassez e as dificuldades na enumeração - como você codifica os intervalos com eficiência? Algumas codificações são melhores para alguns cenários, piores para outros.