Erreur récurante de référence d'objet. [Résolu]

Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
- - Dernière réponse : whombat
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
- 31 oct. 2011 à 06:18
Bonjour à tous,

Je cherche depuis plus de 24h mais je sèche. Pour moi tout est bon mais le déboger me dit : 'La référence d'objet n'est pas définie à une instance d'un objet.' Je sais (à peu près) ce que ça veut dire mais là...

Voilà mon code, pas long pourtant :


        Dim Words() As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For

            'la ligne lue est du style string*string*string séparateur '*'
            Words = Split(FileString, "*")

            X = 1
            
            'Il bugue ici, au mot Word semble-t-il :
            For Each Word As String In Words
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
                X = X + 1
            Next Word

        Next



J'ai tenté d'indexer les Word (0), (1) et (2) mais j'ai la même erreur.
Si quelqu'un a une idée, je suis réellement preneur. D'avance merci.

Cordialement,

Whombat.
Afficher la suite 

Votre réponse

20/42 réponses

Meilleure réponse
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
3
Merci
Une fulgurance : en m'inspirant (en copiant lâchement) du code de mdevaux62 pour le début, je viens de coder à l'ancienne, ce bon vieux VB 1... :


        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 0
        For Each ligne As String In lignes
            Mot = ""
            For i = 1 To ligne.Length
                Ch = Mid(ligne, i, 1)
                If Ch = "*" Then
                    If Mot1 = "" Then
                        TabPaysLang(idLigne, 0) = Mot
                        Mot = ""
                    ElseIf Mot2 = "" Then
                        TabPaysLang(idLigne, 1) = Mot
                        Mot = ""
                    End If
                Else
                    Mot = Mot & Ch
                End If
                TabPaysLang(idLigne, 2) = Mot
            Next
            MessageBox.Show(Mot1 & "   " & Mot2 & "   " & Mot3)
            idLigne += 1
        Next



et ça fonctionne ! Preuve que ce n'est pas une variable coincée antérieurement, ou autre parasite. Mais d'où ça vient ? Mystère !
Je crois que je vais garder ça parce que je ne compte pas passer le week end à continuer à me prendre la tête. Un jour, peut-être, ayant mûri et grandi dans l'expérience, pour le fun je reviendrais taquiner ce snippet mais pour l'instant je vais en rester là.

Merci à tous ceux qui ont transpiré avec moi. Résoudre le pb avec l'oeuf de Colomb c'est vexant quand on apprend le Net, et VB 2010... Mais si il faut, il faut...

Merci encore à tous.

Cordialement,

Whombat.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de whombat
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Bonjour,

l'array obtenu par split n'est probablement pas de type string, mais variant (si comme sous VB6)
ligne à corriger, dans ce cas :
For Each Word As String In Words
Ou rien ou variant à la place de string.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Merci pour cette réponse rapide.

Je viens d'essayer et j'ai la même erreur. Code corrigé :


            For Each Word In Words
                                          'bugue ici :
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
            next



Cordialement,

Whombat.
Commenter la réponse de whombat
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Et cette nouvelle erreur est maintenant autre chose !
Elle est liée à l'existence (à ses dimensions, à son accessibilité et à son type), tu tableau dynamique TabPaysLang()
Qu'on ne voit pas dans ton code.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Mon tableau est une variable globale dans le module :
Public TabPaysLang(137, 3) as string

Cordialement,

Whombat.
Commenter la réponse de whombat
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Alors je ne vois plus !
1) Essaye d'utiliser autre chose que le mot Word (pour le cas où)
2) déclare ton tableau as Variant

Si ne fonctionne toujours pas : j'abdique en ce qui me concerne.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Et au passage (mais n'explique pas ton problème ! juste en passant) :
 For Each Word As String In Words
                If X 1 Then TabPaysLang(i, 1) Word
                If X 2 Then TabPaysLang(i, 2) Word
                If X 3 Then TabPaysLang(i, 3) Word
                X = X + 1
            Next Word

équivaut à :
For Each Word As String In Words
               TabPaysLang(i, X) = Word
            Next Word



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
pardon (une ligne supprimée en trop) :
For Each Word As String In Words
               TabPaysLang(i, X) = Word
               X = X + 1
 Next Word




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Rectification faite, au cas où :

