Erreur 10 - Array verouillé

Résolu
vxn772 Messages postés 29 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 3 mars 2009 - 6 août 2008 à 11:59
vxn772 Messages postés 29 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 3 mars 2009 - 6 août 2008 à 16:34
Bonjour tout le monde !

J'ai un problème avec un array qui ne veut plus se laisser redimensionner ! C'est très bizarre, ou du moins, je n'ai jamais eu de problèmes avec des arrays, alors que je travaille beaucoup avec.

La fonction :

Private Function LoadFolders(URL As String) As Long

Directory.Path = URL
ReDim Folder2(0 To Directory.ListCount - 1)
For i = 0 To Directory.ListCount - 1
Folder2(i) = Directory.List(i)
Next i

LoadFolders = UBound(Folder2)
End Function

Déclaration de Folder2 :
Private Folder2() As String


Directory est un composant dir. Le tout se passe dans un usercontrol.

Quand j'exécute le code, la première fois que je fais appel à la fonction, tout marche normalement, mais la seconde fois, il m'affiche :
Erreur 10 : Ce tableau est fixe ou temporairement verrouillé !

J'ai regardé sur MSDN, il n'y a rien.

Qu'est-ce que je pourrais faire contre ? Merci d'avance !!

VB6 C'est++ mieux !

6 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 15:57
remplace
Private Function LoadFolders(URL As String) As Long

par
Private Function LoadFolders(BYVAL URL As String) As Long

çà correpond à ce que la MDSN indiquait, tu as lu?
tu ne peux pas passer un argument de tableau vers une procédure qui va modifier la dimension du tableau en question
en passant par BYVAL, tu utilises la VALeur et non plus la REFérénce (donc le pointeur)

option explicit, beh oui se faire ch*** ^^, et surtout éviter des erreurs un peu bêtes et souvent difficiles alors à retracer

ps : vu, merci
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
3
pile_poil Messages postés 682 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 août 2012 6
6 août 2008 à 12:41
bonjour
plutot que :
ReDim Folder2(0 To Directory.ListCount - 1)

ne devrait il pas être :
ReDim Folder2( Directory.ListCount - 1)

?
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
0
vxn772 Messages postés 29 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 3 mars 2009
6 août 2008 à 12:50
Non, ça ne fait aucune différence.
Le 0 est en fait la limite inférieure du tableau. Ne rien mettre revient exactement à la même chose que de mettre 0.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 14:57
salut,

vu que ton i n'est pas déclaré, j'en déduis que tu n'as pas commencé le code par OPTION EXPLICIT
il y a peut-être une autre erreur ailleurs...

autre possibilité, il y a déjà un REDIM dans la procédure qui appelle la fonction LoadFolders
tu ne peux pas redimentionner "à la suite" dans ce contexte (enfin plus ou moins)

MSDN :
<hr size="2" width="100%" />
<li>Vous avez tenté de redimensionner un tableau dynamique de niveau module,
dans lequel un élément a été passé sous forme d'
<object id="alink_6" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_6.Click() argument] à une procédure. Par exemple,
dans le code suivant,
ModArray
est un tableau dynamique de niveau
module dont le quarante-cinquième élément est passé
<object id="alink_7" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_7.Click() par référence] à la procédure
Test
 :
Dim ModArray () As Integer    ' Crée un tableau
' dynamique de niveau
' module.
. . .

Sub AliasError()
ReDim ModArray (1 To 73) As Integer
Test ModArray (45)    ' Passe un élément 
' du tableau de niveau
' module à la procédure
' Test.
End Sub

Sub Test(SomeInt As Integer)
ReDim ModArray (1 To 40) As Integer  ' Une erreur
' se produit ici.
End Sub


Il n'est pas nécessaire de passer un élément du tableau de niveau
module dans ce cas, puisqu'il est visible à l'intérieur de toutes les procédures
du module. Cependant, si un élément est passé, le tableau est verrouillé pour
empêcher une désaffectation de mémoire pour le
<object id="alink_8" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_8.Click() paramètre] de référence à l'intérieur de la
procédure, ce qui entraînerait un comportement imprévisible lors du retour de la
procédure.

</li><hr size="2" width="100%" />

nb : attention à bien vérifier ton directory.listcount avant ton redim...
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vxn772 Messages postés 29 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 3 mars 2009
6 août 2008 à 15:39
Non, normalement il n'y a pas d'autre Redim dans tout le module.
La fonction est appelée directement dans un event de type click :

Private Sub imgRow2_Click(Index As Integer)
If Index > LenFolder2 Then Exit Sub
LenFolder1 = LenFolder2
CopyArray Folder2(), Folder1()
LenFolder2 = LoadFolders(Folder2(Index))
DrawRow1 CLng(Index)
DrawRow2 0
End Sub

Ne t'occupe pas des fonction Draw..., c'est juste des appel GDI.
LonFolder2 est une variable privée, de type long, déclarée au début du module.

La fonction CopyArray :
Private Function CopyArray(Arr1() As String, Arr2() As String)
ReDim Arr2(LBound(Arr1) To UBound(Arr1))
For i = LBound(Arr1) To UBound(Arr1)
    Arr2(i) = Arr1(i)
Next i
End Function

Mais y priori, il y a juste l'array Arr2 (ici Folder1) qui est redimensionné...

Sinon, ça sert à quoi de mettre Option Explicit, à part de devoir se faire ch... à déclarer les variables à chaque fois que l'on veut faire une boucle ?

VB6 C'est++ mieux !

P.S.: J'ai répondu à ton sondage.
0
vxn772 Messages postés 29 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 3 mars 2009
6 août 2008 à 16:34
Houla ! Désolé, j'avais pas compris...
Mais c'est parfait, ça marche maintenant ! Merci beaucoup !
Et j'ai rajouter le option explicit dans mon module !
VB6 C'est++ mieux !
0
Rejoignez-nous