Petit problem avec un timer et for / next [Résolu]

Signaler
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
6 septembre 2010
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
salut,
mon problème est que je voudrai utiliser mon timer pour envoyer des commandes contenue dans une listbox jusqua 4 fois maximum une a la suite de lautre, ou bien une fois s'il y a seulement 1 element dans la liste, l'utiliser seulement si frmOptions.chklb.Value = vbChecked et utiliser un interval de 10000ms.
tandis que Si chklb. value = false seulement envoyer une command a la fois au server avec un delay de 3000ms
voila mon code mais cela ne marche pas... une commande a la fois est envoyer..

Private Sub TimerQueue_Timer()
Dim mShow As String
Dim strText As String
Dim B As Integer
Dim A As Integer
Dim P As Packet
Set P = New Packet
If frmOptions.chklb.Value = vbChecked Then
TimerQueue.Interval = 10000
For A = 0 To Me.List1.ListCount - 1
If B = 4 Then GoTo lol
If List1.List(A) <> "" Then
If Me.List1.List(A) "" Then Me.List1.List(A) " "
If InStr(List1.List(A), Chr(&H1)) Then
strText = Mid(Me.List1.List(A), 1, InStr(List1.List(A), Chr(1)) - 1)
End If
If strText "" Then strText List1.List(A)
P.InsertString strText 'insert la commande dans le buffer
P.send Form1.WS, SID_CHATCOMMAND 'send la commande
List1.RemoveItem (A)
B = B + 1

Else ' IF CHKLB = VBUNCHECKED!!
TimerQueue.Interval = 3000
If List1.List(0) <> "" Then
If Me.List1.List(0) "" Then Me.List1.List(0) " "
If InStr(List1.List(0), Chr(&H1)) Then
strText = Mid(Me.List1.List(0), 1, InStr(List1.List(0), Chr(1)) - 1)
End If
If strText "" Then strText List1.List(0)
P.InsertString strText 'insert la commande dans le buffer

P.send Form1.WS, SID_CHATCOMMAND 'send la commande
List1.RemoveItem (0)
Exit Sub
End If
End If
lol:
B = 0
Exit Sub
Next A
End If
End Sub

jattend vos réponse =) au pire je peut utiliser un autre timer qui pourrai etre moins compliqué ... mais jai le meme probleme avec for et next...

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Re
Tu n'as pas suivi mes indications correctement :
- Pourquoi avoir supprimé ta boucle For A ?
Bien que le A ne serve pas (puisque tu utilises toujours 0), la boucle sert à avancer dans la liste
- La boucle d'attente que je t'ai proposée ne doit pas inclure ton programme à l'intérieur, c'est juste un boucle d'attente : Le Loop doit se trouver juste après le DoEvents et attends que TopTempo se déclenche avant d'exécuter le programme
Une fois que tu es sorti du Do-Loop, tu as eu le TopTempo, donc maintenant, tu peux le remettre à False tout de suite avant d'exécuter ton programme, sinon, TopTempo restera à True et la prochaine boucle d'attente n'aura pas lieu.
- Oublie ton histoire de B et de Goto (qu'il aurait fallu remplacer par un Exit For si tu avais voulu sortir d'un For-Next; Goto est à éviter)
- Dans le TimerQueue_Timer, il faut TOUT enlever, juste garder le TopTempo = True

Essaye de relire posément mes propositions, elles sont claires.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
La Sub que tu nous présente se trouve sur quelle forme ?
Le problème, c'est que tu lis 
   frmOptions.chklb.Value
Or, si cette frmOptions n'est pas actuellement chargée, VB va la charger, mais que vaut ta CheckBox dans ce cas là ?
Que vaut frmOptions.chklb.Value au moment du test ?
Insère un
   MsgBox frmOptions.chklb.Value
pour le savoir

Deuxième chose : Le Next A n'est pas à la bonne place.
Si tu avais indenté (*) proprement ton code, tu l'aurais tout de suite vu.
(*) Après un If, un For, un Do ... les lignes suivantes sont décalées
     Après un End If, un Next, un Loop ... les lignes reprennent une position plus à gauche
Le Next doit impérativement être à l'intérieur du If (entre le If et le Else)

