O que são Enumerados
Enumerados são (resumidamente) uma lista de valores fixos, que ao invés de você acessa-los através da posição deles, você os acessa através dos nomes!
Exemplos de Enumerados
TDia = (Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sabado);
Uma das vantagem ao se usar enumerados é a legibilidade do seu código. Fica muito mais fácil entender o funcionamento do que seu código está fazendo quando vocês se depara como com:
vDiaDoBackup := Domingo;
Ao invés disso:
vDiaDoBackup := vDias[0];
Usando o enumerado, conseguimos entender imediatamente o que está sendo feito, sendo que no segundo exemplo, primeiro temos que achar “vDias” para depois podermos saber o que está na posição 0 dele.
Delphi (10.X)
Nas versões mais recentes do Delphi (10.x), podemos declarar mais de um tipo que possua o mesmo valor em mais de um enumerado, exemplo:
type
TLampada = (Ligada, Desligada, Queimada);
TMaquina = (Ligada, Desligada);
Neste caso, os dois enumerados possuem o valor “Ligada”, mas o restante dos valores são diferentes, o que não era possível antes.
Na hora de utilizar o enumerado, podemos informar o valor do tipo informando a qual tipo ele pertence, mas isto não é obrigatório:
var
vMaquina: TMaquina;
begin
vMaquina := TMaquina.Ligada;
end;
Existe uma diretiva de compilação que obriga a quem estiver utilizando seu enumerado a preencher o tipo. Isto também ajuda na legibilidade do código, pois dois enumerados ou mais podem ter o mesmo valor.
{$SCOPEDENUMS ON}
TBar = (A, B, Bar);
{$SCOPEDENUMS OFF}
Você pode encontrar mais informações neste link.
Delphi 1 … 2009
Já nas versões anteriores, não podemos ter um mesmo valor em mais de um tipo, por isso, em cada tipo devemos colocar um prefixo do enumerado:
Sendo que neste caso, o uso ficaria assim:
type
TLampada = (lpLigada, lpDesligada, lpQueimada);
TMaquina = (mqLigada, mqDesligada);
var
vLampada: TLampada;
vMaquina: TMaquina;
begin
vLampada := lpLigada;
vMaquina := mqLigada;
end;
Então caso esteja usando as versões mais recentes do Delphi, de preferência ao uso sem o prefixo, e utilizando o nome do enumerado antes de usar o valor do enumerado.
Deste modo a leitura do código fica mais fluida e de fácil compreensão.
Conversões
Podemos converter um enumerado diretamente para texto (string):
uses TypInfo;
var
vTexto: string;
begin
vTexto := GetEnumName(TypeInfo(TLampada.Ligada),
ShowMessage(vTexto); // será exibido “Ligada”
Ou podemos chegar ao valor enumerado através de um valor inteiro, pois a lista enumerada é uma lista de valores fixos, então podemos ir diretamente em um valor, considerando a seguinte regra, a lista é indexada a partir de zero.
var
vMaquina: TMaquina;
vPosicao: integer;
begin
vMaquina := TMaquina(0); //Ligada
vPosicao := integer(TMaquina.Desligada) // retorna o valor 1
vPosicao := ord(TMaquina.Desligada) // retorna o valor 1
end;
ClassHelper
Podemos também criar um “class helper” para trabalharmos com os valores de nossa lista:
TDiaHelper = record helper for TDia
function AsInteger : integer;
function ToString : string;
end;
function TDiaHelper.AsInteger: integer;
begin
Result := integer(self);
end;
function TDiaHelper.ToString: string;
begin
case self of
Domingo: Result := 'Domingo';
Segunda: Result := 'Segunda-feira';
Terca: Result := 'Terça-feira';
Quarta: Result := 'Quarta-feira';
Quinta: Result := 'Quinta-feira';
Sexta: Result := 'Sexta-feira';
Sabado: Result := 'Sabado';
end;
end;
...
var
vDia: TDia;
begin
vDia := TDia.Sabado;
ShowMessage('Dia de backup: ' + vDia.ToString); // será exibido "Dia de backup: Sabado"
end;
Deixe um comentário