Difference between revisions of "Set"

From Lazarus wiki
Jump to navigationJump to search
Line 23: Line 23:
 
</code>
 
</code>
  
RatherSlow and RatherFast are some Sets.
+
RatherSlow and RatherFast are some Set of TSpeed.
 
 
  
 
== Manipulating sets ==
 
== Manipulating sets ==

Revision as of 01:30, 10 February 2013

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 Set of TSpeed.

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;