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. =).
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.
Opa Gustavo, obrigado por ler e comentar. Realmente vale a pena comentar sobre os “Set of” e seu exemplo ficou muito bom, se você permitir gostaria de usa-lo em um próximo post sobre Set of.
Abraços e boa sorte para nós!
Claro, sem problema nenhum.
Pingback: Definindo conjuntos de dados em Delphi | Diego Garcia
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.
Muka, muito obrigado pela sua colaboração, inclusive por ser com conhecimento de causa, vale a pena também um post com essas questões… Abraço…
Pingback: Usando High, Low, Pred e Succ trabalhando com enumerations e arrays | Diego Garcia