Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fred
Dans : news:44571227$0$21268$ Long YE-SU écrit :
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire. Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer des tâches avant le déchargement de la feuille, voir même pour annuler l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les feuilles de l'application pour éventuellement toutes les décharger une à une.
Comme ceci par exemple :
Dim f As Form For Each f In Forms Unload f Next
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Dans : news:44571227$0$21268$8fcfb975@news.wanadoo.fr
Long YE-SU écrit :
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en
exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire.
Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer
des tâches avant le déchargement de la feuille, voir même pour annuler
l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les
feuilles de l'application pour éventuellement toutes les décharger une à
une.
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire. Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer des tâches avant le déchargement de la feuille, voir même pour annuler l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les feuilles de l'application pour éventuellement toutes les décharger une à une.
Comme ceci par exemple :
Dim f As Form For Each f In Forms Unload f Next
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Long YE-SU
ok merci je vais essayer cela
A+ Long
"Fred" a écrit dans le message de news:
Dans : news:44571227$0$21268$ Long YE-SU écrit : > je souhaite faire un bouton QUITTER dans une fenêtre Windows > > j'ai essayé le form1.Hide mais le programme est toujours en > exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire. Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer des tâches avant le déchargement de la feuille, voir même pour annuler l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les feuilles de l'application pour éventuellement toutes les décharger une à une.
Comme ceci par exemple :
Dim f As Form For Each f In Forms Unload f Next
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
ok merci
je vais essayer cela
A+
Long
"Fred" <foleide@libre.france> a écrit dans le message de news:
eS8afIcbGHA.1960@TK2MSFTNGP05.phx.gbl...
Dans : news:44571227$0$21268$8fcfb975@news.wanadoo.fr
Long YE-SU écrit :
> je souhaite faire un bouton QUITTER dans une fenêtre Windows
>
> j'ai essayé le form1.Hide mais le programme est toujours en
> exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire.
Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer
des tâches avant le déchargement de la feuille, voir même pour annuler
l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les
feuilles de l'application pour éventuellement toutes les décharger une à
une.
Dans : news:44571227$0$21268$ Long YE-SU écrit : > je souhaite faire un bouton QUITTER dans une fenêtre Windows > > j'ai essayé le form1.Hide mais le programme est toujours en > exécution..
Bonjour,
Form1.Hide cache la feuille mais elle reste en mémoire. Utilise Unload Form1 ou bien Unload Me (selon l'emplacement du code).
Tu peux utiliser l'évènement QueryUnload de la feuille pour effectuer des tâches avant le déchargement de la feuille, voir même pour annuler l'opération.
Enfin, la collection globale Forms te permet d'accéder à toutes les feuilles de l'application pour éventuellement toutes les décharger une à une.
Comme ceci par exemple :
Dim f As Form For Each f In Forms Unload f Next
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
andre.araste
Bonjour
Unload et End
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je peux vous envoyer une petite démo qui vous le prouvera)
End supprime le programme de la mémoire mais ne décharge pas les feuilles, laissant le gestionnaire de mémoire de Windows se débrouiller tout seul.
Pour une sortie parfaite il faudrait donc utiliser les 2 instructions, Unload puis End. -- Bonne réception.
http://perso.wanadoo.fr/andre.araste/ Membre du Club Win's: http://www.clubwins.org Avertissement: Je ne vends rien.
"Long YE-SU" a écrit dans le message de news: 44571227$0$21268$
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
y a t il une fonction "exit" ?
Sincères salutations Long YE-SU
Bonjour
Unload et End
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je peux
vous envoyer une petite démo qui vous le prouvera)
End supprime le programme de la mémoire mais ne décharge pas les feuilles,
laissant le gestionnaire de mémoire de Windows se débrouiller tout seul.
Pour une sortie parfaite il faudrait donc utiliser les 2 instructions,
Unload puis End.
--
Bonne réception.
andre.araste@wanadoo.fr
http://perso.wanadoo.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.
"Long YE-SU" <ye-su@sdsi.fr> a écrit dans le message de news:
44571227$0$21268$8fcfb975@news.wanadoo.fr...
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je peux vous envoyer une petite démo qui vous le prouvera)
End supprime le programme de la mémoire mais ne décharge pas les feuilles, laissant le gestionnaire de mémoire de Windows se débrouiller tout seul.
Pour une sortie parfaite il faudrait donc utiliser les 2 instructions, Unload puis End. -- Bonne réception.
http://perso.wanadoo.fr/andre.araste/ Membre du Club Win's: http://www.clubwins.org Avertissement: Je ne vends rien.
"Long YE-SU" a écrit dans le message de news: 44571227$0$21268$
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
y a t il une fonction "exit" ?
Sincères salutations Long YE-SU
Fred
Dans : news:44576d8b$0$29185$ andre.araste écrit :
Bonjour
Bonjour André,
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je peux vous envoyer une petite démo qui vous le prouvera)
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ? Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par le Unload n'est pas récupérée par le chargement d'une nouvelle feuille (par exemple) ? Est-ce que l'affectation de Nothing à une variable de type Form a une incidence ? (dans le cas où on ne souhaite pas quitter avec le End) Toujours est-il que je suis intéressé par cette petite démo.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Dans : news:44576d8b$0$29185$8fcfb975@news.wanadoo.fr
andre.araste écrit :
Bonjour
Bonjour André,
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je
peux vous envoyer une petite démo qui vous le prouvera)
Cela signifie-t-il que quitter un programme en faisant uniquement des
Unload ne restitue pas l'intégralité de la mémoire allouée pendant
l'exécution au système ?
Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par
le Unload n'est pas récupérée par le chargement d'une nouvelle feuille
(par exemple) ?
Est-ce que l'affectation de Nothing à une variable de type Form a une
incidence ? (dans le cas où on ne souhaite pas quitter avec le End)
Toujours est-il que je suis intéressé par cette petite démo.
Dans : news:44576d8b$0$29185$ andre.araste écrit :
Bonjour
Bonjour André,
Unload décharge la feuille mais ne la supprime pas de la mémoire. (je peux vous envoyer une petite démo qui vous le prouvera)
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ? Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par le Unload n'est pas récupérée par le chargement d'une nouvelle feuille (par exemple) ? Est-ce que l'affectation de Nothing à une variable de type Form a une incidence ? (dans le cas où on ne souhaite pas quitter avec le End) Toujours est-il que je suis intéressé par cette petite démo.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
andre.araste
Bonjour.
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par le Unload n'est pas récupérée par le chargement d'une nouvelle feuille.
La mémoire libérée par un Unload est réutilisée par le chargement d'une nouvelle feuille mais pas forcément à la même adresse.
Est-ce que l'affectation de Nothing à une variable de type Form a une incidence ? (dans le cas où on ne souhaite pas quitter avec le End).
Je ne connais pas bien cette instruction mais je pense qu'elle n'affecte que les variables objet crées par l'utilisateur, c'est donc un autre plan de l'adressage qui est concerné.
Dès qu'on sort du champ d'application d'une variable objet, l'instruction Nothing supprime toutes les variables qui lui sont relatives. (A creuser cependant).
Toujours est-il que je suis intéressé par cette petite démo.
Je vais chercher dans ma doc.
-- Bonne réception.
http://perso.wanadoo.fr/andre.araste/ Membre du Club Win's: http://www.clubwins.org Avertissement: Je ne vends rien.
"Fred" a écrit dans le message de news: %
Dans : news:44576d8b$0$29185$ andre.araste écrit :
Bonjour
Bonjour André,
Fred http://www.cerbermail.com/?3kA6ftaCvT
Bonjour.
Cela signifie-t-il que quitter un programme en faisant uniquement des
Unload ne restitue pas l'intégralité de la mémoire allouée pendant
l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par
le Unload n'est pas récupérée par le chargement d'une nouvelle feuille.
La mémoire libérée par un Unload est réutilisée par le chargement d'une
nouvelle feuille mais pas forcément à la même adresse.
Est-ce que l'affectation de Nothing à une variable de type Form a une
incidence ? (dans le cas où on ne souhaite pas quitter avec le End).
Je ne connais pas bien cette instruction mais je pense qu'elle n'affecte que
les variables objet crées par l'utilisateur, c'est donc un autre plan de
l'adressage qui est concerné.
Dès qu'on sort du champ d'application d'une variable objet, l'instruction
Nothing supprime toutes les variables qui lui sont relatives. (A creuser
cependant).
Toujours est-il que je suis intéressé par cette petite démo.
Je vais chercher dans ma doc.
--
Bonne réception.
andre.araste@wanadoo.fr
http://perso.wanadoo.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.
"Fred" <foleide@libre.france> a écrit dans le message de news:
%23jKlEmfbGHA.1260@TK2MSFTNGP05.phx.gbl...
Dans : news:44576d8b$0$29185$8fcfb975@news.wanadoo.fr
andre.araste écrit :
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Ou bien, si on ne quitte pas l'application, que la mémoire «libérée» par le Unload n'est pas récupérée par le chargement d'une nouvelle feuille.
La mémoire libérée par un Unload est réutilisée par le chargement d'une nouvelle feuille mais pas forcément à la même adresse.
Est-ce que l'affectation de Nothing à une variable de type Form a une incidence ? (dans le cas où on ne souhaite pas quitter avec le End).
Je ne connais pas bien cette instruction mais je pense qu'elle n'affecte que les variables objet crées par l'utilisateur, c'est donc un autre plan de l'adressage qui est concerné.
Dès qu'on sort du champ d'application d'une variable objet, l'instruction Nothing supprime toutes les variables qui lui sont relatives. (A creuser cependant).
Toujours est-il que je suis intéressé par cette petite démo.
Je vais chercher dans ma doc.
-- Bonne réception.
http://perso.wanadoo.fr/andre.araste/ Membre du Club Win's: http://www.clubwins.org Avertissement: Je ne vends rien.
"Fred" a écrit dans le message de news: %
Dans : news:44576d8b$0$29185$ andre.araste écrit :
Bonjour
Bonjour André,
Fred http://www.cerbermail.com/?3kA6ftaCvT
Fred
Dans : news:445885c7$0$20179$ andre.araste écrit :
Bonjour.
Bonjour,
Je vais chercher dans ma doc.
Merci :-)
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Dans : news:445885c7$0$20179$8fcfb975@news.wanadoo.fr
andre.araste écrit :
End -> quitte le programme Unload -> ferme une forme.
"Long YE-SU" a écrit dans le message de news: 44571227$0$21268$
je souhaite faire un bouton QUITTER dans une fenêtre Windows
j'ai essayé le form1.Hide mais le programme est toujours en exécution..
y a t il une fonction "exit" ?
Sincères salutations Long YE-SU
Fred
Dans : news:445885c7$0$20179$, andre.araste disait :
Bonjour.
Bonsoir,
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
J'ai regardé le code de la démo. Effectivement le Unload ne décharge pas tout (heureusement d'ailleurs). Il est même précisé dans la MSDN que le code du module de la feuille est toujours présent, ainsi probablement que tout le code des fonctions intrinsèques du VB telles que le MsgBox de la démo. La feuille et ses contrôles sont par contre bien déchargés. Et le framework d'application du vb6 termine proprement (je pense) le programme lorsque toutes les feuilles sont déchargées. Mais ça, c'est du code qu'on ne voit pas. À moins de démarrer l'application avec un Sub Main et de gérer soit même ses variables forms peut-être ? Quelque chose du style : Sub Main Dim f as New Form1 ... f.Show ...
While Forms.Count <> 0 DoEvents Wend End Sub
Je pense que cela ne doit pas être très éloigné du code généré automatiquement. Le End dans ce cas n'est pas nécessaire car l'application se termine normalement à la fin du Sub Main. Pour ma part je ne l'utilisais que pour des sorties imprévues en cas d'erreur sérieuse par exemple.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Dans : news:445885c7$0$20179$8fcfb975@news.wanadoo.fr,
andre.araste disait :
Bonjour.
Bonsoir,
Cela signifie-t-il que quitter un programme en faisant uniquement des
Unload ne restitue pas l'intégralité de la mémoire allouée pendant
l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
J'ai regardé le code de la démo.
Effectivement le Unload ne décharge pas tout (heureusement d'ailleurs).
Il est même précisé dans la MSDN que le code du module de la feuille est
toujours présent, ainsi probablement que tout le code des fonctions
intrinsèques du VB telles que le MsgBox de la démo.
La feuille et ses contrôles sont par contre bien déchargés.
Et le framework d'application du vb6 termine proprement (je pense) le
programme lorsque toutes les feuilles sont déchargées. Mais ça, c'est du
code qu'on ne voit pas. À moins de démarrer l'application avec un Sub
Main et de gérer soit même ses variables forms peut-être ?
Quelque chose du style :
Sub Main
Dim f as New Form1
...
f.Show
...
While Forms.Count <> 0
DoEvents
Wend
End Sub
Je pense que cela ne doit pas être très éloigné du code généré
automatiquement.
Le End dans ce cas n'est pas nécessaire car l'application se termine
normalement à la fin du Sub Main. Pour ma part je ne l'utilisais que
pour des sorties imprévues en cas d'erreur sérieuse par exemple.
Dans : news:445885c7$0$20179$, andre.araste disait :
Bonjour.
Bonsoir,
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
J'ai regardé le code de la démo. Effectivement le Unload ne décharge pas tout (heureusement d'ailleurs). Il est même précisé dans la MSDN que le code du module de la feuille est toujours présent, ainsi probablement que tout le code des fonctions intrinsèques du VB telles que le MsgBox de la démo. La feuille et ses contrôles sont par contre bien déchargés. Et le framework d'application du vb6 termine proprement (je pense) le programme lorsque toutes les feuilles sont déchargées. Mais ça, c'est du code qu'on ne voit pas. À moins de démarrer l'application avec un Sub Main et de gérer soit même ses variables forms peut-être ? Quelque chose du style : Sub Main Dim f as New Form1 ... f.Show ...
While Forms.Count <> 0 DoEvents Wend End Sub
Je pense que cela ne doit pas être très éloigné du code généré automatiquement. Le End dans ce cas n'est pas nécessaire car l'application se termine normalement à la fin du Sub Main. Pour ma part je ne l'utilisais que pour des sorties imprévues en cas d'erreur sérieuse par exemple.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Picalausa François
"andre.araste" a écrit dans le message de news: 445885c7$0$20179$
Bonjour.
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Unload ne restitue effectivement pas directement la mémoire allouée, mais ceci est faisable au travers des Set var = Nothing Cependant, après l'unload de la feuille, l'objet associé est marqué à invalider et le garbage collector s'occupe, tôt ou tard (souvent, en sortie de scope de l'objet), d'effectuer le "Set = Nothing". A partir de ce moment, l'objet sera désalloué et la mémoire pourra être réutilisée, mais certainement pas avant (Unload, Close, etc.)
C'est ce que l'on peut constater avec ce genre de code:
'Dans une feuille Form1 Option Explicit
Private mFormName As String
Public Sub Display(FormName As String) mFormName = FormName Show End Sub
Private Sub Form_Terminate() Debug.Print "destructor" & mFormName End Sub
'Dans un module Sub main() 'Feuille présente pour pouvoir arrêter l'exécution (à fermer manuellement) Dim MyFrm As Form1 'Feuille unloadée mais laissée au GC Dim MyFrm2 As Form1 'Feuille unloadée et détruite avec Set = Nothing Dim MyFrm3 As Form1
'Instancie nos objets Set MyFrm = New Form1 Set MyFrm2 = New Form1 Set MyFrm3 = New Form1
'Attend, pour ne pas sortir du scope trop vite While Forms.Count DoEvents Wend End Sub
On constate en effet l'ordre de destruction destructor3 destructor1 destructor2
3 vient en premier à cause du Set = Nothing. C'est de toutes façons une bonne pratique que de désallouer les objets lorsqu'ils ne sont plus utilisés, par Set = Nothing. ensuitent viennent 1 et 2, comme annoncé, lorsque l'on sort du scope, malgré que l'Unload de 2 ait été effectué bien avant l'unload de 1 (par l'utilisateur).
Dans TOUS les cas, End est à proscrire. Celui-ci ne libère PAS forcément la mémoire allouée, car il évite d'appeler les destructeur. Une comparaison souvent utilisée est que End, c'est comme arrêter sa voiture en utilisant... un mur. Le résultat (l'arrêt de la voiture) est celui escompté, mais avec quelques effets de bords peut être non négligeables. Dans l'exemple précédent, si on ajoute après la boucle While/Wend un End, voici le résultat : destructor3
Ceci illustre bien le fait qu'en ayant désalloué à la main (Set = Nothing) un maximum d'objets, on aura moins de dégats collatéraux en cas d'erreur fatale dans l'application demandant réellement l'appel à End.
Voir pour plus d'informations: http://faq.vb.free.fr/index.php?question
-- François Picalausa
"andre.araste" <andre.araste@wanadoo.fr> a écrit dans le message de news:
445885c7$0$20179$8fcfb975@news.wanadoo.fr...
Bonjour.
Cela signifie-t-il que quitter un programme en faisant uniquement des
Unload ne restitue pas l'intégralité de la mémoire allouée pendant
l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Unload ne restitue effectivement pas directement la mémoire allouée, mais
ceci est faisable au travers des
Set var = Nothing
Cependant, après l'unload de la feuille, l'objet associé est marqué à
invalider et le garbage collector s'occupe, tôt ou tard (souvent, en sortie
de scope de l'objet), d'effectuer le "Set = Nothing".
A partir de ce moment, l'objet sera désalloué et la mémoire pourra être
réutilisée, mais certainement pas avant (Unload, Close, etc.)
C'est ce que l'on peut constater avec ce genre de code:
'Dans une feuille Form1
Option Explicit
Private mFormName As String
Public Sub Display(FormName As String)
mFormName = FormName
Show
End Sub
Private Sub Form_Terminate()
Debug.Print "destructor" & mFormName
End Sub
'Dans un module
Sub main()
'Feuille présente pour pouvoir arrêter l'exécution (à fermer
manuellement)
Dim MyFrm As Form1
'Feuille unloadée mais laissée au GC
Dim MyFrm2 As Form1
'Feuille unloadée et détruite avec Set = Nothing
Dim MyFrm3 As Form1
'Instancie nos objets
Set MyFrm = New Form1
Set MyFrm2 = New Form1
Set MyFrm3 = New Form1
'Attend, pour ne pas sortir du scope trop vite
While Forms.Count
DoEvents
Wend
End Sub
On constate en effet l'ordre de destruction
destructor3
destructor1
destructor2
3 vient en premier à cause du Set = Nothing. C'est de toutes façons une
bonne pratique que de désallouer les objets lorsqu'ils ne sont plus
utilisés, par Set = Nothing.
ensuitent viennent 1 et 2, comme annoncé, lorsque l'on sort du scope, malgré
que l'Unload de 2 ait été effectué bien avant l'unload de 1 (par
l'utilisateur).
Dans TOUS les cas, End est à proscrire. Celui-ci ne libère PAS forcément la
mémoire allouée, car il évite d'appeler les destructeur. Une comparaison
souvent utilisée est que End, c'est comme arrêter sa voiture en utilisant...
un mur. Le résultat (l'arrêt de la voiture) est celui escompté, mais avec
quelques effets de bords peut être non négligeables.
Dans l'exemple précédent, si on ajoute après la boucle While/Wend un End,
voici le résultat :
destructor3
Ceci illustre bien le fait qu'en ayant désalloué à la main (Set = Nothing)
un maximum d'objets, on aura moins de dégats collatéraux en cas d'erreur
fatale dans l'application demandant réellement l'appel à End.
Voir pour plus d'informations:
http://faq.vb.free.fr/index.php?question
"andre.araste" a écrit dans le message de news: 445885c7$0$20179$
Bonjour.
Cela signifie-t-il que quitter un programme en faisant uniquement des Unload ne restitue pas l'intégralité de la mémoire allouée pendant l'exécution au système ?
C'est ce qu'il faut comprendre. Le programme lui-même est toujours là.
Unload ne restitue effectivement pas directement la mémoire allouée, mais ceci est faisable au travers des Set var = Nothing Cependant, après l'unload de la feuille, l'objet associé est marqué à invalider et le garbage collector s'occupe, tôt ou tard (souvent, en sortie de scope de l'objet), d'effectuer le "Set = Nothing". A partir de ce moment, l'objet sera désalloué et la mémoire pourra être réutilisée, mais certainement pas avant (Unload, Close, etc.)
C'est ce que l'on peut constater avec ce genre de code:
'Dans une feuille Form1 Option Explicit
Private mFormName As String
Public Sub Display(FormName As String) mFormName = FormName Show End Sub
Private Sub Form_Terminate() Debug.Print "destructor" & mFormName End Sub
'Dans un module Sub main() 'Feuille présente pour pouvoir arrêter l'exécution (à fermer manuellement) Dim MyFrm As Form1 'Feuille unloadée mais laissée au GC Dim MyFrm2 As Form1 'Feuille unloadée et détruite avec Set = Nothing Dim MyFrm3 As Form1
'Instancie nos objets Set MyFrm = New Form1 Set MyFrm2 = New Form1 Set MyFrm3 = New Form1
'Attend, pour ne pas sortir du scope trop vite While Forms.Count DoEvents Wend End Sub
On constate en effet l'ordre de destruction destructor3 destructor1 destructor2
3 vient en premier à cause du Set = Nothing. C'est de toutes façons une bonne pratique que de désallouer les objets lorsqu'ils ne sont plus utilisés, par Set = Nothing. ensuitent viennent 1 et 2, comme annoncé, lorsque l'on sort du scope, malgré que l'Unload de 2 ait été effectué bien avant l'unload de 1 (par l'utilisateur).
Dans TOUS les cas, End est à proscrire. Celui-ci ne libère PAS forcément la mémoire allouée, car il évite d'appeler les destructeur. Une comparaison souvent utilisée est que End, c'est comme arrêter sa voiture en utilisant... un mur. Le résultat (l'arrêt de la voiture) est celui escompté, mais avec quelques effets de bords peut être non négligeables. Dans l'exemple précédent, si on ajoute après la boucle While/Wend un End, voici le résultat : destructor3
Ceci illustre bien le fait qu'en ayant désalloué à la main (Set = Nothing) un maximum d'objets, on aura moins de dégats collatéraux en cas d'erreur fatale dans l'application demandant réellement l'appel à End.
Voir pour plus d'informations: http://faq.vb.free.fr/index.php?question