Question très con : Modifier un String.

Résolu
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007 - 21 oct. 2005 à 11:43
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 21 oct. 2005 à 19:01
Bonjour,

Bon, j'ai un peu honte de poser une question si con mais vouala :

Je cherche juste, avec une DirListBox, à avoir le nom d'un répertoire,mais voilà, le nom du répertoire est :
C:\WINDOWS\ETC

Comment puis-je faire pour modifier ce String est n'avoir que ETC ?

Merci .

18 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
21 oct. 2005 à 13:29
salut
Const sPath As String = "C:\Windows\Etc"
MsgBox Right(sPath, Len(sPath) - InStrRev(sPath, ""))
PCPT [AFCK]
3
jpleroisse Messages postés 1788 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 11 mars 2006 27
21 oct. 2005 à 13:33
Bonjour,

Essaye ceci.



Private Sub Command1_Click()

Dim mPath As String, mFile As String

mPath = "C:\WINDOWS\ETC"

mFile = Right(mPath, (Len(mPath) - InStrRev(mPath, "")))

MsgBox mFile

End Sub



jpleroisse



Si une réponse vous convient, cliquez Réponse Acceptée.
3
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 14:19
! J'ai trouvé !

Alors InStr ne marchant pas sur VB5, j'ai finté :

'Tout d'abord nous avons notre chemin :
Const Origine = "C:\Windows\Etc"

'La variable Place contiendra l'endroit ou se trouve le dernier " \ ":
Dim Place As Long

'Nous allons donc tester tout au long du mot:
For a = 1 To Len(Origine)

'Si il y a un "" après la position indiqué, nous notons cet emplacement sans Place,
'Cette action permet d'enregistrer la position du dernier ""
If InStr(a, Origine, "", 0) > 0 Then Place = InStr(a, Origine, "", 0)

Next a

'Variable Mot qui contiendra le dernier mot de notre chemin
Dim Mot As String

'Une fois que nous avons la position du dernier "", il nous reste plus
'qu'à prendre le mot qui se trouve à droite de cette position
'Len(Origine) - Place car on prend que le dernier mot, et comme on
'commence de la droite, il nous faut la position 'inverse' de notre ""
Mot = Right(Origine, Len(Origine) - Place)

'On affiche notre mot !
MsgBox Mot

Et voilà ! Merci à tous, vous m'avez permis de découvrir InStr en Len, qui m'ont servi à faire ma fonction version VB5 !!!
3
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
21 oct. 2005 à 12:00
salut

une méthode rapide :

tu fait un split de ton string :
tmp = split("c:\windows\etc", "")
monRepertoire = tmp(Ubound(tmp))

ca devrait fonctionner
0

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

Posez votre question
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 12:06
Comprend pas : split ?
0
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 12:23
Juste pour dire que je suis sous VB5 ...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 13:32
ps : Aieeeuuuu -> Split est très pratique, mais surtout pour les grandes chaînes...
il est beaucoup plus lourd, c'est préférable de l'éviter pour les si petits traitements

@+
0
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 14:01
Euh ...

