[VBA] interuption de traitement dans une boucle ...

interuption de traitement dans une boucle ... [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 12-02-2003 à 15:09:39    

dans une boucle "Do until ..." par exemple,
 
je souhaite interrompre le traitent si j'appuis sur la touche espace ...
 
comment faire ?

Reply

Marsh Posté le 12-02-2003 à 15:09:39   

Reply

Marsh Posté le 12-02-2003 à 15:13:59    

en vb, ca m'arrive d'utiliser dans des boucles for :exit for
 
for i = 0 to XX
 
    if condition then
       exit for
    end if
 
next
 
je pense que ca doit exister avec le do until
 
edit : Exit Do  ca marche aussi


Message édité par xgirouette le 12-02-2003 à 15:14:49
Reply

Marsh Posté le 12-02-2003 à 15:15:22    

Déjà, vire ton until, beurk.
 
 

public test as boolean
 
sub tasub()
  [...]
  do while test
    [...]
    do events
  loop
  [...]
end sub
 
sub form_onkeypress(event truc muche machin chose)
  if keyscii = chais_pu_combien then
    test = false
  end if
end sud


Message édité par MagicBuzz le 12-02-2003 à 15:15:35
Reply

Marsh Posté le 12-02-2003 à 15:23:11    

En utilisant une API windows, qui détecte les touches. Pour le coup tu n'as pas le choix. Dés que cette API va détecter la valeur taper tu va affeter "1" à une variable que l'on va apeller "b". Donc b = 1 dés que la touche espace est tapé.
 
Ensuite tu incorpore dans la boucle, la variable b. Toutefois fais attention à ce que le traitement de ton API soit dans la boucle et pas allieur, sinon ca ne fonctionnera pas...c''est assez compliqué à faire..
 
tu trouveras sur ce liens l'API donc je te parle :  
http://docvb.free.fr/api.php

Reply

Marsh Posté le 12-02-2003 à 15:26:05    

Xgirouette a écrit :

en vb, ca m'arrive d'utiliser dans des boucles for :exit for
 
for i = 0 to XX
 
    if condition then
       exit for
    end if
 
next
 
je pense que ca doit exister avec le do until
 
edit : Exit Do  ca marche aussi
 


 
c'est pas le boucle for, next qu'il utilise mais
 

Code :
  1. do while
  2. loop


 
on ne peut pas en sortir comme en veux de ses choses là, c'est justement pour ca que son truc est assez compliqué et fais apels à des connaissances. Des connaisssances sur les API windows, et sur le traitement des clavier. Car pour sortir d'une chose pareil,il faut respecter la condition de départ. Il faudra donc qu'il incorpore cette détection dans la boucle...je lui souhate du bonheur, il a pas fini...

Reply

Marsh Posté le 12-02-2003 à 15:29:06    

MagicBuzz a écrit :

Déjà, vire ton until, beurk.
 
 

public test as boolean
 
sub tasub()
  [...]
  do while test
    [...]
    do events
  loop
  [...]
end sub
 
sub form_onkeypress(event truc muche machin chose)
  if keyscii = chais_pu_combien then
    test = false
  end if
end sud




 
oui c'est cela que je veux
mais form_onkeypress() existe sous VBA d'access 97 ?

Reply

Marsh Posté le 12-02-2003 à 15:29:38    

Hepil a écrit :


 
oui c'est cela que je veux
mais form_onkeypress() existe sous VBA d'access 97 ?


 
oui !

Reply

Marsh Posté le 12-02-2003 à 15:30:18    

Xgirouette a écrit :

en vb, ca m'arrive d'utiliser dans des boucles for :exit for
 
for i = 0 to XX
 
    if condition then
       exit for
    end if
 
next
 
je pense que ca doit exister avec le do until
 
edit : Exit Do  ca marche aussi
 


 
interrrompre (=PAUSE) ne veut pas dire arrêter (=STOP) le traitement :D

Reply

Marsh Posté le 12-02-2003 à 15:31:05    


 
ok je vais tester cela
 
merci à tous

Reply

Marsh Posté le 12-02-2003 à 15:58:38    

il y a un blême là
 
mon appli est lancée par un formulaire
 
ensuite le code est dans un module
ce code est un ensemble de boucle dont je veux interrompre le traitement de tps à autre
 
si je mets DoEvents dans la boucle dont je veux interrompre le traitement, il faut qu'une procédure prenne la main à ce moment là
celle-ci serait intitulée "MaForm_OnkeyPress()" ?
il faut logiquement placer cette procédure dans le code du formulaire et non dans le module !
d'où le problème !
En interrompant la boucle dans le module (Mod1), va t-on rentrer dans la procédure qui est dans le formulaire ?
 
 
 

Reply

Marsh Posté le 12-02-2003 à 15:58:38   

Reply

Marsh Posté le 12-02-2003 à 16:03:25    

Hepil a écrit :

il y a un blême là
 
mon appli est lancée par un formulaire
 
ensuite le code est dans un module
ce code est un ensemble de boucle dont je veux interrompre le traitement de tps à autre
 
si je mets DoEvents dans la boucle dont je veux interrompre le traitement, il faut qu'une procédure prenne la main à ce moment là
celle-ci serait intitulée "MaForm_OnkeyPress()" ?
il faut logiquement placer cette procédure dans le code du formulaire et non dans le module !
d'où le problème !
En interrompant la boucle dans le module (Mod1), va t-on rentrer dans la procédure qui est dans le formulaire ?
 
 
 
 


 
Doevents  c'est pour laisser le temps au système, de terminer l'action qu'il à commencé, ce n'est en rien un arrêt ou une sorti de ta boucle.
 
Effectivement aprés doevents tu peux mettre  non pas une procédure mais une fonction. Cette fonction te renverra 0 ou 1, si la touche espace est utilisé. Dans ce cas, las tu arrêtes ton programme.

Reply

Marsh Posté le 12-02-2003 à 16:12:44    

Plus exactement, VB est mono-process et mono-thread.
 
Donc quand tu es dans une boucle seul le code s'éxécute, tu ne peux plus rien faire. La preuve, la fenêtre freeze.
 
doevents est une instruction qui met en pause quelques instants le programme afin de contrôler qu'aucun autre thread n'à de traîtement à faire, notamment la gestion des évènements.
 
Donc toujours mettre des doevents dans les longues boucles principalement, afin de pouvoir trapper les actions utilisateur.
 
Quand tu utilises Winsock dans un programme VB, tu passes ton temps à mettre des doevents partout afin de ne pas perdre de trames sur le réseau. C'est le mot clé magique.
 
Il est très peu consomateur en ressources, n'hésite donc pas à le mettre dans une boucle.

Reply

Marsh Posté le 12-02-2003 à 16:14:44    

cvb > non, faut vraiment utiliser les évènements VB. Ca avec ton système, si l'utilisateur ne fait que frapper la touche, et que "doevents" ne se déclenche pas à ce moment, jamais tu ne va rien détecter.
 
keypress permet de récupérer un évènement même plusieurs secondes après qu'il se soit produit (par contre, si l'utilisateur appuie sur une autre touche en attendant, on perd la touche anciennement appuyée, mais c'est déjà ça)

Reply

Marsh Posté le 14-02-2003 à 09:53:54    

suite du blême :  
quand je sorts de la boucle, je peux me retrouver dans l'une ou l'autre des listeBox activées consécutivement dans mon application  
dois-je gérer "l'interruption" par une touche pour chacune des listeBox par le code_évenementiel s'y rapportant ou y a t-il une autre solution plus mieux ?
 
 
 
 
 
 
 
l'évènement OnKeyPress

Reply

Marsh Posté le 14-02-2003 à 19:03:16    

t'es obligé de faire en bouble.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed