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 généré par un parent


Sujet :

C#

  1. #1
    Membre averti Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 339
    Points
    339
    Par défaut Form généré par un parent
    Salut à tous
    je génère un form fProgressBar contenant une progressbar à partir d'un autre form fParent;
    tout se passe bien sauf que je ne peux pas cliquer sur la croix "close" de fProgressBar, car le formulaire ne me laisse pas la main dessus. Comment cela se fait-il ? Comment remédier à celà ?

    Merci
    Nico

  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 753
    Points
    39 753
    Par défaut
    Difficile de répondre avec les éléments que tu donnes... tu fais quoi dans cette form fProgressBar ? Tu exécutes un long traitement ? Est-ce que tu le fais dans un nouveau thread ou directement sur le thread de l'interface graphique ?

  3. #3
    Membre averti Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 339
    Points
    339
    Par défaut
    En fait, il s'agit de gestion de regles de messages;
    Dans mon code du form parent, j'ai ca (fProgressBar s'appelle en fait RulesApplyingStatus):

    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
    22
    23
    24
    25
    26
    27
     
            bool ProgressBarClosed = false;
            RulesApplyingStatus rulesStatus = null;
            void applyMailRulesToInbox(bool RestrictToNewMails)
            {
                ProgressBarClosed = false;
     
                rulesStatus = new RulesApplyingStatus();
                rulesStatus.FormClosed += new FormClosedEventHandler(rulesStatus_FormClosed);
                rulesStatus.Show();
     
               ..............................
              ..............................
              ..............................
     
     
               foreach (XmlNode ruleNode in RulesList)
               {
                         if (ProgressBarClosed)
                         {
                         MessageBox.Show("Mail rules proccessing has been interrupted.");
                         return;
              }
     
              ..............................
              ..............................
              ..............................
    et un peu plus lien (dans le code du meme form):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
              void rulesStatus_FormClosed(object sender, FormClosedEventArgs e)
              {
                        ProgressBarClosed = true;
              }

    j'espere que le code est suffisant et aidera à comprendre ce que je fais.

    Nico

  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 753
    Points
    39 753
    Par défaut
    OK, et donc je suppose que RulesApplyingStatus indique la progression du traitement que tu fais dans applyMailRulesToInbox ?

    Le problème est que tu effectues ce traitement dans le thread de l'interface graphique. Donc tant que applyMailRulesToInbox n'est pas terminé, ce thread est occupé et ne traite donc pas les messages Windows en attente, ce qui fait que l'interface ne réagit plus. C'est pour ça que tu ne peux pas fermer ta fenêtre...

    Il y a plusieurs possibilités pour régler le problème...

    - la plus simple (mais généralement pas recommandée) est d'appeler régulièrement Application.DoEvents pendant ton traitement, de façon à traiter les messages en attente. Mais ça peut causer des effets de bord indésirables...

    - exécuter le traitement dans un nouveau thread, de façon à ce que le thread de l'interface graphique ne soit pas bloqué. Par contre, seul le thread de l'interface graphique peut accéder directement aux contrôles, donc si tu as besoin d'y accéder (pour mettre à jour la ProgressBar par exemple) il faut utiliser la méthode Invoke

    - exécuter le traitement dans un BackgroundWorker. Ca revient un peu au même que de le faire explicitement dans un nouveau thread, mais ça fournit des mécanismes pratiques pour l'interaction avec l'interface graphique, par exemple l'indication de la progression et l'annulation du traitement. Typiquement, pour indiquer la progression, tu appelles la méthode ReportProgress du BGW dans ton traitement, et tu gères l'évènement ProgressChanged pour mettre à jour ta ProgressBar. Cet évènement est déclenché sur le thread de l'UI, donc pas de problème d'accès aux contrôles. Si tu veux annuler le traitement, dans l'évènement rulesStatus_FormClosed tu appelles la méthode CancelAsync du BGW ; dans le traitement tu vérifies la propriété CancellationPending dans ta boucle pour savoir si tu dois t'arrêter.


    Dans ton cas je pense que la dernière solution est la plus adaptée

  5. #5
    Membre averti Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par tomlev Voir le message
    - exécuter le traitement dans un BackgroundWorker. Ca revient un peu au même que de le faire explicitement dans un nouveau thread, mais ça fournit des mécanismes pratiques pour l'interaction avec l'interface graphique, par exemple l'indication de la progression et l'annulation du traitement. Typiquement, pour indiquer la progression, tu appelles la méthode ReportProgress du BGW dans ton traitement, et tu gères l'évènement ProgressChanged pour mettre à jour ta ProgressBar. Cet évènement est déclenché sur le thread de l'UI, donc pas de problème d'accès aux contrôles. Si tu veux annuler le traitement, dans l'évènement rulesStatus_FormClosed tu appelles la méthode CancelAsync du BGW ; dans le traitement tu vérifies la propriété CancellationPending dans ta boucle pour savoir si tu dois t'arrêter.


    Dans ton cas je pense que la dernière solution est la plus adaptée
    ca marche nickel, merci !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/05/2015, 12h18
  2. Mise en forme des fichiers générés par la macro
    Par soflab31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/03/2015, 12h11
  3. Réponses: 2
    Dernier message: 22/07/2014, 17h35
  4. Réponses: 9
    Dernier message: 10/06/2007, 21h43
  5. réduire l'espace interieur généré par les balises form
    Par psychoBob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/05/2006, 17h11

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