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 :

[vb.net]enregistrer une variable dans une lecture en boucle [erreur]


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 104
    Par défaut [vb.net]enregistrer une variable dans une lecture en boucle [erreur]
    Bonjour à tous,

    J'ai un fichier texte auquel je lis chaque ligne en boucle (la ligne s'enregistre dans une variable). je voudrais lire le fichier jusqu'à qu'il trouve des charactères contenu dans une 2nde variable (cette variable est remplie par une textbox).

    S'il trouve cette variable il arrete la recherche et enregistre la ligne du fichier test dans une tableau.

    Ensuite je récupère les informations de ce tableau dans des textboxs.

    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
     
        Sub charger()
     
            Dim tab() As String 
            Dim SR As StreamReader = File.OpenText("\My Documents\2008.txt")
            Dim AnalyseChaine As String
     
            CodePSV = Box_Code.Text 'La variable CodePSV pred la valeur de la textbox Box_Code
     
    'je lis mon fichier texte ligne par ligne
            Do
                FichierTexte = SR.ReadLine()
     
                'MsgBox(FichierTexte)
     
            Loop Until FichierTexte Is Nothing
     
    'On cherche dans la variable FichierTexte  le contenu de la variable du CodePSV
            AnalyseChaine = FichierTexte.IndexOf(CodePSV)
    'S'il trouve alors il met dans un tableau le  contenu de cette variable
            If AnalyseChaine >= 0 Then
     
                tab = FichierTexte.Split(";")
            End If
    Le problème c'est qu'il bloque dans l'analyse de la chaine ou dans la création du tableau (si j'enlève la partie analyse)
    Par contre si j'enregistre une ligne précise (la 1ère en gros...) il accepte de créer le tableau.
    Quel est mon problème?

    L'exception System.NullReferenceException n'a pas été gérée
    Message="NullReferenceException"
    StackTrace:
    at Tableau.Form1.charger()
    at Tableau.Form1.Form1_Load()
    at System.Windows.Forms.Form.OnLoad()
    at System.Windows.Forms.Form._SetVisibleNotify()
    at System.Windows.Forms.Control.set_Visible()
    at System.Windows.Forms.Application.Run()
    at Tableau.Form1.Main()

  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 : 43
    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
    Par défaut
    Ben forcément...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop Until FichierTexte Is Nothing
    Donc quand tu sors de ta boucle, FichierTexte est une référence nulle ! Soit dit en passant, à chaque passage dans ta boucle, tu écrases la valeur précédente de la variable...
    Tu pourrais faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Do
                uneLigne = SR.ReadLine()
                If Not uneLigne Is Nothing Then FichierTexte = FichierTexte + uneLigne
            Loop Until uneLigne Is Nothing
    Mais il y a 10 fois plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            FichierTexte = SR.ReadToEnd()
    Et là ça devrait aller mieux

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 104
    Par défaut
    Que j'efface la variable c'est pas grave car en fait je n'ai besoin que de la ligne qui contient la variable du code recherchée.
    Si je recherche un autre code il recommencera une nouvelle recherche et la précédente ne nous interessera plus.
    Si je veux la retrouver j'aurais juste a rechercher à nouveau cette variable.

    Le problème du ReadTOEnd (ce que je faisais au début) c'est qu'il me lit TOUT mon fichier texte (logique ) par consequant quand je crée mon tableau il me le gere à la suite.

    ex: si j'ai un fichier:

    L1C1;L1C2;L1C3;
    L2C1;L2C2;L2C3;
    Il me fera un tableau

    L1C1
    L1C2
    L1C3
    L2C1
    L2C2
    L2C3
    et donc quand je recherche une variable il ne sait pas lire les informations liée à celle ci...

    Je sais que je débute et je sais pas si j'ai opté pour la bonne solution, mais l'avantage, quand je lis une ligne en boucle, c'est qu'il selectionne seulement la ligne dans laquelle il trouve ma valeur (mon code) et il affiche donc toutes les autres infos de la ligne.

    En revanche j'ai toujours le même problème... j'arrive a afficher les infos de la ligne complète si je trouve au moins une des valeurs (cad L1C1,L1C2 ou L1C3) il affichera les 2 autres s'il trouve rien il indique que le code n'existe pas. mais quand j'essaye de lire les ligne en boucle il persiste a me dire "NullReferenceException"

  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 : 43
    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
    Par défaut
    Comme je te l'ai dit, ta boucle Do... Loop continue jusqu'à ce que FichierTexte soit null (Nothing). Donc si tu essaies d'accéder à une propriété ou méthode de cette variable après la sortie de la boucle, tu es sûr d'avoir une NullReferenceException.
    Pourquoi tu ne fais pas la recherche (IndexOf) dans la boucle ? Comme ça tu chercherais dans chaque ligne du fichier, au lieu de chercher dans rien du tout... (vu que FichierTexte vaut Nothing au moment où tu fais ton IndexOf).

    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
     
        Sub charger()
     
            Dim tab() As String 
            Dim SR As StreamReader = File.OpenText("\My Documents\2008.txt")
            Dim AnalyseChaine As String
     
            CodePSV = Box_Code.Text 'La variable CodePSV pred la valeur de la textbox Box_Code
     
    'je lis mon fichier texte ligne par ligne
            Do
                FichierTexte = SR.ReadLine()
     
                'MsgBox(FichierTexte)
     
    'On cherche dans la variable FichierTexte  le contenu de la variable du CodePSV
                    AnalyseChaine = FichierTexte.IndexOf(CodePSV)
                    'S'il trouve alors il met dans un tableau le  contenu de cette variable
                    If AnalyseChaine >= 0 Then
     
                        tab = FichierTexte.Split(";")
                        Exit Do ' On a trouvé, plus la peine de continuer à chercher
                    End If
            Loop Until FichierTexte Is Nothing

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 104
    Par défaut
    tout d'abord merci de tes réponse,

    mais je galère encore

    2008.txt

    L1C1;L1C2;L1c3;
    L2C1;L2C2;L2C3;
    L3C1;L3C2;L3C3;
    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
    Public Class Form1
     
        Sub charger()
     
            Dim tab() As String
            Dim SR As StreamReader = File.OpenText("\My Documents\2008.txt")
            Dim AnalyseChaine As String
            Dim UneLigne As String
            Dim CodePSV As String
            Dim VerifPSV As String = 0
     
            'La variable CodePSV prend la variable de la textbox "Box_Code"
            CodePSV = Box_Code.Text
     
            'On lit le fichier jusqu'à trouver la fin
            Do
                ' La variable UneLigne prend la valeur d'une ligne du fichier texte
                UneLigne = SR.ReadLine()
                'on recherche le codePSV dans la ligne lue
                AnalyseChaine = UneLigne.IndexOf(CodePSV)
                'si la valeur est trouvée on découpe les informations de la ligne ds un tableau
                If AnalyseChaine >= 0 Then tab = UneLigne.Split(";") Else VerifPSV = 1
                'Plus besoin de chercher car on a trouvé
                Exit Do
            Loop Until UneLigne Is Nothing
     
            'S'il trouve le code ds la ligne
            If VerifPSV = 1 Then
     
                MsgBox("Ce point PSV n'existe pas")
                'Il initialise les textbox
                TextBox1.Text = ""
                TextBox2.Text = ""
                TextBox3.Text = ""
     
            End If
            'S'il trouve le code ds la ligne
            If VerifPSV = 0 Then
                'Il affiche les données du tableau dans des textboxs
                TextBox1.Text = tab(0)
                TextBox2.Text = tab(1)
                TextBox3.Text = tab(2)
                ' TextBox4.Text = tab(3)
                'TextBox5.Text = tab(4)
                ' TextBox6.Text = tab(5)
     
            End If
            Box_De_Test.Text = UneLigne
     
        End Sub
     
        Private Sub Button_charger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_charger.Click
            charger()
        End Sub
    Voilà mon code "propre" en faisant comme tu me le dis je n'ai plus l'erreur mais ca ne marche pas non plus.

    Il s'arrete à la première ligne...

    En gros si je cherche une valeur situé ds la première ligne "tout va bien" mais si je cherche une valeur de la 2conde ligne "tout va mal" ... il l'a trouve pas...

    Quand je cherche L2C2 par exemple la variable UneLigne garde la valeur de la première ligne en fait...

    j'essaye de bouger mon code dans tous les sens mais si j'arrive a faire une étape ya quelque chose qui cloche dans la seconde

    j'arrive jamais a avoir ce que je souhaite

  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 : 43
    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
    Par défaut
    C'est parce que tu ne remets pas à 0 ta variable VerifPSV quand tu trouves une valeur qui va bien. Une fois que tu as rencontré une ligne qui ne contient pas ce que tu cherches, elle passe à 1 et elle y reste... il vaudrait mieux faire le contraire : elle est à 0 au départ, et passe à 1 si tu trouves.
    Ah oui, et aussi le Exit Do n'est pas dans un If, donc ça va forcément sortir de la boucle dès la première itération...

    Voilà comment tu devrais faire à mon avis (j'ai déclaré VerifPSV comme Boolean, c'est plus adapté) :

    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
     
        Sub charger()
     
            Dim tab() As String
            Dim SR As StreamReader = File.OpenText("\My Documents\2008.txt")
            Dim AnalyseChaine As String
            Dim UneLigne As String
            Dim CodePSV As String
            Dim VerifPSV As Boolean = False
     
            'La variable CodePSV prend la variable de la textbox "Box_Code"
            CodePSV = Box_Code.Text
     
            'On lit le fichier jusqu'à trouver la fin
            Do
                ' La variable UneLigne prend la valeur d'une ligne du fichier texte
                UneLigne = SR.ReadLine()
                'on recherche le codePSV dans la ligne lue
                AnalyseChaine = UneLigne.IndexOf(CodePSV)
                'si la valeur est trouvée on découpe les informations de la ligne ds un tableau
                If AnalyseChaine >= 0 Then
                    VerifPSV = True
                    tab = UneLigne.Split(";")
                    'Plus besoin de chercher car on a trouvé
                    Exit Do
                EndIf
            Loop Until UneLigne Is Nothing
     
            'S'il trouve le code ds la ligne
            If Not VerifPSV Then
     
                MsgBox("Ce point PSV n'existe pas")
                'Il initialise les textbox
                TextBox1.Text = ""
                TextBox2.Text = ""
                TextBox3.Text = ""
     
            Else 'S'il trouve le code ds la ligne
                'Il affiche les données du tableau dans des textboxs
                TextBox1.Text = tab(0)
                TextBox2.Text = tab(1)
                TextBox3.Text = tab(2)
                ' TextBox4.Text = tab(3)
                'TextBox5.Text = tab(4)
                ' TextBox6.Text = tab(5)
     
            End If
            Box_De_Test.Text = UneLigne
     
        End Sub

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

Discussions similaires

  1. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  2. [ADO.NET] Récupérer le résultat d'une requête dans une variable
    Par developppez dans le forum Accès aux données
    Réponses: 2
    Dernier message: 14/03/2009, 21h34
  3. enregistrer le résultat d'une requête dans une variable
    Par veriecherie dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/07/2008, 14h17
  4. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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