# Difference between revisions of "Set"

## Introduction

A Set encodes many values from an enumeration into an Ordinal type.

For example let's consider this enumaration:

``` ```

``` TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast); ```

And this set:

``` ```

``` TPossibleSpeeds = set of TSpeed ```

The TPossibleSpeeds can be defined as constant in right brackets:

``` ```

``` const RatherSlow = [spVerySlow,spSlow]; RatherFast = [spFast,spVeryFast]; ```

RatherSlow and RatherFast are some Sets.

## Manipulating sets

Usually two compiler functions are used to manipulate a set: Include(ASet,AValue) and Exclude(ASet,AValue).

``` ```

``` var SomeSpeeds = TPossibleSpeeds; begin SomeSpeeds := []; Include(SomeSpeeds,spVerySlow); Include(SomeSpeeds,spVeryFast); end; ```

Sets cannot be directly manipulated if they are published. You usually have to make a local copy, change the local copy and then to call the setter.

``` ```

``` procedure TSomething.DoSomething(Sender: TFarObject); var LocalCopy = TPossibleSpeeds; begin LocalCopy := Sender.PossibleSpeeds; // getter to local Include(LocalCopy,spVerySlow); Sender.PossibleSpeeds := LocalCopy; // local to setter. end; ```

The Keyword in is also used to test if a value is in a set. It's usually used in this fashion:

``` ```

``` var CanBeSlow: Boolean; const SomeSpeeds = [Low(TPossibleSpeeds)..High(TPossibleSpeeds)]; begin CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds); end; ```