Sets are collections of ordinal values that can have a maximum of 256 elements. To declare a set, you need to create an enumerated type first. Then use the following syntax to declare a set:
TNewSet = set of EnumeratedType;
Sets are really lightweight and give us the ability to work with a collection of values. A set variable occupies a single byte of memory. The following code shows how to declare a new set based on the TDay enumeration and how to assign an empty set to the ThisWeek set variable:
type { enumerated type } TDay = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); { set } TDays = set of TDay; var ThisWeek: TDays; begin ThisWeek := []; // the set contains no values end.
The assignment operator allows you to assign one or several values to a set in one statement. To assign values to a set, you have to enclose them in brackets. If you're assigning multiple values to the set, the values inside the brackets must be separated with commas:
ThisWeek := [Monday]; ThisWeek := [Monday, Tuesday, Friday];
The + and – operators can be used to add or remove values from a set:
ThisWeek := ThisWeek - [Friday]; ThisWeek := ThisWeek + [Saturday, Sunday];
These operators are usually used to add or remove elements from the set. However, if possible, you should use the Exclude and Include procedures instead because the procedures work faster than the operators:
Exclude(ThisWeek, Friday); Include(ThisWeek, Saturday); Include(ThisWeek, Sunday);
The difference between the operators and the Exclude and Include procedures is that operators can work with multiple values ([Saturday, Sunday]), while procedures only accept one value at a time.
The reserved word in can be used to determine if a specified value exists in the set. For instance, to find out if the ThisWeek set contains Wednesday, you can write this:
if Wednesday in ThisWeek then WriteLn('Have to work on Wednesday.');
You can browse through a set using any of the available loops, even the for-in loop, which also requires the least amount of typing and results in the most readable code.
Listing 7-1: Working with sets
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type TDay = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); TDays = set of TDay; var ThisWeek: TDays; Day: TDay; const DAY_TEXT: array[TDay] of string = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'); begin ThisWeek := [Monday, Tuesday, Friday]; for Day in ThisWeek do WriteLn('I have to work on ', DAY_TEXT[Day], '.'); { If you need to use a compiler older than Delphi 2005. } for Day := Monday to Sunday do if Day in ThisWeek then WriteLn('I have to work on ', DAY_TEXT[Day], '.'); ReadLn; end.