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 :

Problème de boucle while [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème de boucle while
    Bonjour à tous,

    Je tiens à préciser que je suis totalement novice autour de la programmation en C#
    et je n'arrive pas à comprendre pourquoi un

    fait en sorte que ma boucle while fonctionne

    Mon programme permet de rechercher un mot dans un fichier txt et d'écrire la ligne associé. Si le mot existe plusieurs fois il devrait écrire la première ligne puis quand l'ulisateur clic sur suivant m'écrire la deuxième ligne etc...
    Le soucis étant que tant qu'il y a ce pop up (MessageBox) la boucle fonctionne mais le bouton suivant se fait court circuiter; et dès qu'il n'y est plus, impossible d'avoir les autres lignes Le programme réaffiche toujours la première ligne.

    Alors j'ai pensé à mettre une pause "attente d'un clic" mais toutes mes tentatives ont échoué pour que cela fonctionne.

    Mes questions sont donc:
    _Comment ce fait il qu'un MessageBox fasse réagir ma boucle comme ça ?
    _Auriez vous une piste pour que je puisse réalisé une "pause" afin d'attendre que l'utilisateur clic sur suivant ou reface une recherche ?

    Metallode689

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Afin que nous puissions t'aider, pourrais-tu nous fournir le code C# de ta fameuse boucle s'il te plait?

  3. #3
    Invité
    Invité(e)
    Par défaut
    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
    while ((ligne = fichier1.ReadLine()) != null && counter <= 1000)
    {
         Match mat = Regex.Match(ligne, conver1, RegexOptions.IgnoreCase);
         If (mat.Success)
         {
             if (counter <= 1000)
             { 
                   Solution.Text = ligne;
                   MessageBox.Show("X");
                   t++;
              }
              else
              {
                   MessageBox.Show("erreur", exMessage);
              }
              counter++;
          }
          if ((mat.Success == false) && t == 0)
          {
              MessageBox.Show("Default introuvable bla bla bla");
              counter++;
          }
    }
    Ici la recherche fonctionne bien avec un afreux pop up qui apparait pour chaque ligne et court circuite par la même occasion la possibilité de pouvoir cliqué sur suivant
    le counter sera ensuite remplacé par une variable plus tard

  4. #4
    Invité
    Invité(e)
    Par défaut
    Dans ton code, je ne vois aucune interaction avec le bouton "suivant" que tu mentionnes... S'il n'y a pas d'interaction dans cette boucle avec le bouton "suivant", je ne vois pas comment ce que tu veux faire est réalisable.

    As-tu le reste du code de ton formulaire, et en particulier le code du Handler du bouton "suivant'?

  5. #5
    Invité
    Invité(e)
    Par défaut
    effectivement c'est parce que je n'ai pas trouvé le moyen de rajouter cette intéraction comme mentionné dans mon premier post

    il faudrait que ce while puisse se mettre en "pause" après un premier élément trouvé et que l'utilisateur puis reprendre la continuité de la boucle en cliquant sur suivant mais je n'ai pas trouvé comment réaliser cela.

  6. #6
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    effectivement c'est parce que je n'ai pas trouvé le moyen de rajouter cette intéraction comme mentionné dans mon premier post

    il faudrait que ce while puisse se mettre en "pause" après un premier élément trouvé et que l'utilisateur puis reprendre la continuité de la boucle en cliquant sur suivant mais je n'ai pas trouvé comment réaliser cela.

    Dans ce cas il faudrait que tu lises d'un coup ton fichier , que tu reprenne ton code mais en lisant dans un tableau ou une liste de string.

    Ensuite des que tu trouves quelque chose, la boucle se stop ,et tu reprends la recherche a l'aide d'un bouton.

    En gardant sa valeur , ta variable qui compte reprendra la ou la recherche s'est arrêtée.

  7. #7
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Le fichier que tu lis est-il volumineux ? Car si la boucle while s’éternise , il est normal que cela t'affiche la première ligne car l'interface est "freeze", et un MessageBox.Show() permet une attente ,la boucle continue uniquement si tu fermes la boite de dialogue.C'est pour cela que ça fonctionne quand t'en mets une.

    Essaye de donner le code complet qui concerne ce morceau de code.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PixelJuice Voir le message
    Le fichier que tu lis est-il volumineux ? Car si la boucle while s’éternise , il est normal que cela t'affiche la première ligne car l'interface est "freeze", et un MessageBox.Show() permet une attente ,la boucle continue uniquement si tu fermes la boite de dialogue.C'est pour cela que ça fonctionne quand t'en mets une.

    Essaye de donner le code complet qui concerne ce morceau de code.
    il n'est pas si volumineux que ça la boucle while ne s'éternise pas je dirais que lorsqu'il m'affiche la premiere ligne contenant le mot de recherche mon programme sort de sa boucle.

    je veux bien passer une plus grande partie du code mais il va falloir que je le tape (c'est compliqué je ne peux pas faire autrement ^^).

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    je dirais que lorsqu'il m'affiche la premiere ligne contenant le mot de recherche mon programme sort de sa boucle.
    Oui, c'est exactement ça qui se passe : toutes tes occurrences ont déjà été parcourues lorsque l'utilisateur peut cliquer sur le bouton "Suivant". C'est la raison pour laquelle un "MessageBox" arrête la boucle là où elle était.
    Il y a plusieurs solutions pour résoudre ce problème, comme par exemple :
    - Mettre une nouvelle fenêtre modale qui va arriver à chaque fois que l'un des mots est trouvé.
    - Parcourir tout et mettre les occurrences dans une liste, comme suggéré par pixeljuice
    - Ne pas faire de boucle mais retenir l'état du "match" actuel de la regex, et le faire avancer à chaque fois que l'utilisateur clique sur "suivant".

    Citation Envoyé par metallode689 Voir le message
    je veux bien passer une plus grande partie du code mais il va falloir que je le tape (c'est compliqué je ne peux pas faire autrement ^^).
    Ah bon? Tu n'as pas la possibilité de faire un "copié/collé" depuis ton poste?

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 35
    Par défaut
    Salut,

    effectivement un peu plus de code nous éclairerait car sur cette portion de code je ne vois pas ce qui cloche.
    Ton explication n'est pas super clair, mais selon ce que tu as dit j'aurais fait ça:

    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
           string ligne;
                string result;
                int counter=0;
                int t=0;
                string conver1="test";
                System.IO.StreamReader fichier1 = new System.IO.StreamReader(@"C:\test.txt");
                while ((ligne = fichier1.ReadLine()) != null && counter <= 1000)
                {
                    Match mat = Regex.Match(ligne, conver1, RegexOptions.IgnoreCase);
                     if (mat.Success)
                     {
                         t++;
                         result = ligne;
                         MessageBox.Show("Ligne : " +counter+ "\n\n Contenu :" + result + "\n\n" +t+"e occurence", "Recherche du mot : "+conver1 );
                     }
                counter++;
                }
                if ( t == 0)
                {
                    MessageBox.Show("Default introuvable bla bla bla");
                    counter++;
                }

    L: 10 : Retrait de ton 'if(counter<=1000)' (et donc du 'else' aussi), puisque c'est déjà une condition pour continuer ton while.
    J'ai sorti ton 'counter++' du if, comme ça il sert à compter les lignes. (Je ne voyais pas trop l'utilité de ce dernier dans le if, étant donné que tu as déjà ton 't' pour compte le nombre de mots trouvés.

    L:18: J'ai sorti le if ((mat.Success == false) && t == 0) de la boucle puisque sinon le fil d’exécution passe dedans tant qu'il n'a pas trouvé de mots, je ne vois pas l'intérêt.


    Mais alors: que veux-tu mettre à la place de ton messageBox ?


    Arnaud DS

  11. #11
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Par défaut
    Bonjour,

    Je suis débutante également et mon code est sale, mais pour répondre à :

    Mon programme permet de rechercher un mot dans un fichier txt et d'écrire la ligne associé. Si le mot existe plusieurs fois il devrait écrire la première ligne puis quand l'ulisateur clic sur suivant m'écrire la deuxième ligne etc...
    j'aurais fais ça :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.IO;
     
    namespace Recherche {
    	public partial class Form1 : Form {
     
    		List<String> listedFile = new List<string>();
    		int lastLine = 0;
     
    		public Form1() {
    			InitializeComponent();
    		}
     
    		private void bt_file_Click(object sender, EventArgs e) {
    			Stream myStream = null;
    			listedFile.Clear();
    			lastLine = 0;
    			if ( opfile.ShowDialog() == DialogResult.OK ) {
    				try {
    					if ( ( myStream = opfile.OpenFile() ) != null ) {
    						using ( myStream ) {
    							tb_file.Text = opfile.FileName;
    							StreamReader sReader = new StreamReader(tb_file.Text);
    							string line;
    							while ( ( line = sReader.ReadLine() ) != null ) {
    								listedFile.Add(line);
    							}
    							sReader.Close();
    						}
    					}
    				}
    				catch ( Exception ex ) {
    					MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    				}
    			}
    		}
     
    		private void bt_search_Click(object sender, EventArgs e) {
    			searchNext();
    		}
     
    		private void bt_next_Click(object sender, EventArgs e) {
    			searchNext();
    		}
     
    		public void searchNext() {
    			if ( tb_word.Text != "" ) {
    				for ( int i = lastLine; i < listedFile.Count; i++ ) {
    					if ( listedFile[i].ToLower().Contains(tb_word.Text.ToLower()) ) {
    						tb_find.Text = listedFile[i];
    						lastLine++;
    						break;
    					}
    					lastLine++;
    				}
    			}
    		}
    	}
    }
    en sachant que les variable qui commencent par "tb" sont des textbox, celles qui commencent par "bt" sont des boutons, et que "opfile" est un control "openFileDialog" (que j'utilise d'ailleurs pour la première fois) et qui a comme attributs :
    .Filter = txt files (*.txt)|*.txt|All files (*.*)|*.*
    .InitialDirectory = c:\\

    Enjoy

  12. #12
    Invité
    Invité(e)
    Par défaut
    j'ai donc fini par faire une boucle for (car en C# le for c'est trop fort xD) j'avais juste zapé que dans les conditions du for on pouvait mettre une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i = c; i = 50; i++)
    le c pouvait donc être une variable ce qui à résolu tout mon problème de recherche merci pour toutes vos pistes.

    j'ai un légé souci lorsqu'il sort de la boucle il m'indique une erreur du type "ne peut pas être null" et là le programme plante :/ mais le problème de base est donc résolu

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

Discussions similaires

  1. Problème du boucle while en PHP
    Par kimpak dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2011, 13h28
  2. Problème de boucle while dans un popup
    Par drogba72 dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2009, 14h19
  3. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  4. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

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