Application lente

Utilisateur anonyme - 18 sept. 2006 à 19:46
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 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.

12 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
18 sept. 2006 à 20:12
utilise la fonction replace
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
18 sept. 2006 à 21:12
Je le répète : la fonction replace est faite pour cà, ca évitera de jouer avec la sélection du texte, ce qui sera d'autant plus rapide !
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0

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

Posez votre question
Utilisateur anonyme
18 sept. 2006 à 21:23
La fonction replace ne fonctionne pas totalement comme je le veut vu que je veut que le texte qui va être remplacé ne sois jamais la même chose.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
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.

chaibat
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
19 sept. 2006 à 09:50
je crois que moi aussi je n' ai qu' à moitié raison !
Je retire ce que j' ai dit sur Else....a = Len(MONTEXTE.Text) 

(Else s' il n' a pas trouvé tout le long du texte).
Tu as raison sur ce point.
Mais je maintiens le reste .
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
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 (....)


Bonne journée à toi.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
19 sept. 2006 à 19:41
Comme quoi il faut tourner sept fois <strike>sa plume avant d' écrire</strike> son clavier avant de tapper

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
19 sept. 2006 à 19:44
tu vois, on parlait justement d' erreur !
0
Rejoignez-nous