InStrRev ne marche pas sur VB5 ... Il n'y a que InStr qui fonctionne ...
Comme InStr ne rend que le premier caractère reconnu, InStrRev doit donner le dernier, mais il ne fonctionne pas sur VB5 ...
Il faut trouver autre chose, je planche dessus ...
0
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 14:21
Pour info, j'ai accepté les deux solutions qui semblent fonctionner sur VB6 et ma version VB5.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 14:31
re, tiens, en voici une autre
(non pas que je veuille aussi du vert, mais c'est fait, alors çà me fait un peu chier de pas copier^^)


Private Sub Form_Load()
Const sPath As String = "C:\Windows\Etc"
Dim Pos1 As Integer, Pos2 As Integer
Pos1 InStr (sPath, ""): Pos2 1
Do While Pos1 <> 0
Pos2 = Pos1
Pos1 = InStr(Pos2 + 1, sPath, "")
Loop

If po2 <> 1 Then
MsgBox Right(sPath, Len(sPath) - Pos2), 32
Else
MsgBox "ya aucun slash", 32
End If
Unload Me
End Sub



<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


++
PCPT [AFCK]
0
shudrummer Messages postés 58 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 août 2007
21 oct. 2005 à 14:34
LOL

J'avais commencé comme çà, puis je suis passé sur le for après, ca faisait moins de lignes !!!

Trop fort !
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 14:36
+
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
21 oct. 2005 à 15:10
Salut, une autre solution, avec juste un mid donc moins lourd et plus rapide et qui fait exactement la même chose que le intrrev de vb6 :

Dim Origine As String
Dim Mot As String
Dim a As Integer


Origine = "c:\windows\etc"

'On parcourre la chaine à partir de la fin
For a = Len(Origine) To 1 Step -1


If Mid(Origine, a, 1) = "" Then
Mot = Mid(Origine, a + 1)
Exit For
End If

Next a


MsgBox Mot

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 15:39
pas bête non plus^^
plus long tout de même, puisque 4 passage dans ta boucle, pour 2 dans la mienne, et 14 dans celle de ShuDrummer
++
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
21 oct. 2005 à 17:02
Pas trop d'accord avec toi pcpt car, que fait instr sinon parcourrir la chaine depuis le début pour trouver d'abord la position de départ indiquée puis comparer jusqu'au caractère cherché et si pas trouvé comparer tous les caractères jusqu'à la fin ? Donc beaucoup plus de "passages" que mes 4.

Enfin, pour une chaîne si courte, la différence doit être minime.
Au final, une question qui devrait intéresser les amateurs de perf d'instructions.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 17:43
re,
désolé, mais je maintiens^^

3 boutons, chacun le notre (pas de jaloux comme çà)


Private Sub Command1_Click() '[ShuDrummer]
Const Origine = "C:\Windows\Etc"

Dim Place As Long
For a = 1 To Len (Origine)
If InStr(a, Origine, "", 0) > 0 Then Place = InStr(a, Origine, "", 0)
Next a

Dim Mot As String
Mot = Right (Origine, Len(Origine) - Place)

' MsgBox Mot
Debug.Print "[ShuDrummer] -> " & a - 1 & " passages en boucle"
End Sub
'
'
'
'
'
Private Sub Command2_Click() '[PCPT]
Const sPath As String = "C:\Windows\Etc"
Dim Pos1 As Integer, Pos2 As Integer

Dim a As Integer: a = 1
Pos1 InStr (sPath, ""): Pos2 1
Do While Pos1 <> 0
a = a + 1
Pos2 = Pos1
Pos1 = InStr (Pos2 + 1, sPath, "")
Loop

' If po2 <> 1 Then
' MsgBox Right(sPath, Len(sPath) - Pos2), 32
' Else
' MsgBox "ya aucun slash", 32
' End If
Debug.Print "[PCPT] -> " & a - 1 & " passages en boucle"
End Sub
'
'
'
'
'
Private Sub Command3_Click() '[CanisLupus]
Dim Origine As String, Mot As String
Dim a As Integer
Dim b As Integer: b = 1

Origine = "c:\windows\etc"

'On parcourre la chaine à partir de la fin
For a = Len (Origine) To 1 Step -1
b = b + 1
If Mid(Origine, a, 1) = "" Then
Mot = Mid(Origine, a + 1): Exit For
End If
Next a

' MsgBox Mot
Debug.Print "[CanisLupus] -> " & b - 1 & " passages en boucle"
End Sub



<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


et voici la trace :

[ShuDrummer] -> 14 passages en boucle
[PCPT] -> 2 passages en boucle
[CanisLupus] -> 4 passages en boucle

++
PCPT [AFCK]
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
21 oct. 2005 à 18:30
Arf, pcpt, ce n'est pas comme ça qu'il faut le calculer mais en nombre d'instructions processeur (voire en temps d'utilisation) et pas en nombre de fois qu'on passe dans une boucle si on veut vraiment comparer car ça dépend des instructions qui sont dans la boucle. Certaines sont plus gourmandes que d'autres.

Cela dit, notre discussion, bien qu'intéressante, n'a plus grand chose à voir avec la question de départ. A moins que ça intéresse aussi shudrummer.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2005 à 19:01
re,

pour faire les tests, j'ai ajouté cette ligne à mon code :

sFin = Right(sPath, Len(sPath) - Pos2)
forcément...

voici les performances en ms. j'ai pas de moyen de vérifier en ressources RAM précises
les boucles ont chacunes tourné 1000 fois pour avoir une moyenne acceptable.
et la boucle est faite dans un timer, pour ne pas interférer en ressources process.
Timer dispo dans mes sources ;)


<HR>
IDE : [ShuDrummer]
Nombre de Test : 1000
Vitesse min = 0,0494ms
Vitesse max = 1,2259ms
moyenne = 0,058ms


EXE : [ShuDrummer]
Nombre de Test : 1000
Vitesse min = 0,0324ms
Vitesse max = 0,1447ms
moyenne = 0,0366ms
<HR>



IDE : [PCPT]
Nombre de Test : 1000
Vitesse min = 0,0441ms
Vitesse max = 1,0999ms
moyenne = 0,0527ms


EXE : [PCPT]
Nombre de Test : 1000
Vitesse min = 0,0299ms
Vitesse max = 0,4808ms
moyenne = 0,0355ms
<HR>



IDE : [CanisLupus]
Nombre de Test : 1000
Vitesse min = 0,0483ms
Vitesse max = 1,6429ms
moyenne = 0,0594ms


EXE : [CanisLupus]
Nombre de Test : 1000
Vitesse min = 0,0335ms
Vitesse max = 0,3917ms
moyenne = 0,0378ms

<HR>

j'aurais pensé que la première méthode aurait pris beaucoup plus de temps, mais non ;)
il ne faut pas oublier que c'est un calcul simple...
bref, voilà, à vous d'en tirer vos conclusions.

ps : çà ne fait que donner une idée. chiffres variables selon les applis qui tournent déjà, et les performances propres à chaque poste.

++
PCPT [AFCK]
0
Rejoignez-nous