Problème dans une boucle avec un selected ?

olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008 - 21 janv. 2005 à 19:05
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008 - 21 janv. 2005 à 22:02
Voilà j'ai créé un code qui me permet de copier dans un repertoire les photos selectionné dans une ListeBox.
Ce code commence par comparer les éléments selectionnés dans ma ListeBox source (File1) avec ceux d'une autre ListeBox (File2) visant le repertoire destinations de mes photos, puis demande a changer de nom si il y a des doublons puis fait une copie du fichier si il y n'y a pas de boublons.

Le problème est que lorsque je selectionne plusieurs photos (propriété multi select activé), le test : If File1.Selected(i) = True fonctionne mal.

En fait lorsque qu'il passe sur le 1er élément sélectionné (disons i=5) tous ce passe bien, il continu le code est fait la copie, mais quand il arrive au 2ème élément selectionné (disons i=8) il plante.

Je m'arrache les cheveux sur ce code depuis des heures, il va bientôt plus beaucoup m'en rester.

Voila mon code :

Private Sub cmd_ajout_Click()


Dim chemin_fichier As String
Dim i, f As Integer
Dim new_nom As String

File2.Refresh

For i = 0 To File1.ListCount - 1

If File1.Selected(i) = True Then 'Test si l'élement i est sélectionné

chemin_fichier = Dir1.Path & "" & File1.List(i)
new_nom = File1.List(i)
choix:
For f = 0 To File2.ListCount - 1


If File2.List(f) = new_nom Then 'on test si ce nom existe deja
new_nom = InputBox("Attention le fichier " & "'" & new_nom & "'" & " correspond a une photo déjà présente dans ce thème !" & vbNewLine & "Veuillez entrer un nouveau nom :", "Choix du nom de la photo")
new_nom = new_nom & ".jpg"
GoTo choix 'on repare en choix pour tester si le nouveau nom existe
End If

Next f

'on copie le fichier
FileCopy chemin_fichier, App.Path & "\multimedia\images" & patient & "" & theme & "" & new_nom
File1.Refresh

End If

Next i

End Sub

J'espère que vous aurez une idée.
Merci d'avance.

5 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
21 janv. 2005 à 19:33
Salut
2 problèmes :
-1- Les DirListBox se refraichissent seules, donc, si tu ajoutes un fichier dans ton répertoire et qu'une de tes DirListBox pointe dessus, le nombre de fichiers va changer.
Dans une boucle For-Next, la limite (To File2.ListCount - 1) n'est pas recalculée à chaque cycle.
Donc, il se peut que tu pointe vers un fichier qui n'y est plus ou que tu en oublie.
Utilise plutôt un Do-Loop avec un compteur

-2- Tu ressors de ta 2ème boucle For-Next avec un Goto
Comme VB6 est bête, il va bien sûr recommencer une nouvelle boucle, mais il va empiler les boucles. D'une part, il y a risque de saturation de la pile du processeur, et d'autre part, ça va perturber ta prog.
Là aussi, vaudrait mieux utiliser une boucle Do-Loop avec un compteur

Pour sortir d'une boucle For-Next, utilise 'Exit For' (idem pour Do-Loop avec 'Exit Do')
Je te propose cette modif pour la 2eme boucle :
            Dim Memo As Boolean
choix:
            Memo = False
            For f = 0 To File2.ListCount - 1


                If File2.List(f) = new_nom Then           'on test  si ce nom existe deja
                    new_nom = InputBox("Attention le fichier " & "'" & new_nom & "'" & " correspond a une photo déjà présente dans ce thème  !" & vbNewLine & "Veuillez entrer un nouveau nom :", "Choix du nom de la photo")
                    new_nom = new_nom & ".jpg"
                    Memo = True ' mémorise qu'on a besoin de recommencer
                    Exit For
                End If
            
            Next f
            If Memo Then GoTo choix


Vala
Jack
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
21 janv. 2005 à 20:07
Merci jack je vais regarder ca !

Juste pour précisé je me suis mal exprimé quand j'arrive sur mon 2ème élément sélectionné le : " If File1.Selected(i) = True " plante pas, mais renvoie une valeur false, donc l'éléments n'est pas détecter ce qui explique que je n'arrive pas a copier plusieurs photos.
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
21 janv. 2005 à 20:33
Donc si j'ai bien compris tu veux que j'utilise le code :

[code]
Dim Memo As Boolean

File2.Refresh

For i = 0 To File1.ListCount - 1

If File1.Selected(i) = True Then

chemin_fichier = Dir1.Path & "" & File1.List(i)
new_nom = File1.List(i)

choix:
Memo = False
For f = 0 To File2.ListCount - 1

If File2.List(f) = new_nom Then 'on test si ce nom existe deja
new_nom = InputBox("Attention le fichier " & "'" & new_nom & "'" & " correspond a une photo déjà présente dans ce thème !" & vbNewLine & "Veuillez entrer un nouveau nom :", "Choix du nom de la photo")
new_nom = new_nom & ".jpg"
Memo = True ' mémorise qu'on a besoin de recommencer
Exit For
End If

Next f
If Memo Then GoTo choix

FileCopy chemin_fichier, App.Path & "\multimedia\images" & patient & "" & theme & "" & new_nom
File1.Refresh

End If

Next i
[\code]

Si c'est bien cela, c'est fait j'ai tester, mais malheureusement le résultat est le même.

Mais je ne pense pas que mon problème viene de là.
C'est apparement vraiment sur la propriété selected qui beugue il ne la detecte qu'une seul fois a true, j'ai mis des points d'arret pour verifier cela.

Olivier !
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 4
21 janv. 2005 à 21:49
Salut,
dis moi pourquoi un File1.Refresh aprés ton copy ça ne veindrai pas de là par hazard ?
Private Sub cmd_ajout_Click()
Dim chemin_fichier As String
Dim i, f As Integer
Dim new_nom As String

File2.Refresh

For i = 0 To File1.ListCount - 1

If File1.Selected(i) = True Then 'Test si l'élement i est sélectionné

chemin_fichier = Dir1.Path & "" & File1.List(i)
new_nom = File1.List(i)
choix:
For f = 0 To File2.ListCount - 1


If File2.List(f) = new_nom Then 'on test si ce nom existe deja
new_nom = InputBox("Attention le fichier " & "'" & new_nom & "'" & " correspond a une photo déjà présente dans ce thème !" & vbNewLine & "Veuillez entrer un nouveau nom :", "Choix du nom de la photo")
new_nom = new_nom & ".jpg"
GoTo choix 'on repare en choix pour tester si le nouveau nom existe
End If

Next f

'on copie le fichier
FileCopy chemin_fichier, App.Path & "\multimedia\images" & patient & "" & theme & "" & new_nom
File1.Refresh

End If

Next i

End Sub

____________________________________________________

Cordialement, Jean-Paul

Le Savoir n'a de valeur que s'il est partagé
0

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

Posez votre question
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
21 janv. 2005 à 22:02
Et bien honetement je ne sais pas, je ne sais plus pourquoi je l'ai mis, il y avait peut etre raison mais bon....

En tout cas bien vu, car ca venait bien de là.

Merci beaucoup ! j'aurais pu chercher lgt.

olivier
0