Exécuter une sub une seule fois depuis une boucle

Résolu
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013 - 26 avril 2007 à 15:18
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 26 avril 2007 à 17:24
Bonjour à tous!

Petite question de débutant. J'ai un code dans lequel j'ai une sub Text1_Change qui s'exécute chaque fois que  Text1 change.Ce n'est pas une boucle mais ça y ressemble. Jusque là rien de bien sorcier. Or, ce "Text1", une textbox, et change toutes les 0.2 secondes impérativement (c'est un Timecode midi).

Le problème: je voudrais lancer quelque chose (MsgBox par exemple) la première fois que Text1 change mais pas les suivantes et je n'y arrive pas.

J'ai essayé des selectcase, des chaînes de if, then avec une variable numérique etape pour différencier la première de la seconde... Je crois que la vitesse d'exécution pose problème dans ces cas là.

Une idée, alors, pour lancer une msgbox ou autre lors du premier changement seulement?? A noter: je cherche aussi à le faire pour le dernier. J'ai trouvé une fonction Text1.DataChanged mais je ne sais pas si c'est bien ce qu'il me faut, et en tout cas, vu d'ici, ça ne marche pas...

Merci à tous et surtout à celui qui me file un coup de main! ;)

7 réponses

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
26 avril 2007 à 15:47
Violent Ken
Salut, le plus simple est de déclarer une variable publique et faire un truc du style :

Public maVar As Boolean

Private Sub Text1_Change()
   If maVar = False Then
      maVar = True
   Else
      Exit Sub
   End If
   
   ' autres instructions
   
End Sub , ----
By Renfield

@+

Hex Editor VB
3
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
26 avril 2007 à 16:48
Violent Ken
Si tu fais "Call Timer1_Timer" après "Exit Sub", çà ne marchera pas (car exit la sub !)

Mais au fait, pourquoi faire appel à un timer ? Tu peux mettre le deuxième Msgbox juste avant le Exit Sub, non ?

Et pour l'utilisation d'un Timer, le changement d'intervalle (pour mettre à une valeur différente de 0) doit se faire hors de la procédure Timer1_Timer. Parce que si jamais elle est à 0 par défaut, tu comprend bien que jamais le code qui est dedans la procédure ne sera éxécuté.
Si tu veux faire Timer1.Interval=0 tu peux, mais le mieux est de faire Timer1.Enabled=False pour le désactiver.

Hex Editor VB
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 avril 2007 à 15:22
Bonjour;

Une dodée ?
Bien sur :
Montre-nous le code de cet événement Change !
0
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
26 avril 2007 à 15:34
Bonjour [auteurdetail.aspx?ID=615490 jmfmarques]!

le code est dans cette source et n'est pas de moi, bien malgré moi :) . Il semblerait que ce soit une fonction CallBack ("Public Const CALLBACK_FUNCTION = &H30000 ") qui gère ça et que pour que ça ne plante pas à  la compilation, l'auteur conseille d'insérer son code dans la sub "text1_Change".

En tout cas merci de ta réponse jmfmarques, et de toutes tes autres réponses aussi. Au passage tu m'as répondu sur un autre sujet que je dois laisser de côté pour le moment mais auquel je reviendrais très bientôt.
0

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

Posez votre question
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
26 avril 2007 à 16:39
Merci Violent Ken, il me manquait l'astuce du Exit Sub. Voilà donc une partie du code. Le pépin est maintenant de lancer une deuxième msgbox quand text1 a arrété de changer. Je suis pas très sûr de mon Timer...Voilà ce que j'ai fait pour ça:

Private Sub Form_Load()
    'au chargement on liste les drivers Midi IN disponible et on les affiche dans la liste

    Dim caps2 As MIDIINCAPS
    Dim i As Integer
    Dim Etat As Integer
   

    For i = 0 To (midiInGetNumDevs - 1)         'on parcours tous les drivers
        midiInGetDevCaps i, caps2, Len(caps2)   'On cherche le drivers en cours
        List1.AddItem caps2.szPname             'on l'insère dans la liste
    Next i
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    'ENVOYER INSTRUCTION VIDEO PREPARER ENREGISTREMENT
     'MsgBox "Préparation"
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
arret = False
Timer1.Interval = 0
End Sub

Private Sub Text1_Change()
    'analyse des entrées. il vaut mieux le faire ici et non pas dans la fonction de callback
    'car cela plante (raison inconnue)
  If arret = False Then
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     'ENVOYER INSTRUCTION VIDEO ENREGISTRER
     MsgBox "Enregistrement"
     'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     arret = True
Else
    Exit Sub
    Call Timer1_Timer
    End If

  
  Private Sub Timer1_Timer()
Timer1.Interval = 250
If Text1.DataChanged = False Then
   
 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  'ENVOYER INSTRUCTION VIDEO STOP
  MsgBox "Stop"
  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 Timer1.Interval = 0
End If
End Sub
0
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
26 avril 2007 à 17:13
Pour la deuxième MsgBox, si je la mets avant le Exit Sub, voilà ce à quoi je m'attend:

La prochaine fois que le text1 change, (0.2sec plus tard) la variable "arret" sera vraie et la sub sera terminée par Exit Sub (et éventuellement j'aurais la deuxième MsgBox) mais ce que je veux faire, c'est lancer cette deuxième MsgBox quand text1 (la text box, pas Text1_Change) arrête de changer (et que je ne reçoit plus de midi). Or, si je veux savoir si ça n'a pas changé, je suppose que Text1_Change n'est pas le meilleur endroit pour vérifier. C'est pour ça que je fais appel au Timer.

Pour le reste, mea culpa, j'ai posté trop vite sans voir toutes ces fautes. Je te remercie pour tes précieux conseils pour les Timers.

 Le but du Timer est de continuer à surveiller Text1 et lorsqu'il est identique à sa valeur dans la précédente boucle du Timer, j'envoie la deuxième msgbox car il n'y a plus de midi entrant.

Je crois que c'est bon sur le principe, reste à écrire ça correctement et je devrais me débrouiller seul. Si le principe est mauvais ou qu'il y a mieux, je suis ouvert à toute suggestion. Sinon, merci encore, Violent Ken!
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
26 avril 2007 à 17:24
Violent Ken
Ok, n'hésite pas si tu as encore des questions ^^
@+

Hex Editor VB
0
Rejoignez-nous