Boucle + rapidité = problème ?

Résolu
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 - 12 mai 2009 à 13:21
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 18 mai 2009 à 11:20
bonjour
j'ai fait un code qui contient plusieurs boucles pour traiter plusieurs donner aussi mais il y a  un problème:
je vous explique mieux:

private sub traitement(byval listname,byval msg)
'ici je recois un nom d'une list de mon projet, par exemple listview2 + msg à ajouter dans la liste
'le message que je recois est un peut longs, il contient jusqu'à 1000 mot chaque mot contient 20 caracteres minimum
'donc je doit faire un split sur le message pour prendre les mots un par un
mot = split(msg," ")
for i = 0 to ubound(mot)
'ici chaque mot contient deux partie séparer avec un "!" donc je dois aussi lui faire un split et lire les 2 parties
'parcequ'il faut que j'ajoute que la 1ere partie, et la 2eme partie sert à ajouter des paramettres:
addmot = split(mot(i),"!")
if mid(addmot(1),3,1) = "R" then
form1.controls(listname).listitems.add , , addmot(0):
form1.controls(listname).listitems(form1.controls(listname).listitems.count).forcolor = vbred
form1.controls(listname).listitems(form1.controls(listname).listitems.count).tooltiptext = addmot(1)
elseif mid(addmot(1),3,1) = "B" then

form1.controls(listname).listitems.add , , addmot(0):

form1.controls(listname).listitems(form1.controls(listname).listitems.count).forcolor = vbblue
form1.controls(listname).listitems(form1.controls(listname).listitems.count).tooltiptext = addmot(1)
next
end sub

voila, le code fonctionne sans problème(peut etre on le réecrivant y'a une erreurs de frape) s'il s'agit d'une petite liste de 100 mots par exemple,
mais quand il s'agit de plusieurs liste au meme temps (6 ou 7 lists en 1 ou 2 secondes) sa m'affche aucune erreurs parcontre
il ajoute pas tout les mots (exemple, 5 listes de 400 mots par list = 2000 mots mais il ajoute que 1400 mots dans la liste)

y a t-il une méthode pour que le code traite toutes les données sans perdres des infos ?

merci d'avance

Les yeux montrent la force de l'âme

10 réponses

Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
18 mai 2009 à 11:15
rebonjour,
encore un truc renfield :
Select Case Mid$(sWord, nPos + 3, 1)

                        Case "R"

                            .ForeColor = vbRed

                        Case "B"

                            .ForeColor = vbBlue

                        'Case Else

                        '    .ForeColor = vbGreen

                    End Select

=> sa change le forecolor de la listview alors que je cherche juste à changer la couleur de l'item que j'ajoute
bref on ajoutant un "DOEVENTS" avant le dernier end if tout fonctionne à merveille.

merci pour votre aide

Les yeux montrent la force de l'âme
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2009 à 13:59
tu vois pas le boulot que tu lui donne, a retrouver ton objet a chaque fois que tu écris :

form1.controls(listname).listitems(form1.controls(listname).listitems.count)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2009 à 14:01
sont-ce forcément des espaces qui séparent les mots ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2009 à 14:13
devrait tourner bien plus vite :

si tu as des questions sur le code...



Option Explicit

Private Sub Form_Load()
traitement ListView1, "bla!01R1 bla!11B2 bla!10B5"
End Sub

Private Sub traitement(ByRef voList As ListView, ByVal vsMsg As String)
Dim xsWords() As String
Dim sWord As String
Dim i As Long
Dim nPos As Long
If Not Nothing Is voList Then
xsWords = Split(vsMsg, " ")
For i = 0 To UBound(xsWords)
'# On évite de manipuler trop souvent xsWord(i) : les accès aux tableaux sont couteux
sWord = xsWords(i)
'# On cherche un '!' (Split est inutile ici. Ca nous évite n reallocations mémoire et des manipulations de tableau.
nPos = InStr(sWord, "!")
If nPos Then
'# On commence un bloc With. Toutes les instructions commencant par un . dans ce bloc prendront comme acteur le ListItem
'# renvoyé par ListItems.Add
With voList.ListItems.Add
.Text = Left$(sWord, nPos - 1)
Select Case Mid$(sWord, nPos + 3, 1)
Case "R"
.ForeColor = vbRed
Case "B"
.ForeColor = vbBlue
'Case Else
' .ForeColor = vbGreen
End Select
.ToolTipText = Mid$(sWord, nPos + 1)
End With
End If
Next i
End If
End Sub
0

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

Posez votre question
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
12 mai 2009 à 15:29
merci beaucoup pour ta réponse renfield je vais la tester maintenant et te dire si j'ai toujours le meme problème ou c'est résolut
merci énormément

Les yeux montrent la force de l'âme
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
12 mai 2009 à 16:12
j'espere que je vous dérrange pas renfield j'ai oublier un petit détail :
c'est dans un module que je doit mettre donc je change private par public, et l'autre probleme c'est :
avant de faire appel au code, je connais pas le nom de la listview je connais juste son tag (la ou j'ai mi des infos quand je l'ai créer dynamiquement), donc je doit chercher la list quand je la trouve et que je fait appel au code avec la méthode:
traitement form1.controls("list"), mon msg
sa fonctionne pas.
je suis vraiment désolé d'avoir oublier ce détail.

Les yeux montrent la force de l'âme
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2009 à 16:19
Form1.Controls renvoie un Variant

la procédure, telle que je l'ai écrite attend une reference valable, vers un ListView.

l'incompatibilité de type ne lui plait pas.

ajoutes avant l'appel :

Dim oList As ListView
On Error Resume Next
Set oList = Form1.Controls("list")
traitement oList, mon_Msg
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
12 mai 2009 à 17:16
d'accord merci infiniment pour votre aide précieux

Les yeux montrent la force de l'âme
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
14 mai 2009 à 15:25
désoler d'avoir retirer ta réponse, mais le problème persiste avec des longue liste.
merci

Les yeux montrent la force de l'âme
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 mai 2009 à 11:20
??? ben ca change la couleur de l'item ajouté...


un DoEvents sert juste a laisser du temps pour que ton appli consulte ses messages...
0
Rejoignez-nous