Types énumérés, intervalle et ensemble

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

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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

 
Sélectionnez

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

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

 
Sélectionnez

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

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

 
Sélectionnez

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éfinie un type intervalle qui s'applique sur une partie de mon type énuméré :

 
Sélectionnez

type 
  TReduction = z100..z5; 

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

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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.

Liste de mes articles :
Types énumérés, intervalle et ensemble
MMX avec Delphi 6 / Kylix
Préchargement de données dans le cache
MMX ( 2 ) avec Delphi 6 / Kylix
Instructions SIMD sur les réels
Internationaliser un projet Delphi
Installer D6 sous Windows 95
Tramage d'une image
Coder le PNG soi-même
Utiliser LibTiff avec Delphi
Ecrire une UDF FireBird avec Kylix

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.