Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Win Forms: Show() - Hide() / Close() ?? Help !

5 réponses
Avatar
Jérémy S.
Salut à tous;

J'explique mon problème.

Je développe une application qui contient deux Forms : mettons Form1 et
Form2.

Sur Form1, j'ai un bouton1 qui appelle la méthode Form2.Show();

Sur Form2, j'ai deux boutons :
bouton2 qui appelle Hide(); et bouton3 qui appelle Close();

Si je me sers que de Form1.bouton1 et de Form2.bouton2, ça ne fait que des
Show/Hide, tout se passe bien.

Mais si je me sers de Form2.button3, ça Close, et au prochain appel à
Form2.Show(); le programme plante, car Form2 n'est plus référencée suite au
Close() (je pense).

Ma question est : y a t'il moyen de contourner cela ou est ce qu'il faut que
je recrée une instance de Form2 ?

Et si oui, y a t'il besoin de vider la mémoire de l'ancien Form2 d'une
quelconque manière ?

Je suis en train de migrer C -> C++ -> C# ...

Merci de votre aide

--
Jérémy


begin 666 icon_smile.gif
M1TE&.#EA#P`/`+,.`/_J`$5%10```/_.`/_)`/^T`/Z=`/_^D__]$_______
MQS,S,___Z__E`````````"'Y! $```X`+ `````/``\```1;T$D9:IW85:;.
M&1<6< @"G(,13$$G""?PIJMVF'$.:@H.GS^"*G #QH*%RB''!!"2`=.B"5@\
G*P/9:[L5K@)906(\%A!VFL&@P3736&J"7/X6!0KXPC##LM0F$0`[
`
end

5 réponses

Avatar
Mitsuru FURUTA [Ms]
Bonjour,

Tout ceci est normal,

Tu as le choix entre conserver la même fenêtre et jouer sur sa visibilité. A
utiliser si tu veux par exemple conserver le contexte et refaire
réapparaitre la fenêtre dans l'état où tu l'avais fermée. Tu alloues par
contre plus de mémoire.
Ou, tu détruis la fenêtre à chaque fermeture auquel cas il te faut
évidemment la recréer à chaque appel.

En clair c'est à toi de faire ce choix.

Bonne continuation,

Mitsuru FURUTA [Microsoft FRANCE]

"Jérémy S." <outdial at anarchie dot net> wrote in message
news:4182f7f6$0$3680$
Salut à tous;

J'explique mon problème.

Je développe une application qui contient deux Forms : mettons Form1 et
Form2.

Sur Form1, j'ai un bouton1 qui appelle la méthode Form2.Show();

Sur Form2, j'ai deux boutons :
bouton2 qui appelle Hide(); et bouton3 qui appelle Close();

Si je me sers que de Form1.bouton1 et de Form2.bouton2, ça ne fait que des
Show/Hide, tout se passe bien.

Mais si je me sers de Form2.button3, ça Close, et au prochain appel à
Form2.Show(); le programme plante, car Form2 n'est plus référencée suite


au
Close() (je pense).

Ma question est : y a t'il moyen de contourner cela ou est ce qu'il faut


que
je recrée une instance de Form2 ?

Et si oui, y a t'il besoin de vider la mémoire de l'ancien Form2 d'une
quelconque manière ?

Je suis en train de migrer C -> C++ -> C# ...

Merci de votre aide

--
Jérémy





Avatar
Lloyd Dupont
oui y'a un piege qui n'est pas evident dans le monde managed, il y a des
truc non manage, c'est pour cela qu'il y a la methode Dispose() et une fois
appeler la resource n'est plus utilisable (un peu comme si tu accedais une
memoire que tu as free() en C, sauf que tu as une DisposedException() au
lieu de crash-pouf, memory corruption...)

les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!

"Jérémy S." <outdial at anarchie dot net> wrote in message
news:4182f7f6$0$3680$
Salut à tous;

J'explique mon problème.

Je développe une application qui contient deux Forms : mettons Form1 et
Form2.

Sur Form1, j'ai un bouton1 qui appelle la méthode Form2.Show();

Sur Form2, j'ai deux boutons :
bouton2 qui appelle Hide(); et bouton3 qui appelle Close();

Si je me sers que de Form1.bouton1 et de Form2.bouton2, ça ne fait que des
Show/Hide, tout se passe bien.

Mais si je me sers de Form2.button3, ça Close, et au prochain appel à
Form2.Show(); le programme plante, car Form2 n'est plus référencée suite
au Close() (je pense).

Ma question est : y a t'il moyen de contourner cela ou est ce qu'il faut
que je recrée une instance de Form2 ?

Et si oui, y a t'il besoin de vider la mémoire de l'ancien Form2 d'une
quelconque manière ?

Je suis en train de migrer C -> C++ -> C# ...

Merci de votre aide

--
Jérémy




Avatar
LEBRUN Thomas
> les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!



Ce qui, d'après moi, est logique: si tu fermes ta fenêtre, c'est que tu
considères que tu ne va plus avoir à l'utiliser. D'où l'appel à Dispose() qui
va faire le ménage ;)

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Lloyd Dupont" a écrit :

oui y'a un piege qui n'est pas evident dans le monde managed, il y a des
truc non manage, c'est pour cela qu'il y a la methode Dispose() et une fois
appeler la resource n'est plus utilisable (un peu comme si tu accedais une
memoire que tu as free() en C, sauf que tu as une DisposedException() au
lieu de crash-pouf, memory corruption...)

les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!

"Jérémy S." <outdial at anarchie dot net> wrote in message
news:4182f7f6$0$3680$
> Salut à tous;
>
> J'explique mon problème.
>
> Je développe une application qui contient deux Forms : mettons Form1 et
> Form2.
>
> Sur Form1, j'ai un bouton1 qui appelle la méthode Form2.Show();
>
> Sur Form2, j'ai deux boutons :
> bouton2 qui appelle Hide(); et bouton3 qui appelle Close();
>
> Si je me sers que de Form1.bouton1 et de Form2.bouton2, ça ne fait que des
> Show/Hide, tout se passe bien.
>
> Mais si je me sers de Form2.button3, ça Close, et au prochain appel à
> Form2.Show(); le programme plante, car Form2 n'est plus référencée suite
> au Close() (je pense).
>
> Ma question est : y a t'il moyen de contourner cela ou est ce qu'il faut
> que je recrée une instance de Form2 ?
>
> Et si oui, y a t'il besoin de vider la mémoire de l'ancien Form2 d'une
> quelconque manière ?
>
> Je suis en train de migrer C -> C++ -> C# ...
>
> Merci de votre aide
>
> --
> Jérémy
>
>





Avatar
Elp
On Mon, 1 Nov 2004 07:29:05 -0800, LEBRUN Thomas wrote:

les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!



Ce qui, d'après moi, est logique: si tu fermes ta fenêtre, c'est que tu
considères que tu ne va plus avoir à l'utiliser. D'où l'appel à Dispose() qui
va faire le ménage ;)



Oui, c'est logique. Ce qui me dérange cependant dans cette histoire c'est
que d'apres la doc le comportement des methodes Close et Hide (et des
méthodes Show et ShowDialog une fois la forme disparue) sont différentes en
fonction du fait que la form soit modale ou non. Et ce n'est a mon avis pas
tres clairement expliqué dans la doc.
Avatar
Jérémy S.
"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!



Ce qui, d'après moi, est logique: si tu fermes ta fenêtre, c'est que tu
considères que tu ne va plus avoir à l'utiliser. D'où l'appel à Dispose()
qui
va faire le ménage ;)

A+




OK, le développeur peut choisir de Hide() plutot que Close().

Mais si le form est fermé par l'utilisateur avec "la croix" ou ALTF4..

En fait, c'etait ça mon problème, mais j'ai simplifié...

--
Jérémy

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Lloyd Dupont" a écrit :

oui y'a un piege qui n'est pas evident dans le monde managed, il y a des
truc non manage, c'est pour cela qu'il y a la methode Dispose() et une
fois
appeler la resource n'est plus utilisable (un peu comme si tu accedais
une
memoire que tu as free() en C, sauf que tu as une DisposedException() au
lieu de crash-pouf, memory corruption...)

les Form sont un exemple typique de ce genre resource, Close() appelle
Dispose() et la form n'est plus utilisable!

"Jérémy S." <outdial at anarchie dot net> wrote in message
news:4182f7f6$0$3680$
> Salut à tous;
>
> J'explique mon problème.
>
> Je développe une application qui contient deux Forms : mettons Form1
> et
> Form2.
>
> Sur Form1, j'ai un bouton1 qui appelle la méthode Form2.Show();
>
> Sur Form2, j'ai deux boutons :
> bouton2 qui appelle Hide(); et bouton3 qui appelle Close();
>
> Si je me sers que de Form1.bouton1 et de Form2.bouton2, ça ne fait que
> des
> Show/Hide, tout se passe bien.
>
> Mais si je me sers de Form2.button3, ça Close, et au prochain appel Ã
> Form2.Show(); le programme plante, car Form2 n'est plus référencée
> suite
> au Close() (je pense).
>
> Ma question est : y a t'il moyen de contourner cela ou est ce qu'il
> faut
> que je recrée une instance de Form2 ?
>
> Et si oui, y a t'il besoin de vider la mémoire de l'ancien Form2 d'une
> quelconque manière ?
>
> Je suis en train de migrer C -> C++ -> C# ...
>
> Merci de votre aide
>
> --
> Jérémy
>
>