crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 2006
-
3 août 2004 à 23:49
user_steph
Messages postés1Date d'inscriptionjeudi 13 janvier 2005StatutMembreDernière intervention13 janvier 2005
-
13 janv. 2005 à 15:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
user_steph
Messages postés1Date d'inscriptionjeudi 13 janvier 2005StatutMembreDernière intervention13 janvier 2005 13 janv. 2005 à 15:12
Serait il possible d'avoir un petit example d'utilisation de la fonction GetKeysCollection :
Appel de la fonction, utilisation de l'objet collection en retour d'appel???
Merci d'avance...
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 4 août 2004 à 21:13
Hélas, ces apis on des limites... donc je crois que je vais carrément créer mon propre système ini en vb. Je vais essayer d'optimiser ça le plus possible donc cette source est discontinuée...
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 4 août 2004 à 13:06
un pti zip serait le bienvenue pour moi parceke g essayé ce code et g un appel de procedure incorrect ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 août 2004 à 09:48
pour le GetKeysCollection , je verrai bien une fonction qui ferait une énumération (Streaming)..... la totalité du fichier INI ne se retrouverais pas ainsi en mémoire
du genre :
ResetEnum '# Mise a 0 des variables qui indexent la position dans le fichier INI
While GetKeysCollection ( Nom , Val )
'# Traitement sur les entrées renvoyées....
Wend
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 août 2004 à 09:46
Ok avec vlad2i sur ces remarques judicieuses....
Il vaut mieux tester la longueur d'une chaine pour savoir si elle est vide. De plus, utiliser lenB plutot que len... ca fais une division en moins ;-)
vlad2i
Messages postés285Date d'inscriptionmercredi 20 août 2003StatutMembreDernière intervention13 février 2005 4 août 2004 à 09:37
Je reprends les remarques en continuant...
1. Effectivement un String est plus adapté, surtout que VB n'a pas a faire de conversion de type à ta place, ton programme gagne en rapidité, et tu pourras te vanter d'avoir un code propre...
2. J'ajouterais meme qu'utiliser une Collection n'est pas plus adapté, ca crée toute une instance pour ce qui pourrait etre, une fois de plus, un tableau de String...
3. Utiliser ByVal pour un String est absolument inutile, étant donné qu'un pointeur String fait 10 octet, et que le texte à copier fait forcément + (10octets+texte), autant utiliser ByRef, sinon avec de gros textes ton programme sera très très ralenti....
4. De même, l'utilisation de Empty, qui ne représente rien... Tu aurai pu mettre à la place de
If Trim(Col(I))=Empty Then
un bon
If LenB(Trim$(Col(I))) = 0 Then
Propre, plus rapide, et n'utilise pas de variants :)
Voilà de quoi bien optimiser :)
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 4 août 2004 à 09:00
Dim Col() as String
Col = Split(strBuf, vbNullChar)
... fonctionne tres bien sans variant !!
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 4 août 2004 à 00:42
il y a un 2 qui dit que je split en 2 au max pi je préfère utiliser col(i) plûtot que d'avoir à passer par un variable string temporaire. Le seul problème, c'est la stupide limite de string car elle ne prend que le variant mais elle est dans les dll de vb donc, plus rapide qu'une fonction que j'écrirais moi-même. Pour éviter d'avoir à utiliser split pour séparer le nom de la clée et de la valeur, j'aurais pu faire appel à
lngpos=instr(1,col(i),"=")
if lndpos <> 0 then
strnom=left$(col(i),lngpos-1)
strval=mid$(col(i),lngpos)
end if
mais ça aurait été encore plus lourd...
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 4 août 2004 à 00:35
Un bon vieux tableau de string aurait fait l'affaire, tu ne crois pas ?
En plus tu trouves pas que "Col2 = Split(col(I), "=", 2)" c'est un petit peu violent !! D'autant plus que si tu as une valeur contenant un ou plusieurs signe "=", ce qui n'est pas impossible, et bien tu va rater la fin de la valeur !!!
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 4 août 2004 à 00:12
Je n'utilise que 2 Variants : Col et Col2, dans la procédure GetKeysCollection car c'est uniquement ce type que supporte Split, qui simplifie le splittage de string.
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 3 août 2004 à 23:57
Je n'utilise JAMAIS le VARIANT sauf pour SPLIT CAR VARIANT EST DE LA SCRAP!!. Je n'utilise que String. Pour la gestion d'erreur, c'est un peu inutile dans certains cas mais je vais voir ce que je peux faire car quand on veut lire une clée, il a une valeur par défaut donc pas d'erreur...
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 3 août 2004 à 23:49
C'est pas mal comme code, mais éviote les variants !! Tu en as collé un peu partout et ca, c'est pas bien !! - Je sais, c'est une manie chez moi, je chasse les variant (et les End) comme Van Helsing chasse le Comte Dracula). Tu devrais aussi gérer les valeurs retournées par les API et mettre une ou deux gestions d'erreur.
Voila, un jolie petit 7/10 pour toi
13 janv. 2005 à 15:12
Appel de la fonction, utilisation de l'objet collection en retour d'appel???
Merci d'avance...
4 août 2004 à 21:13
4 août 2004 à 13:06
4 août 2004 à 09:48
du genre :
ResetEnum '# Mise a 0 des variables qui indexent la position dans le fichier INI
While GetKeysCollection ( Nom , Val )
'# Traitement sur les entrées renvoyées....
Wend
4 août 2004 à 09:46
Il vaut mieux tester la longueur d'une chaine pour savoir si elle est vide. De plus, utiliser lenB plutot que len... ca fais une division en moins ;-)
4 août 2004 à 09:37
1. Effectivement un String est plus adapté, surtout que VB n'a pas a faire de conversion de type à ta place, ton programme gagne en rapidité, et tu pourras te vanter d'avoir un code propre...
2. J'ajouterais meme qu'utiliser une Collection n'est pas plus adapté, ca crée toute une instance pour ce qui pourrait etre, une fois de plus, un tableau de String...
3. Utiliser ByVal pour un String est absolument inutile, étant donné qu'un pointeur String fait 10 octet, et que le texte à copier fait forcément + (10octets+texte), autant utiliser ByRef, sinon avec de gros textes ton programme sera très très ralenti....
4. De même, l'utilisation de Empty, qui ne représente rien... Tu aurai pu mettre à la place de
If Trim(Col(I))=Empty Then
un bon
If LenB(Trim$(Col(I))) = 0 Then
Propre, plus rapide, et n'utilise pas de variants :)
Voilà de quoi bien optimiser :)
4 août 2004 à 09:00
Col = Split(strBuf, vbNullChar)
... fonctionne tres bien sans variant !!
4 août 2004 à 00:42
lngpos=instr(1,col(i),"=")
if lndpos <> 0 then
strnom=left$(col(i),lngpos-1)
strval=mid$(col(i),lngpos)
end if
mais ça aurait été encore plus lourd...
4 août 2004 à 00:35
En plus tu trouves pas que "Col2 = Split(col(I), "=", 2)" c'est un petit peu violent !! D'autant plus que si tu as une valeur contenant un ou plusieurs signe "=", ce qui n'est pas impossible, et bien tu va rater la fin de la valeur !!!
4 août 2004 à 00:12
3 août 2004 à 23:57
3 août 2004 à 23:49
Voila, un jolie petit 7/10 pour toi