3 votes

Index confus hors limites dans une collection de formes

J'essaie de résoudre un problème d'incohérence dans un code VB NET qui utilise les bibliothèques MS Office Interop. En utilisant les mêmes fichiers et données, le code suivant lance cette exception :

L'index dans le sp
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, I
at System.Runtime.InteropServices.CustomMarshalers.EnumeratorVie
at myProject.TableNotePages(clsUsrDoc& usrdoc) in path \file.vb :l
...

La ligne 1454 est la ligne iShp += 1

Dim MyDoc As Word.Document = usrdoc.Document
Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
Dim iShp As Integer = 1
For Each shp As Word.Shape In MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes
    If Not shp.TextFrame.Next Is Nothing Then
        NoteBoxes.Add(iShp, shp.TextFrame)
        iShp += 1
    End If
Next

J'ai quelques questions qui pourraient m'aider à résoudre ce problème :

  1. Pourquoi cela ne se produit-il pas à chaque fois ?
  2. La méthode moveNext du cadre dans la trace est-elle appelée sur la dernière ligne non conditionnelle de la boucle au lieu des lignes "for each" ou "next" (l'ajout d'une autre ligne entre iShp += 1 et End If entraîne l'échec sur cette ligne) ?
  3. Y a-t-il quelque chose d'inhabituel dans les boucles foreach de VB (mon expertise est plutôt en C/Java) ou dans les collections interop qui ferait qu'il tenterait d'itérer au-delà de la fin de la collection de formes ?

Toute idée sur ce qui pourrait se passer ici est la bienvenue.

0voto

codemonk Points 93

Il semble que de temps en temps l'interop vb/word s'arrête arbitrairement à la fin de la collection de formes. Le code ci-dessous, qui remplace "for each" par "for x to y", a été exécuté avec succès un nombre statistiquement significatif de fois (environ 50) dans quelques environnements. Je sais que ce n'est pas une bonne réponse et qu'elle ne répond toujours pas à la question de savoir pourquoi cela se produit, mais elle résout le problème et je la poste donc comme réponse au cas où un exemple aiderait quelqu'un d'autre :

    Dim MyDoc As Word.Document = usrdoc.Document
    Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
    Dim iShp As Integer = 1
    Dim loopLength As Integer = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes.Count
    Dim shp As Word.Shape = Nothing
    For i As Integer = 1 To loopLength '1-indexed
        shp = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes(i)
        If Not shp.TextFrame.Next Is Nothing Then
            NoteBoxes.Add(iShp, shp.TextFrame)
            iShp += 1
        End If
    Next

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X