Nouveau code :

         
        'J'ai changé Words en dWords et Word en dWord pour voir
        Dim dWords() As String

        'tableau déclaré dans la sub pour que ce soit + clair
        Dim TabLangPays(137, 3) As Object  

        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = Split(FileString, "*")

            X = 1
            For Each dWord In dWords
                                '
                                'toujours l'erreur ici :
                If X 1 Then TabPaysLang(i, 1) dWord
                If X 2 Then TabPaysLang(i, 2) dWord
                If X 3 Then TabPaysLang(i, 3) dWord
                X = X + 1
            Next dWord

        Next



C'est à ne plus rien y comprendre... Ca fait des heures et des heures que je suis dessus. Et ça me bloque. Si je dois passer autrement, c'est toute la philosophie du script qui est à reécrire car des fichiers comme ça à lire j'en ai un grand nombre ! Et bien sûr, à les constituer, cela m'a pris déjà de nombreux jours...

Y'a pas à faire, si VB bugue c'est qu'il y a quelque chose, mais où...

J'ai arrété le PC et relancé VB au cas où il 'serait fatigué'... Mais il a le bon oeil ... Il m'a trouvé (re-trouvé) tout de suite l'erreur.

Cordialement,

Whombat.
Commenter la réponse de whombat
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
6
0
Merci
J'ai un peu modifié ton code.
Je lis le fichier texte en ressource sans le copier.
J'extrait les lignes puis les mots :

        'Je charge toutes les lignes du fichier texte qui est en ressource (_VAR_PAYS_PL.txt)
        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 1
        For Each ligne As String In lignes
            'Pour chaque ligne, je sépare les mots
            Dim X As Integer = 1
            Dim words As String() = ligne.Split("*")
            For Each word As String In words
                'Les mots sont placés dans le tableau
                TabPaysLang(idLigne, X) = word
                'Mot suivant
                X += 1
            Next
            'Ligne suivante
            idLigne += 1
        Next
Commenter la réponse de mdevaux62
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
Salut

 Words = Split(FileString, "*")


en Net
split est une des méthodes de la class string

ex
dim words() as string
  dim   machaine as string
   machaine = "comment allez vous"
  words = machaine.split(" ")
Commenter la réponse de cs_ShayW
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Merci pour la réponse, ShayW.

J'ai bien peur que cela crée toujours la même erreur et au même endroit . Voilà le code corrigé :


        Dim TabPaysLang(137,3) as string
        Dim dWords() As String
        Dim dWord As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 1 To 137

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = FileString.Split("*")

            X = 1
            For Each dWord In dWords
                TabPaysLang(i, X) = dWord
                X = X + 1
            Next dWord

        Next i



N.B. J'ai essayé également de ne pas déclarer dWord as string au début mais au niveau du For (For Each dWord as string...) -> rien n'y fait !
Je n'arrive pas à comprendre mais il faut dire que j'ai un peu moins de 50 jours de pratique de VB 2010. Je suis court. Je n'ai pas la compétence nécessaire pour bien des parties de VB mais là, en l'occurrence, il me semble que c'est assez 'maternelle' pour que je m'aperçoive de l'erreur.

Ceci dit, je n'aurais pas trouvé le Split de Net, habitué à l'autre syntaxe. Certes, j'ai du la voir en passant mais comme mon esprit ne se posait pas la question, je n'avais pas retenu. Et donc merci pour cette piqûre de rappel.

Cordialement,

Whombat.

Prédire l'avenir est particulièrement aléatoire, 
surtout lorsqu'il s'agit du futur.
Commenter la réponse de whombat
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Je suis par ailleurs étonné de ce que l'on commence avec un X = 1 (que l'on incrémente ensuite)
Pour moi, l'array obtenu par le split commence à l'index 0 et non 1
et dans ce cas, incrémenter X avec each et en commençant par 1 ne peut que conduire au précipice.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
J'en conviens mais le tableau TabPaysLang, lui, commence à 1...

Whombat.
Commenter la réponse de whombat
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
Dim TabPaysLang(137,3) as string


varie de 0,0 à 137 3
donc on a length 138 * 4 552
index commence par 0 faire attention
Commenter la réponse de cs_ShayW
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Exact, bien vu, j'avais complètement oublié cette façon de compter. Pourtant Lasserre y revient au moins 10 fois...

Je vais contrôler si cela a une incidence et je reviens.

Cordialement,

Whombat.
Commenter la réponse de whombat
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
Même erreur... A devenir fou !

