4D v16.3

Boucle...Fin de boucle

Accueil

 
4D v16.3
Boucle...Fin de boucle

Boucle...Fin de boucle  


 

 

La syntaxe de la structure répétitive For...End for est la suivante :

 For(Variable_Compteur;Expression_Début;Expression_Fin{;Expression_Incrément})
    instructions(s)
 End for

La structure For...End for est une boucle contrôlée par un compteur :

  • La variable compteur Variable_Compteur est une variable numérique (Réel, Entier ou Entier long) initialisée par For...End for à la valeur spécifiée par Expression_Début.
  • La variable Variable_Compteur est incrémentée de la valeur spécifiée par le paramètre optionnel Expression_Incrément à chaque fois que la boucle est exécutée. Si vous ne passez pas de valeur dans Expression_Incrément, la variable compteur est incrémentée par défaut de un (1).
  • Lorsque le compteur atteint la valeur définie par Expression_Fin, la boucle s'arrête.

Important : Les expressions numériques Expression_Début, Expression_Fin et Expression_Incrément sont évaluées une seule fois, au début de la boucle. Si ces expressions sont des variables, leur modification depuis l'intérieur de la boucle n'affectera pas l'exécution de la boucle.

Astuce : En revanche, vous pouvez, si vous le souhaitez, modifier la valeur de la variable Variable_Compteur depuis l'intérieur de la boucle et cela affectera l'exécution de la boucle.

  • Généralement, Expression_Début est inférieure à Expression_Fin.
  • Si les deux expressions sont égales, la boucle ne sera exécutée qu'une fois.
  • Si Expression_Début est supérieure à Expression_Fin, la boucle ne s'exécutera pas du tout, à moins que vous ne spécifiiez une Expression_Incrément négative. Reportez-vous ci-dessous au paragraphe décrivant ce point.

(1) La boucle suivante s'exécute 100 fois :

 For(vCompteur;1;100)
  ` Faire quelque chose
 End for

(2) L'exemple suivant permet de traiter tous les éléments du tableau unTableau :

 For($vlElem;1;Size of array(unTableau))
  ` Faire quelque chose avec l'élément
    unTableau{$vlElem}:=...
 End for

(3) L'exemple suivant permet d'examiner chaque caractère du texte vtDuTexte :

 For($vlCar;1;Length(vtDuTexte))
  ` Faire quelque chose avec le caractère si c'est une tabulation
    If(Character code(vtDuTexte[[$vlCar]])=Tab
  ` ...
    End if
 End for

(4) L'exemple suivant permet de traiter tous les enregistrements de la sélection de la table [uneTable]:

 FIRST RECORD([uneTable])
 For($vlEnrg;1;Records in selection([uneTable]))
  ` Faire quelque chose avec chaque enregistrement
    SEND RECORD([uneTable])
  ` ...
  ` Passer à l'enregistrement suivant
    NEXT RECORD([uneTable])
 End for

La plupart des structures For...End for que vous écrirez dans vos bases ressembleront à celles présentées ci-dessus.

Dans certains cas, vous pouvez souhaiter disposer d'une boucle dont la valeur de la variable compteur décroît au lieu de croître. Pour cela, Expression_Début doit être supérieure à Expression_Fin et Expression_Increment doit être négative. Les exemples suivants effectuent les mêmes tâches que les précédents, mais en sens inverse :

(5) La boucle suivante s'exécute 100 fois :

 For(vCompteur;100;1;-1)
  ` Faire quelque chose
 End for

(6) L'exemple suivant permet de traiter tous les éléments du tableau unTableau :

 For($vlElem;Size of array(unTableau);1;-1)
  ` Faire quelque chose avec l'élément
    unTableau{$vlElem}:=...
 End for

(7) L'exemple suivant permet d'examiner chaque caractère du texte vtDuTexte :

 For($vlCar;Length(vtDuTexte);1;-1)
  ` Faire quelque chose avec le caractère si c'est une tabulation
    If(Character code(vtDuTexte[[$vlCar]])=Tab)
  ` ...
    End if
 End for

(8) L'exemple suivant permet de traiter tous les enregistrements de la sélection de la table [uneTable]:

 LAST RECORD([uneTable])
 For($vlEnrg;Records in selection([uneTable]);1;-1)
  ` Faire quelque chose avec chaque enregistrement
    SEND RECORD([uneTable])
  ` ...
  ` Passer à l'enregistrement précédent
    PREVIOUS RECORD([uneTable])
 End for

Si vous le souhaitez, vous pouvez passer dans Expression_Incrément une valeur (positive ou négative) dont la valeur absolue est supérieure à un.

