IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Réouverture d'une form après sa fermeture


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 18
    Points
    18
    Par défaut [C#] Réouverture d'une form après sa fermeture
    Bonjour,

    J'ai une form1 qui en lance une deuxième (form2).
    J'aimerais lorsque form2 se ferme qu'elle puisse se recharger elle même ou que form1 puisse la recharger.

    Je sais que sous VB il y a un event onClose qui pourrait m'être utile dans ce cas la.

    Le but est à la fois de réinitialiser mes composants et de forcer la destruction de toutes mes instance de classes appelées.

    Quelqu'un voit une solution ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu ne peux pas rouvrir une form qui a été fermée, il faut la recréer (avec New)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Oui j'ai vu ça.
    J'ai réussi à faire ce que je voulais avec

    maForm.Close()
    et à partir d'une autre classe
    maForm.ShowDialog()

    Je ne suis pas encore sur qu'après le Close les destructeurs d'objets sont appelés.

    PS :les destructeurs ne sont pas appelés, je vais essayer avec des threads

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par pagugu Voir le message
    PS :les destructeurs ne sont pas appelés, je vais essayer avec des threads
    Mais de quoi tu parles ?

    Le destructeur (finaliseur) d'un objet est appelé quand le garbage collector le ramasse, ce qui n'arrivera pas tant que tu conserves une référence sur l'objet. Mais de toutes façons, je ne vois pas pourquoi tu te préoccupes du destructeur, ça n'a rien à voir avec le fait que tu ne puisses pas réouvrir la form...

    Quand tu fermes la Form, ça libère le handle Win32 de la fenêtre (HWND). Pour réouvrir la fenêtre, il faut la recréer, parce que du point de vue de Windows, elle n'existe plus.

    Et je ne vois vraiment pas ce que les threads viennent faire là dedans

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Le but est à la fois de réinitialiser mes composants et de forcer la destruction de toutes mes instance de classes appelées.
    J'espérais que la destruction de la form entrainerais une destruction de toutes les instances qu'elle appelait.
    Je pensais aussi que lorsque le thread se termine, les objets qu'il a créé étaient supprimés.

    Comment peut on faire pour supprimer ces références ?
    J'ai regardé des posts sur la destruction des instances, apparemment on ne peut pas vraiment.

    PS : du coup ça n'a plus rien à voir avec l'interface.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par pagugu Voir le message
    J'espérais que la destruction de la form entrainerais une destruction de toutes les instances qu'elle appelait.
    Pas forcément... quand tu n'auras plus de référence sur la form, elle pourra être ramassée par le garbage collector, et les objets qui sont référencés uniquement par la form seront aussi ramassés. Mais on ne peut pas prévoir à quel moment le GC passera, à moins de l'appeler explicitement (ce qui est déconseillé). Bref, si un objet utilise des ressources non managées (mémoire non managée, handle Win32, connexion à une DB, etc), il faut libérer explicitement ces ressources en appelant Dispose sur l'objet (qui est supposé implémenter IDisposable).

    Quand tu fermes une Form, ça appelle Dispose et ça libère les ressources non managées de la form. Mais les objets eux-mêmes ne sont pas forcément ramassés tout de suite par le GC, il peuvent rester encore un peu en mémoire (ce qui normalement n'est pas un problème)

    Citation Envoyé par pagugu Voir le message
    Je pensais aussi que lorsque le thread se termine, les objets qu'il a créé étaient supprimés.
    Non, ce n'est pas lié au thread. Heureusement d'ailleurs, sinon on ne pourrait jamais utiliser un objet créé par un autre thread...

    Citation Envoyé par pagugu Voir le message
    Comment peut on faire pour supprimer ces références ?
    Je ne sais pas trop ce que tu entends par "supprimer une référence"... tu veux dire "supprimer le lien entre une variable et l'objet pointé par cette variable" ? Dans ce cas il suffit de mettre cette variable à null, et s'il ne reste pas d'autres références vers cet objet, il sera ramassé par le GC à un moment ou un autre. Par contre, si tu veux libérer tout de suite les ressources non managées utilisées par l'objet, appelle explicitement Dispose

    Citation Envoyé par pagugu Voir le message
    J'ai regardé des posts sur la destruction des instances, apparemment on ne peut pas vraiment.
    La "destruction" de l'objet, ça peut vouloir dire deux choses :
    - la libération des ressources non managées : il suffit d'appeler Dispose
    - la suppression de l'objet en mémoire : c'est le GC qui s'en charge automatiquement, et qui appelle le destructeur de l'objet (s'il existe).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Ok !
    J'ai commencé à créer des fonctions qui jouaient le rôle de destructeur (initialisation à null de mes buffers et instances etc...), je vais me renseigner sur Dispose.
    Merci bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/02/2011, 21h41
  2. [AC-2007] conserver une valeur après la fermeture du formulaire la contenant
    Par glougloup dans le forum VBA Access
    Réponses: 4
    Dernier message: 24/06/2010, 16h58
  3. [PPT-2007] Changement de couleur d'une forme après un clic
    Par 33_nico dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 09/02/2010, 23h24
  4. Réponses: 10
    Dernier message: 29/09/2009, 15h20
  5. modifier une forme apres un login
    Par fourquet dans le forum Delphi
    Réponses: 1
    Dernier message: 14/12/2006, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo