olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 avril 2008
-
21 janv. 2005 à 19:05
olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 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.
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
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.
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 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