| L'instruction
DoEvents semble, en général, assez mystérieuse aux débutants. Elle
est l'exemple type du mécanisme de programmation événementielle
(méthode de programmation Windows). En effet, elle demande au système
de traiter les événements en attente, s'il y en a, dans la file des
messages Windows.
Pour
comprendre l'utilité de cette instruction, le plus simple est de tester
quelques lignes de code la mettant en oeuvre. Vous pourrez ainsi voir la
différence de déroulement du code avec ou sans l'instruction (il
suffit de mettre la ligne de code source correspondante en commentaire
ou non).
Commencez
par créer un projet (exe standard) dans lequel vous aurez un formulaire
contenant un bouton nommé cmdTest et un label nommé lblCompte.
Initialisez la valeur du contrôle Label à "0" (propriété Caption).
Saisissez
le code source suivant pour gérer les événements
"MouseDown" et "MouseUp" du bouton de commande
"cmdTest".
|
Option Explicit
Option Compare Text
Private mblnGo As Boolean
'--------------------------------------------------------------
Private Sub cmdTest_MouseDown(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
'--------------------------------------------------------------
mblnGo = True
While mblnGo
lblCompte = CStr(Val(lblCompte.Caption)
+ 1)
DoEvents
' Mettez cette ligne (DoEvents) en commentaire
' pour constater la différence d'exécution
Wend
End Sub
'--------------------------------------------------------------
Private Sub cmdTest_MouseUp(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
'--------------------------------------------------------------
mblnGo = False
End Sub
|
Pour exécuter le test, cliquez sur le bouton de
commande et restez cliqué (bouton gauche de la souris enfoncé). Vous
verrez la valeur de Label s'incrémenter rapidement.
Lorsque vous relâchez le bouton de la souris
(événement MouseUp), le compte s'arrête et vous reprenez la main.
Explication
:
Lorsque
vous appuyez sur le bouton gauche de la souris, l'événement
"MouseDown" est déclenché. La procédure événementielle
gérant cet événement commence par initialiser la variable booléenne de
niveau module "mblnGo" à "True". Elle exécute
ensuite une boucle "Tant que" (while) le booléen est vrai.
Aucune ligne de code ne modifiant la valeur de ce
booléen dans l'événement MouseDown, on se demande comment la boucle
peut s'arrêter ! En fait, l'instruction DoEvents demande au programme
de regarder si un événement est en attente et, si oui, d'exécuter le
code correspondant. Si vous avez relâché la souris, l'événement
"MouseUp" est en attente d'exécution. La procédure
événementielle correspondante est exécutée et la valeur du booléen mblnGo
est modifiée déclenchant ainsi la sortie de la boucle dans la procédure
événementielle "MouseDown" qui, du coup, se termine.
Tentez de mettre en commentaire la ligne
"DoEvents" de l'événement "MouseDown", vous
constaterez que l'affichage ne se fait pas, que le bouton reste enfoncé
et que vous ne reprenez plus la main. En effet, dans ce cas, c'est la
boucle qui a la main et, comme elle ne reçoit plus les événements
système, le programme ne "voit" pas que vous avez relâché la
souris. Il vous faudra faire "Ctrl-Pause" pour arrêter l'exécution,.
NB : Cette instruction DoEvents est très
utile, par exemple pour gérer un bouton "Annuler" lors de l'impression
d'un long document. Sans instruction DoEvents, le programme, tout occupé
à lire un fichier ou une base de données pour imprimer un document, ne
verra pas que vous avez cliqué sur le bouton "Annuler". Il ne
recevrait le click qu'après la fin de la boucle d'impression, à un
moment, donc, où c'est devenu totalement inutile !
Ce n'est qu'un exemple (très fréquent) d'utilisation
de cette instruction. DoEvents est totalement incontournable dans une
programmation événementielle, vous trouverez probablement de nombreux
exemples d'utilisation ...
|