(9) La boucle suivante ne traite que les éléments pairs du tableau unTableau :

 For($vlElem;2;Size of array(unTableau);2)
  ` Faire quelque chose avec l'élément 2,4...2n
    unTableau{$vlElem}:=...
 End for

Dans certains cas, vous voudrez exécuter une boucle un certain nombre de fois, mais également pouvoir sortir si une autre condition devient Vraie.

Pour cela, il vous suffit de tester cette condition à l'intérieur de la boucle et, si elle devient Vraie, de "forcer" la valeur de la variable compteur, de manière à ce qu'elle soit supérieure à celle de Expression_Fin.

(10) Dans l'exemple suivant, vous effectuez une boucle parmi les enregistrements d'une sélection jusqu'à ce que la fin de la sélection soit atteinte, ou bien jusqu'à ce que la variable interprocess <>vbStop, initialement fixée à Faux, prenne la valeur Vrai. Cette variable est gérée par une méthode projet APPELER SUR EVENEMENT utilisée pour interrompre l'opération :

 <>vbStop:=False
 ON EVENT CALL("GESTION STOP")
  ` GESTION STOP définit <>vbStop à Vrai si les touches Ctrl+point (Windows) ou Commande+point (Mac OS) sont enfoncées
 $vlNbEnrgs:=Records in selection([aTable])
 FIRST RECORD([aTable])
 For($vlEnrgs;1;$vlNbEnrgs)
  ` Faire quelque chose avec l'enregistrement
    SEND RECORD([aTable])
  ` ...
  ` Aller à l'enregistrement suivant
    If(<>vbStop)
       $vlEnrgs:=$vlNbEnrgs+1 ` Forcer la variable compteur à stopper la boucle
    Else
       NEXT RECORD([aTable])
    End if
 End for
 ON EVENT CALL("")
 If(<>vbStop)
    ALERT("L'opération a été interrompue.")
 Else
    ALERT("L'opération s'est terminée avec succès.")
 End if

Reprenons le premier exemple employé pour la structure For...End for :

(1) La boucle suivante s'exécute 100 fois :

 For(vCompteur;1;100)
  ` Faire quelque chose
 End for

Il est intéressant d'examiner la manière dont les boucles Tant que...Fin tant que et Repeter...Jusque effectuent la même action :

Voici la boucle Tant que...Fin tant que équivalente :

 $i :=1 ` Initialisation du compteur
 While($i<=100) ` Boucle 100 fois
  ` Faire quelque chose
    $i :=$i +1 ` Il faut incrémenter le compteur
 End while

Voici la boucle Repeter...Jusque équivalente :

 $i :=1 ` Initialisation du compteur
 Repeat
  ` Faire quelque chose
    $i :=$i +1 ` Il faut incrémenter le compteur
 Until($i=100) ` Boucle 100 fois

Astuce : La boucle For...End for est généralement plus rapide que les boucles Tant que...Fin tant que et Repeter...Jusque car 4D teste la condition en interne pour chaque cycle de la boucle et incrémente lui-même le compteur. Par conséquent, nous vous conseillons de préférer à chaque fois que c'est possible la structure For...End for.

Vous pouvez utiliser comme compteur une variable interprocess, process ou locale, et lui attribuer le type Réel, Entier ou Entier long. Pour des boucles longues, et particulièrement en mode compilé, nous vous conseillons d'employer des variables locales de type Entier long.

(11) Voici un exemple :

 C_LONGINT($vlCompteur` Utilisons une variable locale de type Entier long
 For($vlCompteur;1;10000)
  ` Faire quelque chose
 End for

Vous pouvez emboîter autant de structures répétitives que vous voulez (dans les limites du raisonnable). Cela s'applique aux structures de type For...End for. Il y a dans ce cas une erreur courante à éviter : assurez-vous d'utiliser une variable compteur différente par structure de boucle. Voici deux exemples :

(12) L'exemple suivant permet de traiter tous les éléments d'un tableau à deux dimensions :

 For($vlElem;1;Size of array(unTableau))
  ` ...
  ` Faire quelque chose avec la ligne
  ` ...
    For($vlSousElem;1;Size of array(unTableau{$vlElem}))
  ` Faire quelque chose avec l'élément
       unTableau{$vlElem}{$vlSousElem}:=...
    End for
 End for

(13) L'exemple suivant construit un tableau de pointeurs vers tous les champs de type Date présents dans la base :

 ARRAY POINTER($apChampsDate;0)
 $vlElem:=0
 For($vlTable;1;Get last table number)
    If(Is table number valid($vlTable))
       For($vlChamp;1;Get last field number($vlTable))
          If(Is field number valid($vlTable;$vlChamp))
             $vpChamp:=Field($vlTable;$vlChamp)
             If(Type($vpChamp>)=Is date)
                $vlElem:=$vlElem+1
                INSERT IN ARRAY($apChampsDate;$vlElem)
                $apChampsDate{$vlElem}:=$vpChamp
             End if
          End if
       End for
    End if
 End for



Voir aussi  

Case of...Else...End case
Conditions et boucles
If...Else...End if
Repeat...Until
While...End while

 
PROPRIÉTÉS 

Produit : 4D
Thème : Présentation du langage

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)