Attendre que l'utilisateur appuie sur une touche

Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
- - Dernière réponse : Radiohead4ever
Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
- 21 avril 2005 à 23:59
Bonjour
Je me demande s'il est possible de faire attendre VB. Pour ma part, j'ai esseyé de "l'emprisoné" dans un Do Loop dont la seule issue serait que l'utilisateur ait appuyé sur la touche "e".

Dans KeyPress, j'ai dit a VB que lorsque la touche "e" (101 en ascii) est appuyé, de mettre la variable boolean "Etrigged" à true. La loop dont je parlais au début se trouve dans un autre sub que KeyPress et attend que Etrigged soit a true pour permettre de sortir du Do Loop.

Eh bien ça ne marche pas.. Y a t-il un bon moyen efficace que je puisse utilisé qui me permettera d'attendre que l'utilisateur appuis sur une touche avant de continuer a lire le code de ma sub ?

RadioHead4Ever
Afficher la suite 

10 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
0
Merci
Un petit bout de code serait pas mal pour qu'on comprenne comme ton soft fonctionne




Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
31 mars 2015
17
0
Merci
est-ce que tu as mis des DoEvents dans ta boucle ?

si tu fais rien d'autre que t'attendre la touche, c'est pas la peine de faire de boucle, tu arrêtes ton programme et tu lances la suite au moment où on tape sur la touche.

Daniel
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
18
0
Merci
Come le dis Gobillot, rappelons a toutes fins utiles, que VB est évènementiel et non pas simplement procédural (ce qu'il est aussi d'ailleur, mais il es tpluls que cela !!) donc le fait de dire que Le programme va attendre que l'utilisateur appui sur une touche perd un peu de son sens en VB. Mais encore une fois tout dépend du contexte. En tout cas, voila une solution éventuelle à ton probleme
Sur une form avec un CommandButton commé Command1. On ajoute cela au code de la form .
Private ETrigged As Boolean
Private Sub Form_Load()
ETrigged = False
Command1.Caption = "Click Me !!!"
End Sub

Private Sub Command1_click()
Msgbox "Après avoir valider ce message, appuyer sur ""e"" pour terminer la boucle"
While not ETrigged
DoEvents
Wend
Msgbox "Boucle terminée"
End sub

Private Sub Form_KeyPress(KeyAscii As Integer) ETrigged (KeyAscii Asc("e") Or KeyAscii = Asc("E"))
End Sub

That's all folks !!!
Christophe R
Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
0
Merci
Crenaud76: A tu testé ton code ? Si oui, il a un probleme avec mon system puisque je ne voit jamais le message qui confirme que je suis sorti du While. (je ne l'ai même pas ajouté a mon programme, j'ai fait un nouveau projet tout simple avec ton code et un bouton!) Je galère...

Casy: Voici le code de la sub

Private Sub ReadingMessage()
Dim Lettres As String 'Symbols de la ligne
Dim Progret As Integer 'à quel symbol la lecture est rendu (94 par lignes, 5 lignes)(taille de la boite)
Dim LastTime As Boolean
Dim Wait4E As Boolean


LastTime = False


StartingReadingMessage:
Etrigged = False
Wait4E = False


Messagelbl.Caption = "" 'Vide la zone de texte


For Progret = 1 To 470
MsgBox "Etrigged = " & Etrigged
DoEvents
Etrigged = False


Select Case Wait4E
Case False
MesStrOffset = MesStrOffset + 1


Lettres = Mid(CurrentMessage, MesStrOffset, Len(CurrentMessage))


If Left(Lettres, 1) = "_" Then
Wait4E = True
GoTo StartingReadingMessage
End If
If Left(Lettres, 1) = "/" Then
LastTime = True
Wait4E = True
GoTo StartingReadingMessage
End If


Select Case Progret
Case 94
Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) & vbNewLine
Case 188
Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) & vbNewLine
Case 282
Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) & vbNewLine
Case 376
Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) & vbNewLine
Case Else
Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1)
End Select


Case True
Do
Select Case messagefleche.Visible
Case True
messagefleche.Visible = False
Case False
messagefleche.Visible = True
End Select


If Etrigged = True Then
Select Case LastTime
Case False
GoTo StartingReadingMessage
Case True
MsgBox "lasttime = true"
GoTo Fin
End Select
End If
Loop
End Select
Timer1_Timer
Next Progret
Fin:
End Sub

Et voici une partie du code de Keypress

