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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top