Bonjour,

Je suis tombé sur un problème qui mérite réflexion.
J'ai corrigé le problème mais néanmoins, je pense que c'est important d'en parler.

Delphi est un langage fortement typé. Ça permet (entre autres) de laisser faire les exceptions standard contrôler les valeurs hors limites.

Néanmoins je me suis fait avoir dans les boucles for en utilisant des types intervalle.

Voici un petit exemple où j'ai mis le résultat dans un mémo :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const ChiffreMin = 0;
      ChiffreMax = 9;

type
  TChiffre = ChiffreMin..ChiffreMax;
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
// Si i est de type integer, ça fonctionne normalement :
// rien ne s'affiche.
var i, UnChiffre : TChiffre; 
begin
UnChiffre:=0;
// Si on remplace dans le for UnChiffre par ChiffreMin,
// on a une erreur de compilation E1012.
for i:=ChiffreMax to UnChiffre-1 do
  Memo1.Lines.Add(IntToStr(i));
end;

end.
Le résultat est le listing des entiers de 9 à 255...
Ce qui est surprenant c'est que si on remplace dans la boucle for UnChiffre par ChiffreMin, on a l'erreur suivante à la compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[Erreur] main.pas(34): E1012 L'expression constante dépasse les limites de sous-étendue
Il faut donc faire attention avec les types intervalles dans les boucle for et se limiter à des boucles du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
var i : TIntervalle;
for i:=Low(TIntervalle) to High(TIntervalle) do
  ...
end;
Sinon, il vaut mieux utiliser le type integer.

Etonnant, non ?