Sortir d'une boucle [Résolu]

Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Dernière intervention
6 mai 2018
- 21 mai 2007 à 19:42 - Dernière réponse :
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Dernière intervention
6 mai 2018
- 23 mai 2007 à 07:04
Salut,
Mon programme propose une solution qui s'approche de la réponse idéale à chaque itération.
Donc je ne peux pas donner de nombre d'itération à l'avance, mais l'utilisateur doit pouvoir décider quand arrêter la boucle en appuyant sur un bouton.
Je cherche une solution pour sortir de la boucle en cliquant sur le bouton, mais sans résultat! (pour le moment...)
Quelqu'un à une idée?
A+
PhilLU
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
21 mai 2007 à 20:43
3
Merci
 
var
  Stop : boolean = false; { control de sortie }

const
  MaxItC = 1000000; { max d'iterations }

procedure Boucle;
var ItC : integer;
begin
  { init }
  Stop := False;
  ItC := 0;
 
  { boucle tant que Stop=False et ItC inferieur a MaxItc }
  while (not Stop) and (ItC < MaxItC) do
  begin
    { ... code ... }
   
    Inc(ItC); { incremenation du compteur d'iteration }
    if (ItC mod 5) = 0 then { toute les 5 iteration on appel ProcessMessages pour
                              ne pas bloquer le programme }
       Application.ProcessMessages;
  end;
end;

procedure TFormX.ButtonStopClick(Sender : TObject);
begin
  { simple comme bonjour }
  Stop := true;
end;

<hr size="2" width="100%" />Croc (click me)

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
22 mai 2007 à 10:10
3
Merci
Salut,

Petite remarque au passage concernant un piège courant -> si tu as deux boutons, un pour démarrer la résolution et un pour la stopper en cours de résolution, avec le code de f0xi, les deux boutons deviennent utilisables en plein calcul.

Autrement dit, l'utilisateur peut démarrer un nouveau calcul avant que le précédent ne soit finit... Tout dépend de l'algo, mais cela peut avoir des conséquences facheuses, si il modifie une variable globale par exemple...

On peut désactiver temporairement les boutons avec leurs propriété enable.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_rt15
Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
22 mai 2007 à 14:38
3
Merci
exact!

var
  Stop : boolean = false; { control de sortie }

const
  MaxItC = 1000000; { max d'iterations }

procedure Boucle;
var ItC : integer;
begin
  { init }
  ItC := 0;
 
  { boucle tant que Stop=False et ItC inferieur a MaxItc }
  while (not Stop) and (ItC < MaxItC) do
  begin
    { ... code ... }
   
    Inc(ItC); { incremenation du compteur d'iteration }
    if (ItC mod 5) = 0 then { toute les 5 iteration on appel ProcessMessages pour
                              ne pas bloquer le programme }
       Application.ProcessMessages;
  end;
end;

procedure TFormX.ButtonStopClick(Sender : TObject);
begin
  { simple comme bonjour }
  Stop := true;

  ButtonStart.Enabled := true;
  ButtonStop.Enabled  := false;
end;

procedure TFormX.ButtonStartClick(Sender : TObject);
begin
  ButtonStart.Enabled := false;
  ButtonStop.Enabled  := true;

  Stop := false;
  Boucle;
end;

<hr size="2" width="100%" />Croc (click me)

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de f0xi
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Dernière intervention
6 mai 2018
22 mai 2007 à 16:55
0
Merci
Merci pour les infos!!!
Si je comprend bien c'est le 'Application.ProcessMessages;' qui rend l'évennement click du bouton 'atteignable'.
Je teste ça asap!
Concernant le risque boutons multiples, je vais changer la fonction du bouton en fonction de son état 'Stop<->Start' comme ça pas de lézard.
A+
PhilLU
Commenter la réponse de PhilLu
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Dernière intervention
6 mai 2018
23 mai 2007 à 07:04
0
Merci
Même si je ne comprend pas encore comment, mais ça marche!
Il semble que l'appli ne stoppe pas immédiatement et qu'il faut cliquer longtemps sur le bouton.
La position de Application.ProcessMessages; semble critique.
De plus quand je clique sur une autre zone de l'appli, la routine de calcul se met en pause!?!
Encore merci!
A+
PhilLU
Commenter la réponse de PhilLu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.