Tipos Enumerados em Delphi

Aqui começarei a minha saga em busca da certificação Delphi, já que a faculdade já chega a seu fim (ainda falta sair a nota do TCC, mas tenha fé meu jovem) vou buscar esse próximo objetivo. Como tem bastante coisa que cai e não conheço (veja mais sobre a certificação aqui) o jeito é começar a correr atrás e o primeiro item que resolvi pesquisar foram os Enumerations.

Basicamente os Enumerations são tipos enumerados que pode ser utilizado como uma lista organizada de itens onde é definido um range e os valores destes range serão acessados por um nome de valor e não por um numero. Um exemplo bem comum em nosso dia a dia é o Boolean, um tipo enumerado com duas possibilidades (True ou False). Para facilitar a compreensão, vamos fazer um exemplo simples, vamos fazer uma rotina que verifica se um dia da semana é fim de semana ou não.

type
  TDiasSemana = (Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado);

Apesar de internamente este tipo enumerado possuir um índice para cara item, a ideia é que com essa declaração temos um tipo que pode receber os valores especificados em sua declaração, exemplo:

var
  Dia : TDiasSemana;
begin
  Dia := Segunda;
  if Dia = Sabado then
  ...
end;

Até aqui já sabemos o básico sobre tipos enumerados, para completar meu exemplo, vamos fazer a função que verifica se um dia passado como parâmetro é um fim de semana ou não.

//solução com case
function VerificarFimDeSemana(Dia: TDiasSemana): Boolean;
begin
  case Dia of
    Segunda..Sexta: Result := false;
    else Result := true;
  end;
end;

 

//solução com if reduzido
function VerificarFimDeSemana(Dia: TDiasSemana): Boolean;
begin
  Result := not (Dia in ([Segunda..Sexta]));
end;

A chamada desta função poderia ser feita desta forma:

VerificarFimDeSemana(Sabado)

O uso de tipos enumerados pode muito bem substituir o uso excessivo de constantes. Mas vamos imaginar uma interação com interface, como seria popular um TComboBox com um tipo enumerado? Simples, com a ajuda da unit typinfo isso fica moleza.

uses
  typinfo;

procedure PopularCombo(combo: TComboBox);
var
  Dias : TDiasSemana;
begin
  Combo.Clear;
  for Dias:= Domingo to Sabado do
    Combo.Items.Add(GetEnumName(TypeInfo(TDiasSemana),Integer(Dias)));
end;

Esta função GetEnumName() retorna o nome de um determinado item de um tipo enumerado e a função Integer retorna o valor do indice interno do item do tipo enumerado, para o nosso tipo TDiasSemana, teremos:

0 = Domingo
1 = Segunda
2 = Terca
3 = Quarta
4 = Quinta
5 = Sexta
6 = Sabado

Para chamar a função VerificarFimDeSemana() a partir de um dos itens deste TComboBox basta fazer desta maneira:

VerificarFimDeSemana(TDiasSemana(Combo.ItemIndex));

Uma opção legal para o uso de tipo enumerados é em propriedades de componentes ou até mesmo em atributos de classes, enfim, sabendo como usar, o céu é o limite. Até a próxima. =).

Sobre Diego Garcia

Analista/Desenvolvedor Delphi desde 2008, bacharel em Ciência da Computação e entusiasta de metodologias ágeis e engenharia de software.
Esse post foi publicado em Programação e marcado , , . Guardar link permanente.

7 respostas para Tipos Enumerados em Delphi

  1. Opa amigo, também estou nessa batalha, legal sua iniciativa!

    Acho legal também comentar sobre “conjuntos” de tipos enumerados, os famosos “set of”,
    seguindo seu exemplo:

    type
    TDiasSemana = (Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado);
    TFimDeSemana = set of TDiasSemana;
    ….
    const
    FIMDESEMANA : TFimDeSemana = [Sabado, Domingo];

    function VerificarFimDeSemana(Dia: TDiasSemana): Boolean;
    begin
    Result := (Dia in (FIMDESEMANA));
    end;

    Assim, se um dia precisar assumir que Sexta Feira também é fim de semana, basta trocar na declaração da constante FIMDESEMANA.

    Valeu, sorte para nós.

  2. Pingback: Definindo conjuntos de dados em Delphi | Diego Garcia

  3. Samuel "Muka" David disse:

    Mais um item importante que costumava cair muito em provas anteriores são 4 funções para se trabalhar com tipos enumerados. Low, High, Pred, Succ.
    Low : Retorna o menor valor de um tipo enumerado;
    http://www.delphibasics.co.uk/RTL.asp?Name=Low
    High: Retorna o Maior valor de um tipo enumerado;
    http://www.delphibasics.co.uk/RTL.asp?Name=high
    Pred: Retorna o predecessor de um valor ordinal;
    http://www.delphibasics.co.uk/RTL.asp?Name=Pred
    Succ: Retorna o sucessor de um valor ordinal;
    http://www.delphibasics.co.uk/RTL.asp?Name=Succ

    Também podemos fazer um link para as procedures Inc e Dec;
    Inc: Incrementa o valor de uma variavel;
    http://www.delphibasics.co.uk/RTL.asp?Name=Inc
    Dec: Decrementa o valor de uma variavel;
    http://www.delphibasics.co.uk/RTL.asp?Name=Dec

    Obs: Tipos ordinais podem compreender caracteres, valores inteiros, tipos enumerados e ponteiros.

  4. Pingback: Usando High, Low, Pred e Succ trabalhando com enumerations e arrays | Diego Garcia

Deixe um comentário