Gambas France BETA


Pas de compte ? Incription

Exemple 9 :

Ê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 à faire
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 :
1
ME.close

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 :
1
QUIT
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 :



====================