Pour les raisons énumérées ci-dessous, il est préférable d´éviter de cacher et d´afficher une feuille modale dans le même événement. Les résultats obtenussoit une erreur " Espace pile insuffisant", soit aucun événement généréne sont pas ceux attendus, et ce par conception.
Le problème est lié à une condition d´espace insuffisant dans la pile, bien que vous ne soyez pas réellement à court d´espace. La raison pour laquelle se produit la condition d´espace insuffisant dans la pile est due à une limitation dans la façon dont Visual Basic gère le fait d´afficher et de cacher les feuilles modales dans le même événement. Avant l´appel d´un événement, Visual Basic définit un indicateur de l´état modal de la feuille active et ne redéfinit pas cet indicateur avant que l´événement soit achevé. Ainsi, si vous cachez la feuille ( modale) active dans un événement, Visual Basic considère toujours la feuille comme modale, bien que le fait de la cacher doive la rendre non modale.
Lorsque vous cachez une feuille, le code immédiatement à la suite de l´instruction FormX.Show 1 devrait s´exécuter, mais ce n´est pas le cas. Visual Basic exécute le code restant de l´événement puis, une fois l´événement achevé, vérifie l´état modal de la feuille et exécute le code qui suit l´instruction FormX.Show 1. Il n´exécute ce code que si aucune autre feuille modale n´est affichée. Voici ci-dessous un exemple de code considérant que votre projet se compose de deux feuilles, Form1 et Form2.
´ Code pour Form1.
Private Sub Form_Click ( )
Form2.Show 1
Debug.Print " Form2 n´est pas modale"
End Sub
´ Code pour Form2.
Private Sub Form_Click ( )
Debug.Print " Cache Form2"
Form2.Hide
Debug.Print " Form2 est cachée"
End Sub
Exécutez le code ci-dessus, cliquez sur Form1 puis sur Form2. Dans la fenêtre Débogage, vous voyez apparaître :
Cache Form2
Form2 est cachée
< The Form_Click event of Form2 completes>
Form2 n´est pas modale
< The Form_Click event of Form1 completes>
Ce scénario démontre que Visual Basic exécute le code restant dans Form_Click de Form2 avant d´exécuter le code suivant l´instruction Form2.Show 1. En effet, si la feuille était considérée comme non modale immédiatement après l´instruction Form2.Hide, nous aurions :
Cache Form2
Form2 n´est pas modale
< The Form_Click event of Form1 completes>
Form2 est cachée
< The Form_Click event of Form2 completes>
Dans ce cas, Visual Basic affiche toujours la feuille modale suivante avant de considérer que la feuille en cours n´est pas modale. Chaque fois que vous cliquez sur le bouton de commande, une feuille modale s´affiche et Visual Basic n´a aucun moyen d´achever l´événement où la feuille était affichée comme modale. Chaque clic ajoute un nouvel appel à un événement qui ne peut pas s´achever et vous obtenez des appels récursifs à chaque événement.
Pour contourner ce problème, vous devez séparer l´instruction FormX.Hide pour la feuille en cours et l´instruction FormX.Show 1 pour la nouvelle feuille dans des événements distincts. Par exemple, vous pouvez cacher la feuille en cours dans l´événement Form_Click ( comme c´est déjà le cas), activer une minuterie, puis afficher la nouvelle feuille modale à partir de l´événement Timer. L´utilisation de ce schéma entraîne les événements suivants :
1. La feuille en cours est cachée.
2. La minuterie est activée pendant 1 milliseconde.
3. L´événement Click s´achève. Visual Basic reconnaît désormais que la feuille n´est plus modale.
4. Le code qui suit l´instruction FormX.Show 1 pour la feuille en cours s´achève et l´événement où la feuille était affichée prend fin également, mettant fin à la récursivité.
5. L´événement Timer est déclenché.
6. La nouvelle feuille est affichée comme modale.
7. La minuterie est désactivée pour éviter des événements supplémentaires.