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

C# Discussion :

Form qui apparaît ou disparaît aléatoirement


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut Form qui apparaît ou disparaît aléatoirement
    Salut !


    Logiquement, si je déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void Form1_Load(object sender, EventArgs e)
            {            
                ...
                this.Hide();
            }

    la form devrait devenir invisible (enfin, se cacher quoi), non ? Pourtant, chez moi, elle apparaît alétoirement !
    Comment ça se fait ? C'est un bug de Windows 7 x64 ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Je dirai que tu n'es pas cencé avoir un comportement aléatoire à ce niveau là SI c'est le thread principale qui a appellé Show() ou ShowDialog() de cette form.

    As tu essayé en ne mettant rien d'autre que ton Hide dans cette methode?

    fais tu un show ou showdialog? et si tu fais un show() est ce que derriere tu n'as pas des instructions qui risquent de réafficher ta form?

    As tu un seul ou plusieurs threads qui tournent?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    Je dirai que tu n'es pas cencé avoir un comportement aléatoire à ce niveau là SI c'est le thread principale qui a appellé Show() ou ShowDialog() de cette form.

    As tu essayé en ne mettant rien d'autre que ton Hide dans cette methode?

    fais tu un show ou showdialog? et si tu fais un show() est ce que derriere tu n'as pas des instructions qui risquent de réafficher ta form?

    As tu un seul ou plusieurs threads qui tournent?
    - En ne mettant rien d'autre que le Hide, ça ne change rien...
    - Je ne fais pas de Show ou ShowDialog étant donné que c'est la fenêtre principale du prog; c'est sur elle qu'il démarre.
    - Un seul Thread (enfin je pense puisque je n'en ai pas créé moi-même).


  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    ok alors...

    dans ton Main

    plutot que faire ApplicationRun(new Form());
    tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form _form = new form();
    _form.MesPetitesPrepas(monparam1,monparam2,etc);
    Application.Run(_form);
    Et oublie le Hide dans le LoadForm

    si vraiment tu veux que ta form n'apparraisse pas, dans les propriété de celle ci, tu lui met : WindowState à Minimized ainsi se lancera minimisée

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    ok alors...

    dans ton Main

    plutot que faire ApplicationRun(new Form());
    tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form _form = new form();
    _form.MesPetitesPrepas(monparam1,monparam2,etc);
    Application.Run(_form);
    Et oublie le Hide dans le LoadForm
    Euuuh.... J'ai pas tout suivi là ....
    Pourquoi me conseilles-tu de procéder ainsi ?
    Faut savoir aussi que la form ne sera pas toujours cachée hein; c'est juste au démarrage qu'elle doit l'être.

    Sinon, comment expliquer que ça se passe aléatoirement ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    J'ai fais un petit edit entre temps

    Citation Envoyé par giova_fr Voir le message
    ok alors...

    si vraiment tu veux que ta form n'apparraisse pas, dans les propriété de celle ci, tu lui met : WindowState à Minimized ainsi se lancera minimisée
    Pour ce qui est du phénomene aléatoire, je ne sais pas, mais devinne, que :
    comme ta form est créée par Application.Run, sa pompe à message est en train d'etre construite. this.Hide envoi un message windows pour demander à cacher la fenetre. Peut etre que des fois la pompe à message est prete à recevoir ce message, peut etre que d'autres fois non.

    Quoi qu'il en soit placer un Hide dans la callback LoadForm n'a pas trop de sens. Car le Framework nous dit : "je vais afficher la fenetre" et nous on lui dit "mais non je me suis trompé finallement, je ne veux pas afficher la fenetre cache là". Est alors ajouté à la pompe à message, l'ordre Hide, puis on sort de LoadForm, puis le framework affiche la form, puis lorsque la pompe tombe sur hide, celle ci cache la fenetre.

    Mieux faut lui dire : "Lorsque tu affichera la fenetre, fais le en la mettant en status minimisé"

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    Mieux faut lui dire : "Lorsque tu affichera la fenetre, fais le en la mettant en status minimisé"
    Tu as parfaitement raison !

    Merci !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    En fait, c'est pas encore tout à fait résolu...

    Mon appli, j'aime bien qu'elle soit réduite sous forme d'icone dans la barre des taches (près de l'horloge). De manière à ce que l'utilisateur clique dessus pour la "réanimer".
    Ca, je l'ai mis en place et ça marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                this.Show();
                WindowState = FormWindowState.Normal;
            }
     
    private void Form1_Resize(object sender, EventArgs e)
            {
                if (this.WindowState == FormWindowState.Minimized)
                {
                    this.Hide();
                }
            }
     
    private void quitterToolStripMenuItem_Click(object sender, EventArgs e)
            {
                this.Dispose();
            }

    Seulement, maintenant, avec la proposition de Giova_fr, l'appli est minimisée et plus iconifiée dans la barre des taches au démarrage (pour le reste du temps, c'est bon; juste au démarrage que ça coince).

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    "dans la barre des tache pres de l'horloge" c'est en lui ajoutant un System.Windows.Forms.NotifyIcon et en donnant un icone à la propriété Icon de ce dernier (egalement mettre sa propriété Visible à true)

    Dans la barre des tache, là où il y a la liste des applis lancées, c'est si la propriété de ta form : ShowInTaskBar est à true.

  10. #10
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Si dans ton formulaire tu ne fais rien de particulier pendant que ton programme se trouve dans le systray (près de l'horloge), tu pourrais procéder ainsi par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    static void Main()
    {
        using (NotifyIcon nf = new NotifyIcon())
        {
            nf.Icon = Resources.MonIcon;
            nf.Text = "MonApplication";
            nf.DoubleClick += new EventHandler(nf_DoubleClick);
            nf.Visible = true;
            Application.Run();
        }
    }
     
    static void nf_DoubleClick(object sender, EventArgs e)
    {
        using (Form1 frm = new Form1())
            frm.ShowDialog();
    }
    Ca évitera ton problème du départ et ça permet aussi de charger le formulaire uniquement quand on en a besoin

    Pascal

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Approche interressante
    Par contre tel que c'est là, il ne faut pas oublier de placer un Application.Exit() quelque part, sinon le soft ne quittera jamais non?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par _PascalC_ Voir le message
    Si dans ton formulaire tu ne fais rien de particulier pendant que ton programme se trouve dans le systray (près de l'horloge), tu pourrais procéder ainsi par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    static void Main()
    {
        using (NotifyIcon nf = new NotifyIcon())
        {
            nf.Icon = Resources.MonIcon;
            nf.Text = "MonApplication";
            nf.DoubleClick += new EventHandler(nf_DoubleClick);
            nf.Visible = true;
            Application.Run();
        }
    }
     
    static void nf_DoubleClick(object sender, EventArgs e)
    {
        using (Form1 frm = new Form1())
            frm.ShowDialog();
    }
    Ca évitera ton problème du départ et ça permet aussi de charger le formulaire uniquement quand on en a besoin

    Pascal
    J'imagine que c'est à écrire dans program.cs en remplacement de ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication4
    {
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

  13. #13
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    Effectivement pour quitter l'application il faudra appeler à un moment donner Application.Exit(). Par le biais d'un bouton "Quitter" sur le formulaire, d'un menu sur l’icône dans le systay.. etc, bref à chacun de choisir la solution qui lui semble la meilleure.

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Pascal t'avait déjà ecrit par quoi il faut remplacer ton main.
    Apres à toi d'analyser et comprendre ce qu'il s'y passe

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    Pascal t'avait déjà ecrit par quoi il faut remplacer ton main.
    Apres à toi d'analyser et comprendre ce qu'il s'y passe
    Bon ben quand je remplace mon main par celui préconisé; il ne se passe rien... Le programme se lance et puis plus rien !

  16. #16
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    J'ai fais le test et chez moi c'est OK (Win7).
    Le programme se lance puis s'arrête aussitôt ? Tu n'as pas d'icône dans le systray ? Sur un Windows récent il est peut être "caché" et accessible en cliquant sur la petite flèche près de l'horloge qui pointe vers le haut.

    Pascal

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par _PascalC_ Voir le message
    J'ai fais le test et chez moi c'est OK (Win7).
    Le programme se lance puis s'arrête aussitôt ? Tu n'as pas d'icône dans le systray ? Sur un Windows récent il est peut être "caché" et accessible en cliquant sur la petite flèche près de l'horloge qui pointe vers le haut.

    Pascal
    J'ai Win 7 aussi; non, y'a rien comme icône ...

  18. #18
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    ahhhh les joies de l'informatique
    Je sais pas si j'ai été clair avec mon histoire de flèche près de l'horloge. Une capture d'écran si ça peut aider :



    Dans mon exemple j'ai été au plus court, j'ai viré l'attribut [STAThread] sur la méthode Main() et les 2 appels suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Normalement pour l'exemple, ça n'a pas d'importance.

    Pascal

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Avec ton code, effectivement, l'application démarre et s'iconifie directement dans le systray !


    Seulement :

    - La boîte de dialogue (messagebox) qui s'ouvrait au départ n'apparaît plus automatiquement... Il faut double-cliquer sur l'icône...
    - Le programme continue à aléatoirement disparaître dans la barre des taches (ou sous forme d'icone dans ton cas).

    Et là, je pige pas ce qui cloche ...

  20. #20
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    La boîte de dialogue (messagebox) qui s'ouvrait au départ n'apparaît plus automatiquement.
    De quel MessageBox parles-tu ? Sauf erreur je crois pas que tu en ais parlé avant. Tel que mon exemple est présenté il est de toute façon normal qu'aucune boite de dialogue ou formulaire apparaisse au démarrage.


    Le programme continue à aléatoirement disparaître
    Dans mon exemple, le this.Hide() dans le Form_Load ne sert plus à rien. Peut-être que tu l'as laissé ?
    Eventuellement passe un Zip du projet si tu ne trouve vraiment pas...

    Pascal

Discussions similaires

  1. Mise en forme qui disparaît à la réouverture du fichier
    Par AFO_Liege dans le forum Conception
    Réponses: 0
    Dernier message: 30/01/2012, 10h13
  2. [KSH] Message qui apparaît et disparaît
    Par Rithy666 dans le forum Linux
    Réponses: 10
    Dernier message: 10/05/2010, 21h33
  3. texte qui apparaît/disparaît au clic
    Par marion5515 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 06/06/2008, 09h57
  4. [html] code qui apparaît souvent
    Par francis m dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 02/06/2005, 00h16
  5. [VB.NET] Authentification Form qui rate.
    Par Abalalojik dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/01/2005, 13h09

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