Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDernière intervention 9 novembre 2013
-
26 avril 2007 à 15:18
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 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! ;)
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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.
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDerniè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
Billybobbonnet
Messages postés148Date d'inscriptionlundi 12 février 2007StatutMembreDerniè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!