OVH Cloud OVH Cloud

Destruction de form inopérante..

9 réponses
Avatar
Yttrium
Bonjour,

Je travaille sous VB express 2005.

J'ai une appli non MDI avec une fenetre principale.
Cette fenetre ouvre une autre fenetre en mode modal, avec la méthode
showdialog()

Dans la seconde fenetre, j'ai quelques champs de formulaire.
Je rempli ces champs, et décide d'annuler l'action entreprise.
Je peux soit utiliser mon bouton "quitter", qui provoque un "me.close"
Soit fermer la fenetrte avec la petite croix rouge en haut droite.

Je retombe donc sur ma fenetre initiale.
Puis je réouvre une nouvelle fois ma seconde fenetre.
Le formulaire est encore rempli avec les anciennes informations.. !

Je ne m'explique pas ce comportement..
Pourquoi mon objet form n'est il pas détruit lors de l'appel de la
méthode "me.close" ?

Ou est mon erreur ?

Merci d'avance à qui pourra m'aider et m'apporter quelques informations
sur ce dysfonctionnement.

Cordialement.




--
[- Yttrium - http://www.danstesyeux.com -]
Le temps ne fait rien à l'affaire, quand on est con...
on est con...

9 réponses

Avatar
Fred
Dans : news:44897e74$0$851$
Yttrium écrit :
Bonjour,



Bonjour,

Pourquoi mon objet form n'est il pas détruit lors de l'appel de la
méthode "me.close" ?



C'est le fonctionnement normal.
La form n'existe plus lorsque la variable qui la référence est hors de
portée, ou bien si tu lui affecte Nothing, ou bien si tu refais un new
de ta classe form dans cette même variable.

Ou est mon erreur ?



Ne pas refaire le new ?
Dim frm as ClassForm
...
frm = New ClassForm
frm.ShowDialog
...


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Yttrium
Fred a écrit :

Ou est mon erreur ?



Ne pas refaire le new ?
Dim frm as ClassForm
...
frm = New ClassForm
frm.ShowDialog
...




Mais nulle part je ne déclare le form.
Il n'y a ni :
Dim frm as ClassForm

ni

frm = New ClassForm

Dans mon code..
C'ets grave docteur ?




--
[- Yttrium - http://www.danstesyeux.com -]
Le temps ne fait rien à l'affaire, quand on est con...
on est con...
Avatar
Fred
dans : news:44898a31$0$870$,
Yttrium écrivait :

Fred a écrit :

Ou est mon erreur ?



Ne pas refaire le new ?
Dim frm as ClassForm
...
frm = New ClassForm
frm.ShowDialog
...




Mais nulle part je ne déclare le form.
Il n'y a ni :
Dim frm as ClassForm

ni

frm = New ClassForm

Dans mon code..
C'ets grave docteur ?



Non, et puis je t'ai dit une bêtise. Je viens de vérifier dans la msdn.
Le close est sensé faire un dispose de la form. Je ne vois pas ce qui
pêche alors. Essaie de le faire avec mon bout de code pour voir ?
Avatar
Mehdi
On Fri, 9 Jun 2006 18:34:20 +0200, Fred wrote:


Mais nulle part je ne déclare le form.
Il n'y a ni :
Dim frm as ClassForm

ni

frm = New ClassForm



Non, et puis je t'ai dit une bêtise. Je viens de vérifier dans la msdn.
Le close est sensé faire un dispose de la form.



Non. Cela dépend de la maniere dont la form a été affichée. Si elle a été
affiché modless (avec Show()), Close dispose effectivement la form et il
n'est plus possible de la réutiliser. Si la form a été affichée de maniere
modale (avec ShowDialog()) alors Close se contente de cacher la fenetre
mais ne la détruit pas ce qui est la raison pour laquelle la réafficher
avec ShowDialog fonctionne et affiche la form telle qu'elle était avant
d'etre fermée.

La raison pour laquelle Yttrium n'a pas de dim ou new de sa forme est sans
doute qu'il a utilisé cette nouvelle fonctionnalité de VB .NET 2 qui permet
d'appeler des methodes d'instance comme ShowDialog() directement sur la
classe d'une form au lieu de les appeler sur l'instance d'une form (crée
avec dim et new). Lorsque l'on appele une méthode d'instance directement
sur la classe d'une form, le CLR crée automatiquement une instance de cette
form et appele la methode sur cette instance cachée. Du coup, tu n'a aucun
controle sur cette instance et tu ne peux pas la détruire ou la recréer. La
solution est d'éviter cette technique et d'utiliser la méthode
traditionnelle qui consiste a d'abord créer une instance puis appeler les
méthode d'instance dessus:

' Creation d'une instance de Form1
Dim myForm as Form1 = New Form1
' Affichage modal (ca bloque tant que myForm est affichée)
myForm.ShowDialog
' Destruction de l'instance de Form1
myForm.Dispose
' Creation d'une nouvelle instance de Form1
myForm = New Form1
' Affichage de cette nouvelle form
myForm.ShowDialog
' Etc
Avatar
Patrice
VB2005 renoue avec la (mauvaise ?) tradition VB6 qui consiste à avoir
automatiquement un objet FormX pour chaque classe FormX créée.

D'où donc la possibilité de faire FormX.Show sans déclarer la variable au
préalable. Je suis un peu plus étonné par la survivance après le close des
données et c'est pas une question pour un vendredi ;-)

Personnellement je ne suis pas un grand fan de ce style et ma préférence
personnelle serait de créer moi même les instances de formulaire :

Dim frm As New FormX
frm.Show
--
Patrice

"Yttrium" a écrit dans le message de news:
44898a31$0$870$
Fred a écrit :

Ou est mon erreur ?



Ne pas refaire le new ?
Dim frm as ClassForm
...
frm = New ClassForm
frm.ShowDialog
...




Mais nulle part je ne déclare le form.
Il n'y a ni :
Dim frm as ClassForm

ni

frm = New ClassForm

Dans mon code..
C'ets grave docteur ?




--
[- Yttrium - http://www.danstesyeux.com -]
Le temps ne fait rien à l'affaire, quand on est con...
on est con...


Avatar
Fred
dans : news:cldcboii77p3$,
Mehdi écrivait :

On Fri, 9 Jun 2006 18:34:20 +0200, Fred wrote:


Mais nulle part je ne déclare le form.
Il n'y a ni :
Dim frm as ClassForm

ni

frm = New ClassForm



Non, et puis je t'ai dit une bêtise. Je viens de vérifier dans la
msdn. Le close est sensé faire un dispose de la form.



Non. Cela dépend de la maniere dont la form a été affichée. Si elle a
été affiché modless (avec Show()), Close dispose effectivement la
form et il n'est plus possible de la réutiliser. Si la form a été
affichée de maniere modale (avec ShowDialog()) alors Close se
contente de cacher la fenetre mais ne la détruit pas ce qui est la
raison pour laquelle la réafficher avec ShowDialog fonctionne et
affiche la form telle qu'elle était avant d'etre fermée.



Oui, il me semblait bien avoir utilisé le fait de pouvoir accéder aux
membres d'une form modale après avoir fait un close.
Ce n'est pas très clair dans la doc je trouve. Il semble, à la lecture,
(mais c'est peut-être mon anglais !) que la seule exception au dispose
après le close est le cas de la form MDI.


La raison pour laquelle Yttrium n'a pas de dim ou new de sa forme est
sans doute qu'il a utilisé cette nouvelle fonctionnalité de VB .NET 2



Oui, je ne l'utilise jamais. Je trouve que cela prête à confusion.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Yttrium
Patrice a écrit :
VB2005 renoue avec la (mauvaise ?) tradition VB6 qui consiste à avoir
automatiquement un objet FormX pour chaque classe FormX créée.

D'où donc la possibilité de faire FormX.Show sans déclarer la variable au
préalable. Je suis un peu plus étonné par la survivance après le close des
données et c'est pas une question pour un vendredi ;-)

Personnellement je ne suis pas un grand fan de ce style et ma préférence
personnelle serait de créer moi même les instances de formulaire :

Dim frm As New FormX
frm.Show



Ok,
Cela signifie donc que le fait de créer une form dans VS, et de
l'utiliser provoque une instanciation automatique (u moment du show, ou
bien dès l'execution de l'appli ?)
Et qu'il est préférable de réaliser sois même l'instanciation ?
Qu'en est il du form instancié automatiquement alors ?
Cela crée t il deux instanciation ?

Merci d'avance.


--
[- Yttrium - http://www.danstesyeux.com -]
Le temps ne fait rien à l'affaire, quand on est con...
on est con...
Avatar
Mehdi
On Mon, 12 Jun 2006 08:28:50 +0200, Yttrium wrote:


Ok,
Cela signifie donc que le fait de créer une form dans VS, et de
l'utiliser provoque une instanciation automatique (u moment du show, ou
bien dès l'execution de l'appli ?)
Et qu'il est préférable de réaliser sois même l'instanciation ?
Qu'en est il du form instancié automatiquement alors ?
Cela crée t il deux instanciation ?



Non. En fait, c'est le compilateur si je ne me trompe pas qui va ajouter du
code pour créer cette instance cachée s'il détecte que tu a appelé une ou
des méthodes d'instance sur une classe puis transformer ces appels sur la
classe en des appels "normaux" sur l'instance cachée . Si tu tu instancie
ta form normalement et n'appele les méthodes d'instances que sur instance
de ta classe et non sur la classe elle meme, alors le compilateur
n'ajoutera pas le code qui cree cette instance cachée.
Avatar
Mehdi
On Fri, 9 Jun 2006 19:24:23 +0200, Fred wrote:

Oui, il me semblait bien avoir utilisé le fait de pouvoir accéder aux
membres d'une form modale après avoir fait un close.
Ce n'est pas très clair dans la doc je trouve. Il semble, à la lecture,
(mais c'est peut-être mon anglais !) que la seule exception au dispose
après le close est le cas de la form MDI.



La doc pour Form.Close est effectivement tres mauvaise. La seule phrase qui
sous-entend ce comportement est "When the Close method is called on a Form
displayed as a modeless window, you cannot call the Show method to make the
form visible, because the form's resources have already been released.".
Mais ce n'est pas tres explicite. Et juste avant il y a: "When a form is
closed, all resources created within the object are closed and the form is
disposed." ce qui est completement faux.

Il est tres simple de faire un petit programme test pour mieux comprendre
ce qui se passe cela dit (utiliser la propriété Form.IsDisposed)