Types énumérés, intervalle et ensemble

Eric SIBERT

L'objectif de ce court article est de vous donner un aperçu des types présentés dans le titre.

- Titre : Types énumérés, intervalle et ensemble

- Auteur : Eric SIBERT

- Parution : 24 novembre 2001

- Mise à jour : 6 décembre 2019

- Licence : Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- I. Zoom

I - Zoom

Récemment, j'étais en train d'écrire une application graphique qui comporte un certain nombre de niveaux de zoom prédéfinis. Comme les valeurs de zoom sont connues à l'avance, au moment de la programmation, le recours à un type énuméré convient bien :

type
TZoom = (z800,z400,z200,z100,z50,z25,z10,z5);

À partir de là, on peut utiliser TZoom comme on emploie tout format scalaire tel que les entiers.
Comme indice de tableau :

const
// coefficient de zoom en %
Facteur : array[TZoom] of integer =
(800, 400, 200, 100, 50, 25, 10, 5);

Ensuite, on parcourt ce tableau en utilisant low et high pour connaître les limites :

var
Reduc : TZoom;
Largeur : integer;
begin
for Reduc:=low(TZoom) to high(TZoom) do
begin
Largeur:=Facteur[Reduc] * Cote;
...

Mais ensuite, j'ai voulu faire des traitements particuliers pour les facteurs de zoom inférieurs ou égaux à 100 %. Pour ceci, j'ai défini un type intervalle qui s'applique sur une partie de mon type énuméré :

type
TReduction = z100..z5;

Je peux alors travailler avec ce nouveau type intervalle comme avec l'ancien type énuméré :

var
fImage : array[TReduction] of TMozaic;
Reduc : TReduction;
Largeur : integer;
begin
for Reduc:=low(TReduction) to high(TReduction) do
begin
Largeur:=Facteur[Reduc] * Cote;
fImage[Reduc]:=TMozaic.Create;
...

Mais il me restait un dernier problème. Comment déterminer, pour un facteur de zoom donné, s'il fait partie de l'intervalle de TReduction ? Ou encore, s'il fait partie de l'ensemble des valeurs possible de TReduction ?
Première méthode, vous vérifiez que votre variable est située entre les extrêmes de TReduction :

procedure Dessine (Zoom : TZoom);
begin
if Zoom in [low(TReduction)..high(Treduction)] then
...

Et si vous voulez faire plus propre, en particulier si vous devez réaliser le test plusieurs fois, définissez un ensemble qui contient toutes les valeurs de TReduction :

type
TEnsembleReduction = set of TReduction;
const
EnsembleReduction : TEnsembleReduction = [low(TReduction)..high(TReduction)];

Ensuite, il ne reste plus qu'à tester si la variable appartient à l'ensemble :

procedure Dessine (Zoom : TZoom);
begin
if Zoom in EnsembleReduction then
...

Voilà, j'espère que cet aperçu vous a intéressé. Si vous voulez aller plus loin, l'aide en ligne de Delphi constitue une bonne source. Vous devrez en particulier consulter la « Référence Pascal Objet » et les rubriques « Types scalaires » et suivantes. Pour une lecture au format papier, soit vous disposez du guide Pascal Objet, soit vous le retrouvez au format pdf sur le CD de Delphi.