Select Case KeyAscii
Case 101 '*********** Bouton D'action (e)
Etrigged = True
Select Case MapoffsetY
Case 0
Select Case MapoffsetX
Case 0
Select Case PersoOffsetY
Case 3
Select Case PersoOffsetX
Case 1
Select Case PersoBoussole
Case 2
mov000000B5 = False
'Fin de PersoBoussole
End Select
'Fin de PersoOffsetX
End Select
'Fin de PersoOffsetY
End Select
'Fin de MapoffsetX
End Select
'Fin de MapoffsetY
End Select
InitMessage 'affiche le message correspondant si message il y a.
ApplyMoveables 'Reset toutes les Moveables, (vérifi s'il on encore raison d'etre affichés)
End Select
RadioHead4Ever
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
18
0
Merci
J'ai effectivement oublié de précisier qu'il faut que la propriété KeyPreview de la Form soit à True. Sinon, c'ets le CommandButton qui à le focus alors c'est lui qui recevrait l'EVT KeyPress, et non pas la form. Avec cela, ca devrait tourner.
Et si tu veux que cela fonctionne X fois de suite, il faudra rajouter un ETrigged = False juste avant de rentrer dans le While ...
(Pour info, je n'ai pas tester ce code)

Christophe R
Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
0
Merci
Voilà, ca va mieux. Mais il y a encore un probleme. Avant tout je vais expliquer le contexte. Je suis en train de faire un jeu RPG et dans ce cas ci, je travail sur le sytème de messages. Lorsque je verrai un personnage et que j'appurai sur "e", ma sub ce déclenchera. Le principe est simple. Toute la conversation est stocké dans une variables String, évidement. Mais je ne la diffuse pas au complet, mais bout par bout. Voila pourquoi je voudrais je l'utilisateur appui sur "e", c'est pour quand il aura fini de lire une réplique, il verra appaitre le prochain bout de texte, et comme ca, jusqu'à la fin du String. Ensuite, je redonne le controle à l'utilisateur et il sera libre d'aller ou il veut.. C'est pas nouveau comme concept et vous avez probablement déja vu ca.

Mon probleme c'est que TOUT au long de ma sub, la touche "e" reste activée (semble-t-il) donc, la sub me fait apparaitre tres rapidement, toutes les réplique, comme si la touche e restait enfoncée..

Une idée pouquoi ?

RadioHead4Ever
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
0
Merci
HORREUR une attaque de GoTo



STP évite d'utiliser cette SALOPERIE de goto, c'est fini le temp de QuickBasic et de ses ancètres Basica et HPBasic.



GoTo n'est admis (parqu'on a pas le choix) que dans un cas : On Error GoTo



Sinon ça fait de belle m*r*e de boucles infinies, et j'ai l'impression que c'est ce que tu nous à fait.


Je vois que tu te shoote au Select Case aussi. Perso pour une ou
possibilité je prefère le If/Then/Else, je réserve le Select Case
lorsque + de 2 choix son possible.



Si j'ai bien compris ton code, tu ne peux rentrer en attente de la
touche 'e' que lorsque la variable Wait4E est à true, or les rares fois
ou elle est mise à true, elle est systèmatiquement remise à false par
ton GoTo StartingReadingMessage.

Donc en fait tu ne rentre jamais en attente de la touche 'e', c'est
pour cela que tu as l'impression qu'elle est toujours activée.


Je continu à analyser ton code qui n'est pas si simple que ça à comprendre.

Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
0
Merci
Voila, j'ai un peu remanié le code à ma sauce avec ce que j'avais
compris. Je ne sais pas si il marche, j'espère n'avoir pas fait trop de
co******.



Private Sub ReadingMessage()

Dim Lettres As String 'Symbols de la ligne

Dim Progret As Integer 'à quel symbol la lecture est rendu (94 par lignes, 5 lignes)(taille de la boite)

Dim LastTime As Boolean

Dim Wait4E As Boolean



LastTime = False



Etrigged = False

Wait4E = False



Messagelbl.Caption = "" 'Vide la zone de texte



For Progret = 1 To 470

MsgBox "Etrigged = " & Etrigged

DoEvents

Etrigged = False



Select Case Wait4E

Case False

MesStrOffset = MesStrOffset + 1



Lettres = Mid(CurrentMessage, MesStrOffset, Len(CurrentMessage))



If Left(Lettres, 1) "_" Or Left(Lettres, 1) "/" Then

Wait4E = True

If Left(Lettres, 1) "/" Then LastTime True

Else

Select Case Progret

Case 94


Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) &
vbNewLine

Case 188


Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) &
vbNewLine

Case 282


Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) &
vbNewLine

Case 376


Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1) &
vbNewLine

Case Else


Messagelbl.Caption = Messagelbl.Caption & Left(Lettres, 1)

End Select

End If



Case True

Wait4E = False

Do

If messagefleche.Visible = True Then

messagefleche.Visible = False

Else

messagefleche.Visible = True

End If



If Etrigged = True Then

If LastTime = False Then

Exit Do

Else


MsgBox "lasttime = true"

Exit For

End If

End If

Loop

End Select

Timer1_Timer

Next Progret



End Sub









Select Case KeyAscii

Case 101 '*********** Bouton D'action (e)

Etrigged = True

If MapoffsetY = 0 And _

MapoffsetX = 0 And _

PersoOffsetY = 3 And _

PersoOffsetX = 1 And _

PersoBoussole = 2 Then



mov000000B5 = False

End If



InitMessage 'affiche le message correspondant si message il y a.

ApplyMoveables 'Reset toutes les Moveables, (vérifi s'il on encore raison d'etre affichés)



End Select





Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
0
Merci
Hahahaha, c'est vrai que j'aime bien les Select Case.. Je trouve ca plus clair. Mais je ne les utilise pas en vaint car ce que je fait en ce moment n'est que le "moteur" de mon jeu, et plus tard il y aura BEAUCOUP plus de possibilitées,, donc dans ce cas, les select case sont mieux, mais j'avou que des fois j'abuse..

Bon, j'ai testé et étudié ton code. Il est fonctionnel, mais seulement pour le premier bout de texte, apres, mon appli devient surper lente, rien ne fonctionne, je peux meme pas quitter, je dois faire ctrl alt del... Je n'ai aucune idée pourquoi, parce que franchement, ton code semble impect (meme pas de goto ). D'ailleurs, c'est pas la premiere fois que je vois ce genre de réaction de programme. C'est tu d'où ca vient?

RadioHead4Ever
Messages postés
71
Date d'inscription
samedi 7 février 2004
Statut
Membre
Dernière intervention
21 novembre 2006
0
Merci
AHA!!!!!!!!!!!! J'ai trouvé ! tu avait oublié le DoEvents dans le Do Loop ! et maintenant ca fonctionne !! Jte remerci beaucoup !

RadioHead4Ever