Delphi – Enumerados

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

Crie um website ou blog gratuito no WordPress.com.

Acima ↑