Boucle + rapidité = problème ?

[Résolu]
Signaler
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
-
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
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

Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
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
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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)
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
sont-ce forcément des espaces qui séparent les mots ?
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
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
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
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
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
d'accord merci infiniment pour votre aide précieux

Les yeux montrent la force de l'âme
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
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
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
??? ben ca change la couleur de l'item ajouté...


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