Utilisateur anonyme
-
18 sept. 2006 à 19:46
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 2007
-
19 sept. 2006 à 19:44
Bonjour,
j'utilise dans mon programme un morceau de code source pour remplacer (jamais la même chose) un texte précis par un des éléments d'une listbox.
For a = 1 To Len(MONTEXTE)
Trouver = InStr(MONTEXTE.Text, "#fruits#")
If Trouver <> 0 Then
MONTEXTE.SetFocus
MONTEXTE.SelStart = Trouver - 1
MONTEXTE.SelLength = Len("#fruits#")
MONTEXTE.SelText = liste_fruits.List(nombre_fruits * Rnd + 1)
Else
End If
next a
Malheuresement, le contenu de MONTEXTE est égale à environ 350-500 caractères et donc l'application met énormément de temps à générer les listes de fruits et si par exemple je demande à l'application de modifier quelque chose sur l'application le résultat n'est pas possible.
Je recherche si vous avez, un moyen plus simple pour faire la même chose et si cela n'est pas possible un moyen simple pour que l'application tourne plus vite.
Merci d'avance pour l'aide que j'espère vous allez m'apporter.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 18 sept. 2006 à 20:43
Evidemment que c'est long, tu fais autant de boucle que tu as de caractères dans ton texte.
Il n'y a aucun interet à faire ça.
Ce code devrai déjà te réduire signifiquement le temps d'éxecution
a = 1
While a < Len (MONTEXTE.Text)
Trouver = InStr(a, MONTEXTE.Text, "#fruits#")
If Trouver <> 0 Then
MONTEXTE.SetFocus
MONTEXTE.SelStart = Trouver - 1
MONTEXTE.SelLength = Len ("#fruits#")
MONTEXTE.SelText = liste_fruits.List(nombre_fruits * Rnd + 1)
a = Trouver
Else
a = Len (MONTEXTE.Text)
End If
Wend
<small>Coloration syntaxique
automatique</small>
---- Sevyc64 (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 18 sept. 2006 à 21:22
Dark, la fonction Replace remplace toutes les occurences du texte par la même chaine en une seule passe.
Si tu regarde bien son code, chaque occurence est remplacée par une chaine prise aléatoirement dans un tableau.
Dans ce cas là, je doute que la fonction Replace corresponde à ce qu'il recherche.
Cependant, je suis largement d'accord avec toi, pour tout remplacer, il 'ny aurait pas plus rapide que Replace.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 19 sept. 2006 à 06:54
Okay, autant pour moi alors, j'avais pas fait gâffe au remplacement de texte aléatoire, et pourquoi pas la fonction split :
On fait un split de tout le texte.
Pour chaque ligne du tableau obtenu tu rajoute un élément aléatoire à la fin du tableau. Et enfin, tu rejoint tout le tableau en une seule ligne comme auparavant... là encore, ca t'évite de passer par les sélections de texte dans ton textbox, ce qui n'est pas négligeable.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 19 sept. 2006 à 09:27
Bonjour tout le monde,
^^casy, ton code semble correct à ceci près qu' il ne doit continuer
que sur ce qui reste de MONTEXTE.Text.
Trouver = InStr(a, Mid(MONTEXTE.Text,a,Len(MONTEXTE.Text)-a), "#fruits#")
En plus , il ne doit pas y avoir de :
Else
a =
Len(MONTEXTE.Text)
End If
Il ne doit pas forcer le compteur,
car ça le fait sortir de Do While alors qu' il doit poursuivre
jusqu' à la fin du Texte.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 19 sept. 2006 à 10:03
Même la première partie, tu peux la retirer.
Trouver = InStr (a, MONTEXTE.Text, "#fruits#") permet de faire la recherche seulement à partir de la dernière position trouvée.
Et ton instruction n'est pas bonne, car tu va faire la recherche à partir de la dernière posistion trouvée mais dans une chaine ou tu auiras enlenvé les caractères déjà analyser. Tu fausse la comparaison. Dans ton cas, il faudrait systèmatiquement faire la recherche depuis 1 et non pas depuis a
Effectivement j'aurais pu, prendre aussi en compte le texte qui viens d'être changé. Mais j'ai jugé arbitairement que ça devait couter beaucoup plus de temps de faire appel à 2/3 opérations (mid, -, len) supplémentaire que d'analyser tout au plus une quinzaine de caractères de trop. C'est pour cela que je ne touche pas à la chaine comparée, j'indique juste le point de départ de la comparaison, qui augmente à chaque occurence trouvée.
C'est donc un compromis que j'ai proposer avec mon code.
---- Sevyc64 (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 19 sept. 2006 à 19:36
Effectivement !
T' as raison sur toute la lignen, casy.
Ce qui m' a induit en erreur c' était le fait que
j' avais compris à ma première lecture que tu sortais
de la boucle une fois une occurence était trouvée.
De là je me suis lancé sur une fausse logique.
Comme quoi il faut tourner sept fois sa plume avant d' écrire (....)