gnomish
Messages postés3Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention12 décembre 2013 30 janv. 2010 à 00:47
Cela date un peu, mais tout à fait ce que je cherchais, cependant en version unicode il me retourne un caractère en moins en fin de fichier. En traçant le programme, je crois que la fonction TrimRNullW enlève un vbNull de trop à droite, et devrait s'écrire TrimRNullW = Left$(sString, InStr(sString, vbNullChar & vbNullChar))
Du coup certains tests sont faux dans DirPlusW, car ils ajoutaient le vbNull enlevé selon qu'il s'agissait d'un répertoire ou fichier...
.FileOrFolder = .FileOrFolder & vbNullChar & "" & vbNullChar
et plus loin
sTempPath = sTempPath & vbNullChar & "" & vbNullChar
Les deux tests deviennent ainsi inutiles, il suffit de ne laisser qu'une ligne et d'enlever le vbNullChar avant le "" pour avoir :
If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' c'est un dossier
.FileOrFolder = .FileOrFolder & "" & vbNullChar
.IsDirectory = True
End If
et plus loin
If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' extraction nom dossier en évitant les "." et ".."
sTempPath = TrimRNullW(tWFD.cFileName)
If IsValidDirPlusW(sTempPath) Then
' récursivité, mais on peut très bien avoir un dossier vide
sTempPath = sTempPath & "" & vbNullChar
Et pour IsValidDirPlusW il faudrait plutôt écrire :
IsValidDirPlusW = ((sString <> StrConv(".", vbUnicode))) And (sString <> StrConv("..", vbUnicode))
(enfin, en utilisant des constantes ce serait mieux pour éviter les appels de StrConv à chaque fois)
En faisant cela, tout rentre dans l'ordre et unicode ou pas la classe marche à merveille (je n'ai pas testé le module).
Sans quoi je trouve le code très utile car il permet de se passer des composants.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 18 juil. 2008 à 19:17
FM20.dll (composants Form2.0) permet d'afficher les caractères unicode
aucun intérêt d'utiliser une DirListBox puisque le but est de ne pas passer par des composants
aucun intérêt d'utiliser le DIR classique puisqu'il ne traite pas l'unicode
aucun intérêt de tester la rapidité d'une boucle sans filtre puisque ce n'est pas le but de la source.
donc rien de constructif, fausses infos, faux tests.
tu vois, même en te laissant un droit de réponse (et donc de rester), tu ne sais pas en profiter utilement FMAPI....
tanpis, y'a des cas comme çà où la raison ne l'emportera jamais
VBtoTRASH
Messages postés59Date d'inscriptionvendredi 18 juillet 2008StatutMembreDernière intervention31 mars 2011 18 juil. 2008 à 18:59
Non, la dll manquante est FM20.dll ... pas FMAPI.dll!
Cà existe cette dll ?
Et je ne vois pas ce que ce BOUC EMISSAIRE vient faire ici!
Bon!
Pour accélérer ta recherche, tu crées une classe de recherche avec 1 seul paramétrage possible, tu ouvres sur ta feuille une Collection, et tu lances ta collection de recherche. C'est très rapide!
Dans la classe, tu place une routine récursive SIMPLE avec le DIR classique, planifié avec une DirListBox.
Rapidité : 5 secondes pour trouver 10000 fichiers d'un disque dur de 1/2 To via USB2.0.
Avec SATI ... je pense, moins d'une seconde.
A toi de voir : Beau ou efficace, à toi de voir
cs_titicar
Messages postés181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 août 2012 18 juil. 2008 à 18:26
Bah! Pour le skin, on aime ou pas, on retient ou non quelques lignes de prog. De toute façon, elle est indépendante de la fonction concernée.
Perso, ce skin est un petit 'plus'.
VBtoTRASH : Pour quelqu'un qui vient de s'inscrire aujourd'hui même, tu n'es pas très constructif dans tes propos. Tu me laisses sur ma faim car tu n'as pas donné de solution (constructive).
Au fait, n'oublie pas qu'ici, on parle de VB.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 18 juil. 2008 à 16:23
titicar -> merci pour ton comm. je vais tout de même revoir le code (un peu plus tard) pour qu'il soit un peu plus rapide
VBtoTRASH -> pour l'interface je me demande aussi...
pour le reste, j'vais te laisser te trouver un autre bouc émissaire FMAPI...
VBtoTRASH
Messages postés59Date d'inscriptionvendredi 18 juillet 2008StatutMembreDernière intervention31 mars 2011 18 juil. 2008 à 15:56
Pourquoi faire compliqué (API,Skin ...) quand on peut faire beaucoup plus simple et surtout efficace.
Pas de paramétrage ... plante à tous vents ... source sans intérêt ... dll manquante ... la liste est longue.
A mettre dans le récipient du dessus!
cs_titicar
Messages postés181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 août 2012 17 juil. 2008 à 19:21
Merci PCPT,ça marche tout simplement très bien.
Ta source est nettement plus pratique et plus rapide comparé à ce que j'utilise actuellement.
Je n'ai pas essayé le projet 'module'. Les class, c'est tout de même plus flexible.
Par curiosité, dans la prop. Filters, j'ai essayé :
- "r*.dll" -> Ca marche nickel
- "re*.mp3" -> Ca m'affiche tout ce qui commence par 're', mais aussi ce qui commence par 'r.e'
- "r.e*.mp3" -> Ca marche nickel
Je suppose que c'est FindFirstFileA qui gère ça ainsi.
Sinon, c'est courageux de s'attaquer à l'UNICODE sous VB6 car c'est vraiment pas évident pour l'affichage.
Je note 10 car je n'ai pas vu mieux.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 13 juil. 2008 à 18:38
Maj à la demande de Kenji => les fonctions sont maintenant ASCII ou Unicode
paramètre pour le module, propriété pour la classe
pas mal de tests et çà a été moins évident que je ne le pensais mais çà a l'air d'être bon
(enfin j'espère ^^)
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 8 juil. 2008 à 22:57
Aller, une petite remarque, désolé, je devient un peu maniaque la dessus (à force de bosser sur des système en jap) : ca gère pas l'unicode. Si j'ai un dossier qui contient des caractère en unicode, il n'est pas traité.
Sinon, très bonne source. Ca m'évitera de refaire un module de listing à chaque fois.
Bon coding.
__
Kenji
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 8 juil. 2008 à 18:05
maj, voir détails histo 08 juillet 2008 18:03:20
toutes tes demandes sont faites ;)
(m'étais aussi gouré dans les dates description + un pavé de code en commentaire)
++ ;)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 8 juil. 2008 à 16:50
Salut Mortalino,
merci pour ton comm et note ;)
1/ RECT -> ohohoh ouai c'est facile :D
ce vieux usercontrol fait à l'arrache^^. ok c'est supprimé mais c'est drôle, je n'avais jamais essayé le "examiner le code source" directement sur le VBP, astuce pratique merci :p
2/ ok je regarde çà en propriété
3/ va pour un tooltip (je pensais pourtant que 2 lignes suffisaient. çà reste néanmoins que de l'interface tout çà ;))
4/ 260&
oui c'est surtout conventionnel.
en fait MAX_PATH attend un long (puisque déclarée en long)
MsgBox VarType(260) ' => vbInteger
tandis que
MsgBox VarType(260&) ' => vbLong
c'est d'ailleurs la même chose en hexa avec '&H104' et '&H104&'
donc on donne juste ce que la variable attend ;)
je modifie tout çà au plus vite ;)
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 8 juil. 2008 à 16:27
salut PCPT,
sympa cette source, peut être très utile ;)
Pas grand chose à dire concernant ton code (pas assez avancé pour me permettre), cependant (et oui, il y a toujours un 'mais') :
1/ (facile :D) type RECT pas utilisé (merci MZ-tools)
2/ J'aurais bien aimé avoir indépendamment une propriété Filter (pour la classe). Cela serait plus facile pour réutiliser ta class.
3/ Si le nom du dossier + fichier est long, il n'apparait pas entièrement dans le Lbl_Path, ni dans le LB_Result. TooltipText ? (ou autre)
Pour comprendre, un moment j'ai vu que pour l'attribution de valeurs à tes constantes (valeurs décimales), tu mettais le '&'. Y'a t-il une raison particulière ? (ou c'est une façon conventionnelle d'attribuer une valeur comme ceci)
ex : [Private Const MAX_PATH As Long = 260&]
A part ça, code excellent (bien codé et bien commenté), et je trouve que la recherche se fait très rapidement, bien qu'apparemment ce n'était pas le but :)
30 janv. 2010 à 00:47
Du coup certains tests sont faux dans DirPlusW, car ils ajoutaient le vbNull enlevé selon qu'il s'agissait d'un répertoire ou fichier...
.FileOrFolder = .FileOrFolder & vbNullChar & "" & vbNullChar
et plus loin
sTempPath = sTempPath & vbNullChar & "" & vbNullChar
Les deux tests deviennent ainsi inutiles, il suffit de ne laisser qu'une ligne et d'enlever le vbNullChar avant le "" pour avoir :
If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' c'est un dossier
.FileOrFolder = .FileOrFolder & "" & vbNullChar
.IsDirectory = True
End If
et plus loin
If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' extraction nom dossier en évitant les "." et ".."
sTempPath = TrimRNullW(tWFD.cFileName)
If IsValidDirPlusW(sTempPath) Then
' récursivité, mais on peut très bien avoir un dossier vide
sTempPath = sTempPath & "" & vbNullChar
Et pour IsValidDirPlusW il faudrait plutôt écrire :
IsValidDirPlusW = ((sString <> StrConv(".", vbUnicode))) And (sString <> StrConv("..", vbUnicode))
(enfin, en utilisant des constantes ce serait mieux pour éviter les appels de StrConv à chaque fois)
En faisant cela, tout rentre dans l'ordre et unicode ou pas la classe marche à merveille (je n'ai pas testé le module).
Sans quoi je trouve le code très utile car il permet de se passer des composants.
18 juil. 2008 à 19:17
aucun intérêt d'utiliser une DirListBox puisque le but est de ne pas passer par des composants
aucun intérêt d'utiliser le DIR classique puisqu'il ne traite pas l'unicode
aucun intérêt de tester la rapidité d'une boucle sans filtre puisque ce n'est pas le but de la source.
donc rien de constructif, fausses infos, faux tests.
tu vois, même en te laissant un droit de réponse (et donc de rester), tu ne sais pas en profiter utilement FMAPI....
tanpis, y'a des cas comme çà où la raison ne l'emportera jamais
18 juil. 2008 à 18:59
Cà existe cette dll ?
Et je ne vois pas ce que ce BOUC EMISSAIRE vient faire ici!
Bon!
Pour accélérer ta recherche, tu crées une classe de recherche avec 1 seul paramétrage possible, tu ouvres sur ta feuille une Collection, et tu lances ta collection de recherche. C'est très rapide!
Dans la classe, tu place une routine récursive SIMPLE avec le DIR classique, planifié avec une DirListBox.
Rapidité : 5 secondes pour trouver 10000 fichiers d'un disque dur de 1/2 To via USB2.0.
Avec SATI ... je pense, moins d'une seconde.
A toi de voir : Beau ou efficace, à toi de voir
18 juil. 2008 à 18:26
Perso, ce skin est un petit 'plus'.
VBtoTRASH : Pour quelqu'un qui vient de s'inscrire aujourd'hui même, tu n'es pas très constructif dans tes propos. Tu me laisses sur ma faim car tu n'as pas donné de solution (constructive).
Au fait, n'oublie pas qu'ici, on parle de VB.
18 juil. 2008 à 16:23
VBtoTRASH -> pour l'interface je me demande aussi...
pour le reste, j'vais te laisser te trouver un autre bouc émissaire FMAPI...
18 juil. 2008 à 15:56
Pas de paramétrage ... plante à tous vents ... source sans intérêt ... dll manquante ... la liste est longue.
A mettre dans le récipient du dessus!
17 juil. 2008 à 19:21
Ta source est nettement plus pratique et plus rapide comparé à ce que j'utilise actuellement.
Je n'ai pas essayé le projet 'module'. Les class, c'est tout de même plus flexible.
Par curiosité, dans la prop. Filters, j'ai essayé :
- "r*.dll" -> Ca marche nickel
- "re*.mp3" -> Ca m'affiche tout ce qui commence par 're', mais aussi ce qui commence par 'r.e'
- "r.e*.mp3" -> Ca marche nickel
Je suppose que c'est FindFirstFileA qui gère ça ainsi.
Sinon, c'est courageux de s'attaquer à l'UNICODE sous VB6 car c'est vraiment pas évident pour l'affichage.
Je note 10 car je n'ai pas vu mieux.
13 juil. 2008 à 18:38
paramètre pour le module, propriété pour la classe
pas mal de tests et çà a été moins évident que je ne le pensais mais çà a l'air d'être bon
(enfin j'espère ^^)
8 juil. 2008 à 22:57
8 juil. 2008 à 22:15
Sinon, très bonne source. Ca m'évitera de refaire un module de listing à chaque fois.
Bon coding.
__
Kenji
8 juil. 2008 à 18:05
toutes tes demandes sont faites ;)
(m'étais aussi gouré dans les dates description + un pavé de code en commentaire)
++ ;)
8 juil. 2008 à 16:50
merci pour ton comm et note ;)
1/ RECT -> ohohoh ouai c'est facile :D
ce vieux usercontrol fait à l'arrache^^. ok c'est supprimé mais c'est drôle, je n'avais jamais essayé le "examiner le code source" directement sur le VBP, astuce pratique merci :p
2/ ok je regarde çà en propriété
3/ va pour un tooltip (je pensais pourtant que 2 lignes suffisaient. çà reste néanmoins que de l'interface tout çà ;))
4/ 260&
oui c'est surtout conventionnel.
en fait MAX_PATH attend un long (puisque déclarée en long)
MsgBox VarType(260) ' => vbInteger
tandis que
MsgBox VarType(260&) ' => vbLong
c'est d'ailleurs la même chose en hexa avec '&H104' et '&H104&'
donc on donne juste ce que la variable attend ;)
je modifie tout çà au plus vite ;)
8 juil. 2008 à 16:27
sympa cette source, peut être très utile ;)
Pas grand chose à dire concernant ton code (pas assez avancé pour me permettre), cependant (et oui, il y a toujours un 'mais') :
1/ (facile :D) type RECT pas utilisé (merci MZ-tools)
2/ J'aurais bien aimé avoir indépendamment une propriété Filter (pour la classe). Cela serait plus facile pour réutiliser ta class.
3/ Si le nom du dossier + fichier est long, il n'apparait pas entièrement dans le Lbl_Path, ni dans le LB_Result. TooltipText ? (ou autre)
Pour comprendre, un moment j'ai vu que pour l'attribution de valeurs à tes constantes (valeurs décimales), tu mettais le '&'. Y'a t-il une raison particulière ? (ou c'est une façon conventionnelle d'attribuer une valeur comme ceci)
ex : [Private Const MAX_PATH As Long = 260&]
A part ça, code excellent (bien codé et bien commenté), et je trouve que la recherche se fait très rapidement, bien qu'apparemment ce n'était pas le but :)
Bonne continuation
@++