Et enfin, dans ton traitement par boucle, tu pars de l'item 0 vers le dernier item.
Par exemple, après avoir traité l'item, tu détruis l'item 0 par un Remove
Dans ce cas, l'item suivant n'est plus l'item 1, mais devient l'item 0.
Avec ton code, cet item 1 devenu 0 ne serait pas traité.
Si tu fais un Remove au fur et à mesure, il faut toujours traité l'item 0, et pas le A

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Ah oui, et ton histoire de Timer :
Le code à l'intérieur de TimerQueue_Timer sera exécuté à chaque déclenchement.
Ta boucle s'exécutera donc complètement, et ton timer ... ne sert à rien
Il faut :
- Ressortir tout ton code du Timer et le mettre dans une Sub "Traitement"
- Dans la partie Déclarations de ta page de code, tu déclares un booléen :
      Private bTopTimer As Boolean
- Dans TimerQueue_Timer, tu mets ce booléen à True
- Dans ton traitement, à chaque cycle, juste avant ton Next, il faudra attendre que le booléen passe à True avant de poursuivre
      Do While Not bTopTimer
         DoEvents   ' Attend le Top suivant
      Loop
   et remettre à zéro le booléen dès que tu le vois à True
      bTopTimer = False

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
6 septembre 2010

merci jack,
jai essayer en transferent une partie du code dans une sub mais sans resultat concluant... aucune info contenue dans list1 ne s'excecute dans la sub...

voici mon timer qui marche a merveille quand chklb = vbunchecked...

Private Sub TimerQueue_Timer()
Dim mShow As String
Dim strText As String
Dim B As Integer
Dim A As Integer
Dim P As Packet
Set P = New Packet
If frmOptions.chklb.Value = vbchecked Then
bTopTimer = True
loadban 'call la sub...
Else ' IF CHKLB = VBUNCHECKED!!
TimerQueue.Interval = 3000
'If List1.ListCount > 6 Then TimerQueue.Interval = 3000
If List1.List(0) <> "" Then
If Me.List1.List(0) "" Then Me.List1.List(0) " "
If InStr(List1.List(0), Chr(&H1)) Then
' mShow = Mid(List1.List(0), InStr(List1.List(0), Chr(&H1)) + 1, 1)
strText = Mid(Me.List1.List(0), 1, InStr(List1.List(0), Chr(1)) - 1)
End If
If strText "" Then strText List1.List(0)
P.InsertString strText

P.send Form1.WS, SID_CHATCOMMAND
' If mShow = "1" Then
' AddChat vbYellow, "<" & CurrentUser & ">", vbCrLf & vbWhite, strText
' End If
List1.RemoveItem (0)
Exit Sub
End If
End If
Exit Sub
End Sub

et puis ma sub ne marche pas .. je veut seulement quil envoit 4 fois maximum les info contenue dans ma list1.. jutilise b b+1 et if b4 then goto lol .. mais sa na pas laire de marcher. jai vraiment aucune info qui s'éxecute..

Private Sub loadban()
Dim strText As String
Dim B As Integer
Dim A As Integer
Dim P As Packet
Set P = New Packet
TimerQueue.Interval = 10000
'For A = 0 To Me.List1.ListCount - 1
Do While Not bTopTimer
DoEvents
If B = 4 Then GoTo lol
If List1.List(0) <> "" Then
If Me.List1.List(0) "" Then Me.List1.List(0) " "
If InStr(List1.List(0), Chr(&H1)) Then
' mShow = Mid(List1.List(0), InStr(List1.List(0), Chr(&H1)) + 1, 1)
strText = Mid(Me.List1.List(0), 1, InStr(List1.List(0), Chr(1)) - 1)
End If
If strText "" Then strText List1.List(0)
AddChat vbRed, "CHATCMD " & strText
P.InsertString strText
P.send Form1.WS, SID_CHATCOMMAND
' If mShow = "1" Then
' AddChat vbYellow, "<" & CurrentUser & ">", vbCrLf & vbWhite, strText
List1.RemoveItem (0)
B = B + 1
' Next A
End If
Loop

lol:
bTopTimer = False
Exit Sub
End Sub
attend ta reponse jack ! puisque on dirait que tes le seul a réponde o.O'