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;