1. Tipos enumerados (Enumerated Type)
Los enumerados de Pascal son tipos opacos con muy buena encapsulación, y se usan mucho más frecuentemente en el desarrollo diario que los enumerados de otros lenguajes.
Sintaxis básica de definición
type
TAnimalKind = (akDuck, akCat, akDog);
Convención: añadir un prefijo de dos letras abreviado del nombre del tipo a cada constante del enumerado
ak= Animal Kind (abreviatura de TAnimalKind)- Propósito: las constantes enumeradas pertenecen por defecto al espacio de nombres global de la unidad. El prefijo reduce drásticamente los conflictos de nombres con otras variables y tipos personalizados.
La letra T al principio de TAnimalKind es opcional sintácticamente, solo es una norma de la industria. Se recomienda mantenerla, ya que permite identificar al instante que se trata de un tipo enumerado.
type
AnimalKind = (akDuck, akCat, akDog); // Sin T, sintaxis válidaLenguaje del código: JavaScript (javascript)
Notas adicionales:
- Los identificadores repetidos no generan errores de compilación inmediatos; distintas unidades pueden declarar nombres iguales;
- Aun así, es recomendable evitar conflictos de nombres para mejorar la legibilidad y facilitar las búsquedas globales (grep).
Enumerados con ámbito (enumerados cualificados, {$scopedenums on})
La directiva del compilador {$scopedenums on} aísla las constantes enumeradas dentro de su tipo correspondiente, evitando contaminar el espacio de nombres global
Desactivado por defecto
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program EnumDemo;
type TAnimalKind = (akDuck, akCat);
var k: TAnimalKind;
begin
k := akDuck; // Usar la constante directamente, sin TAnimalKind.
WriteLn(k); //Muestra akDuck
end.Lenguaje del código: PHP (php)
Como comentamos antes, el código se ejecuta desde la palabra clave begin.

Usar el prefijo ak es una buena práctica para evitar conflictos; omitirlo no genera errores.
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program EnumDemo;
type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
k := Duck;
WriteLn(k);//Duck
end.Lenguaje del código: PHP (php)

Al activar {$scopedenums on} es obligatorio escribir «NombreTipo.»
- Todo acceso requiere calificador de tipo:
TAnimalKind.akDuck - El prefijo ak deja de ser necesario; las constantes se simplifican como Duck, Cat, Dog
{$scopedenums on}
type
TAnimalKind = (Duck, Cat, Dog);
var
Kind: TAnimalKind;
begin
Kind := TAnimalKind.Duck; // Calificador de tipo obligatorio
end;Lenguaje del código: PHP (php)
Si se omite el calificador de tipo
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;
type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
k := Duck; // Sin TAnimalKind.
WriteLn(k);
end.Lenguaje del código: PHP (php)
Se produce un error de compilación
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(9,8) Error: Identifier not found "Duck"
mydemo.dpr(11,4) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: C:\FPC\3.2.2\bin\i386-Win32\ppc386.exe returned an error exitcodeLenguaje del código: CSS (css)
Si añadimos el calificador de tipo
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;
type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
k := TAnimalKind.Duck; // Con calificador completo
WriteLn(k);
end.Lenguaje del código: PHP (php)
El código compila sin problemas

Conversión explícita entre enumerados y números enteros
Los enumerados son tipos opacos; no se pueden asignar directamente valores entre enumerados y enteros, es obligatorio realizar una conversión manual:
- Enumerado → Entero:
Ord(variableEnumerado) - Entero → Enumerado: conversión explícita
TAnimalKind(valorEntero) - Valida siempre el rango numérico antes de convertir un entero a enumerado: intervalo válido
0 ~ Ord(High(TipoEnumerado))
type
TAnimalKind = (akDuck, akCat, akDog);
var
Kind: TAnimalKind;
Num: Integer;
begin
Kind := akCat;
Num := Ord(Kind); // akCat tiene el ordinal 1, Num=1
Num := 2;
// Validar rango antes de convertir
if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
Kind := TAnimalKind(Num);
end;Lenguaje del código: JavaScript (javascript)
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program EnumDemo;
type
TAnimalKind = (akDuck, akCat, akDog);
var
Kind: TAnimalKind;
Num: Integer;
begin
Kind := akCat;
Num := Ord(Kind); // akCat index is 1,Num=1
Num := 2;
if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
Kind := TAnimalKind(Num);
WriteLn(Num);//2
end.Lenguaje del código: PHP (php)

Enumerado