OVH Cloud OVH Cloud

sortie de programme VB

9 réponses
Avatar
Long YE-SU
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

9 réponses

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



Avatar
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




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


Avatar
Fred
Dans : news:445885c7$0$20179$
andre.araste écrit :

Bonjour.



Bonjour,

Je vais chercher dans ma doc.



Merci :-)

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Thierry
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




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

'Les affiche
MyFrm.Display "1"
MyFrm2.Display "2"
MyFrm3.Display "3"

'En unload certains
Unload MyFrm2
Unload MyFrm3

'Détruit
Set MyFrm3 = Nothing

'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