Nouveau code :


        Dim TabPaysLang(0 to 136,0 to 2) as string
        Dim dWords() As String
        Dim dWord As String
        Dim FileString As String = String.Empty
        Dim f As String = My.Application.Info.DirectoryPath & "\_VAR_PAYS_PL.txt"

        If File.Exists(f) Then
            System.IO.File.WriteAllText(f, My.Resources._VAR_PAYS_PL)
        Else
            MessageBox.Show("Fichier des Pays -> Langues impossible à trouver..." & vbCrLf & "Désolé...")
            Exit Sub
        End If

        Dim fr As New System.IO.StreamReader(CStr(f))
        Dim i%

        For i = 0 To 136

            FileString = fr.ReadLine
            If FileString = "" Then Exit For
            dWords = FileString.Split("*")

            X = 0
            For Each dWord In dWords
                TabPaysLang(i, X) = dWord
                X = X + 1
            Next dWord

        Next i




J'ai le sentiment que VB est possédé par un lutin qui s'amuse... On est bientôt à Halloween...

Cordialement,

Whombat.
Commenter la réponse de whombat
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
ce n'est pas ça
mais
For Each dWord In dWords
      TabPaysLang(i, X) = dWord
      X = X + 1
   Next dWord

dès que X dépasse 3 alors runtime error
Commenter la réponse de cs_ShayW
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Dernière intervention
17 novembre 2012
6
0
Merci
Testé et ça marche :
Maintenant tu en fais ce que tu en veux :

'Je charge toutes les lignes du fichier texte qui est en ressource (_VAR_PAYS_PL.txt)
        Dim lignes As String() = (My.Resources._VAR_PAYS_PL).Split(vbCrLf)
        Dim idLigne As Integer = 1 '0 serait plus judicieux , mais bon ...
        For Each ligne As String In lignes
            'Pour chaque ligne, je sépare les mots
            Dim X As Integer = 1   '0 serait plus judicieux , mais bon ...
            Dim words As String() = ligne.Split("*")
            For Each word As String In words
                'Les mots sont placés dans le tableau
                TabPaysLang(idLigne, X) = word
                'Mot suivant
                X += 1
            Next
            'Ligne suivante
            idLigne += 1
        Next
Commenter la réponse de mdevaux62
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Dernière intervention
19 novembre 2011
0
Merci
mdevaux62, j'aimerais te sauter au cou mais.... toujours la même erreur, au même endroit et dès le premier passage.

Voilà ce qu'il me met, lorsque je mets l'exception dans le presse-papier :



L'exception System.NullReferenceException n'a pas été gérée
Message=La référence d'objet n'est pas définie à une instance d'un objet.
Source=ASE
StackTrace:
à ASE.Options.ChargeTabPaysLang() dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 114
à ASE.Options.ChargeListLang(Int32 Sens) dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 211
à ASE.Options.Options_Load(Object sender, EventArgs e) dans D:\--- PROJETS\VB10\ASE\ASE\Options.vb:ligne 99
à System.Windows.Forms.Form.OnLoad(EventArgs e)
à System.Windows.Forms.Form.OnCreateControl()
à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
à System.Windows.Forms.Control.CreateControl()
à System.Windows.Forms.Control.WmShowWindow(Message& m)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
à System.Windows.Forms.Form.WmShowWindow(Message& m)
à System.Windows.Forms.Form.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
à System.Windows.Forms.Control.Show()
à ASE.Main.Main_Load(Object sender, EventArgs e) dans D:\--- PROJETS\VB10\ASE\ASE\Main.vb:ligne 82
à System.EventHandler.Invoke(Object sender, EventArgs e)
à System.Windows.Forms.Form.OnLoad(EventArgs e)
à System.Windows.Forms.Form.OnCreateControl()
à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
à System.Windows.Forms.Control.CreateControl()
à System.Windows.Forms.Control.WmShowWindow(Message& m)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
à System.Windows.Forms.Form.WmShowWindow(Message& m)
à System.Windows.Forms.Form.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
à System.Windows.Forms.Control.set_Visible(Boolean value)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
à ASE.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
InnerException:



Je ne sais pas lire (je n'y comprends encore pas assez) ce genre de littérature. Si vous pouvez y trouver qq chose.

N.B. J'ai mis des 0 à la place des 1 puisque, dans un message précédent, j'avais fait démarrer mon tableau à 0 et non pas à 1 (erreur et bétise personnelle) TabPaysLang(0 to 136, 0 to 2) as string

Mais si ça avait fonctionné, j'aurais bien aimé qu'on me dise pourquoi.

Cordialement,

Whombat.
Commenter la réponse de whombat

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.