Enumerations, Subranges and Sets

11.1 Enumerations

type
  TOrderStatus = (osPending, osShipped, osDelivered, osCancelled);
  TPriority = (prLow = 1, prMedium = 5, prHigh = 10);    // explicit values (no RTTI names then)
  {$SCOPEDENUMS ON}
  TColor3 = (Red, Green, Blue);                          // must be used as TColor3.Red
  {$SCOPEDENUMS OFF}

var S: TOrderStatus := osShipped;
Writeln(Ord(S));                         // 1
Writeln(Succ(S) = osDelivered);          // True
Inc(S);
for var St := Low(TOrderStatus) to High(TOrderStatus) do Writeln(Ord(St));

uses System.TypInfo;
Writeln(GetEnumName(TypeInfo(TOrderStatus), Ord(S)));          // 'osDelivered'
var Parsed := TOrderStatus(GetEnumValue(TypeInfo(TOrderStatus), 'osPending'));
// Or with RTTI: TRttiEnumerationType.GetName(S) / GetValue<TOrderStatus>('osPending')

11.2 Subranges

type
  TPercent = 0..100;
  TUpperCase = 'A'..'Z';
var P: TPercent;
{$R+}                 // range checking on: assigning 150 raises ERangeError at runtime
P := 50;

11.3 Sets

Sets hold up to 256 ordinal elements (base type values 0..255). They're used heavily in the VCL (Font.Style := [fsBold], Anchors := [akLeft, akTop]).

type
  TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut);
  TFontStyles = set of TFontStyle;
  TCharSet = set of AnsiChar;

var
  Styles: TFontStyles;
  Vowels: TCharSet;
begin
  Styles := [fsBold, fsItalic];
  Include(Styles, fsUnderline);
  Exclude(Styles, fsItalic);
  if fsBold in Styles then Writeln('bold');
  Styles := Styles + [fsStrikeOut] - [fsBold];
  if Styles = [] then Writeln('empty');
  Vowels := ['a', 'e', 'i', 'o', 'u'];
  if CharInSet(Ch, ['0'..'9']) then Writeln('digit');
end;