Être sûr de bien fermer son programme :
Fortuitement, à la lecture de la mailing-list de gambas j'ai découvert que d'autres avaient les mêmes problèmes de clotûre "réelle" de leur programme (effacement total de la mémoire).
Il suffit pourtant d'une seule ligne où l'on désigne une form comme la form principale pour que lors de sa fermeture, Gambas considère que si la form principale ferme alors les autres (éventuelles) doivent aussi fermer.
À insérer soit dans un module de lancement soit dans la form principale (en fait, là où l'on veut, c'est du static) :
Dans un module si la form principale se nomme Fmain :
1
| Application.MainWindow=Fmain.Window
|
ou dans la form principale, elle-même :
1
2
| Application.MainWindow=ME.Window '<---------- l'une ou l'autre Application.MainWindow=ME '<----------------- l'une ou l'autre
|
Ajout :
- Cette déclaration ne fonctionne qui si le formulaire n'est pas
Modal.
- Attention lors de l'utilisation de certains objets, il convient tout de même de se "débarrasser" de ces objets avant la clotûre!
- Une liste de ces "objets" sera constituée au fur et à mesure de leur "découverte" (n'hésitez pas à l'alimenter) :
- L'existence d'une méthode : Delete (objet.delete) semble un bon critère d'évaluation d'un objet dont il faut se débarrasser avant fermeture de son programme.
- Penser, surtout à la
"Boucle d'évènements" en vérifiant que "tout" est bien bouclé avant la sortie de programme sinon la fermeture sera bien effective mais il restera en mémoire de votre machine plein de chose de chez Gambas, ne pas oublier que certains évènements sont
différés.
C'est le cas avec les DataGrid qu'il faut penser à bien mettre à jour immédiatement avec un
Wait lors de tout déplacement dans ceux ci.
Vérifier les ouvertures éventuelles de fichiers qui doivent être fermés avant clôture du programme.
Ou avec les boucles de commande du genre For Next qui doivent être arrêtées par un break avant de quitter.
1
2
3
4
5
6
7
| FOR i = 1 TO Count REPEAT truc WAIT 0.012 UNTIL $bStop IF $bStop THEN BREAK '<---------------------------' pour permettre de quitter proprement NEXT
|
- Ne pas rappeler un ou des composants de la Application.MainWindow, ou même d'une autre Form, lors de la clôture sinon la boucle est relancée.
- Des composants ou des variables, non instanciés ou non initialisées lors de la fermeture du programme peuvent aussi, la perturber.
- Un menu avec checked=True mais enabled=False ou visible=False pose souci lors de la fermeture.
- Le jeu d'un son doit être contrôlé quant à sa longueur et attendre la fin de son jeu par un Wait de la longueur de temps.
Rappel :
La fermeture d'un programme graphique se fait par :
On peut lors de cet appel demander au programme de faire du "nettoyage" (voir les objets au dessus) juste avant la fermeture :
1
2
3
4
5
6
7
| PUBLIC SUB Form_Close()
Fmain.Hide 'on cache la form principale ModPrinc.bCloture = TRUE 'on annonce qu'on est bien en fermeture pour le splashForm SplashForm.ShowModal() 'on envoi le splash, la form principale n'est fermée que juste après la fin du splash même si elle est invisible
END
|
Dans le splashForm :
1
2
3
4
5
6
7
| PUBLIC SUB Form_Close() 'on ferme et on nettoie
hConsoleTimer.Stop 'on arrête le timer hConsoleTimer = NULL 'on nettoie ProgressBar1 = NULL 'on nettoie
END
|
et non pas par :
qui est plutôt réservé aux applications en console même si un programme graphique est effectivement arrêté, la mémoire de l'ordinateur n'est pas proprement libérée.
On peut l'utiliser avec un module qui sert au lancement et à la fermeture d'un programme quand toutes les fenêtres ont bien été fermées.
1
2
3
4
5
6
7
8
9
| PUBLIC SUB Main() '<------------------- procédure principale du module bCloture = FALSE '<----------------- indique qu on est en entrée de programme Splash.ShowModal() '<---------------- entrée dans programme par splash FMain.ShowModal() '<--------------- form principale en modal WAIT '<---------------------------- pour être certain d'avoir la fermeture bCloture = TRUE '<----------------- annonce au splash qu'on est en clôture Splash.ShowModal() '<---------------- sortie du programme par splash QUIT '<---------------------------- sortie effective END
|
====================
Commandes utilisées :
Application.MainWindow , pas celle-ci :
Application
Quit
Close
Cycle de vie d'une fenètre ====================
Navigation :
<-- Liens du Wiki : <--<-- Accueil du WIKI : <-- ====================
Documentation :
====================