logo UsualSoft   Skip Navigation Links
Accueil
Références
Formations
TutorielsExpand Tutoriels
Liens téléchargements

Contact : cgruchet@hotmail.com - Tél: 06 22 82 90 55
Microsoft Certified Professional
Trucs et Astuces : Visual-Basic

L'instruction DoEvents

Claude Gruchet  


   

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 ...