Difference between revisions of "Set"

From Lazarus wiki
Jump to navigationJump to search
(→‎Bitmasks: adjust comment)
Line 7: Line 7:
 
For example let's consider this enumeration:
 
For example let's consider this enumeration:
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);  
 
   TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);  
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 13: Line 13:
 
And this set:
 
And this set:
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   TPossibleSpeeds = set of TSpeed
 
   TPossibleSpeeds = set of TSpeed
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Constant instances of TPossibleSpeeds can be defined using brackets to hold set elements:
+
[[Constant]] instances of TPossibleSpeeds can be defined using [[square brackets|brackets]] to hold set elements:
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   const
 
   const
 
     RatherSlow = [spVerySlow,spSlow];
 
     RatherSlow = [spVerySlow,spSlow];
Line 29: Line 29:
 
== Manipulating sets ==
 
== Manipulating sets ==
  
Two functions defined in the [[RTL]] [[System unit]] are used to manipulate a set: [[Include]](ASet,AValue) and  [[Exclude]](ASet,AValue).
+
Two [[Function|functions]] defined in the [[RTL]] [[System unit]] are used to manipulate a set: [[Include]](ASet,AValue) and  [[Exclude]](ASet,AValue).
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   var
 
   var
 
     SomeSpeeds: TPossibleSpeeds;
 
     SomeSpeeds: TPossibleSpeeds;
Line 44: Line 44:
 
then to call the setter.
 
then to call the setter.
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   procedure TSomething.DoSomething(Sender: TFarObject);
 
   procedure TSomething.DoSomething(Sender: TFarObject);
 
   var
 
   var
Line 55: Line 55:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The Keyword '''[[In]]''' is also used to test if a value is in a set. It's usually used in this fashion:
+
The [[Reserved_word|reserved word]] [[In|<syntaxhighlight lang="pascal" inline>in</syntaxhighlight>]] is also used to test if a value is in a set. It's usually used in this fashion:
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   var
 
   var
 
     CanBeSlow: Boolean;
 
     CanBeSlow: Boolean;
Line 71: Line 71:
 
Sets can be used to create bitmasks as shown in the example.
 
Sets can be used to create bitmasks as shown in the example.
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
(*
 
(*
 
   The set [FLAG_A, FLAG_C] will be stored like this:
 
   The set [FLAG_A, FLAG_C] will be stored like this:

Revision as of 18:35, 16 November 2019

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)

Introduction

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

For example let's consider this enumeration:

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

And this set:

  TPossibleSpeeds = set of TSpeed

Constant instances of TPossibleSpeeds can be defined using brackets to hold set elements:

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

RatherSlow and RatherFast are some Set of TSpeed.

Manipulating sets

Two functions defined in the RTL System unit 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 reserved word 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(TSpeed)..High(TSpeed)];
  begin
    CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds);
  end;

Bitmasks

Sets can be used to create bitmasks as shown in the example.

(*
  The set [FLAG_A, FLAG_C] will be stored like this:
  
  TFlags :   0000'0101
                   │││
  FLAG_C ──────────┘││
  FLAG_B ───────────┘│
  FLAG_A ────────────┘
*)

type
  TFlag = (FLAG_A, FLAG_B, FLAG_C);
  TFlags = set of TFlag;

var
  Flags: TFlags;

[..]
  Flags:= [FLAG_A, FLAG_C];
  if FLAG_A in Flags then ..  // check FLAG_A is set in flags variable


navigation bar: data types
simple data types

boolean byte cardinal char currency double dword extended int8 int16 int32 int64 integer longint real shortint single smallint pointer qword word

complex data types

array class object record set string shortstring