1

j'utilise GKeyFlush pour le Vider le tampon des touches apres _keytest.
Je fait une boucle sur _keytest jusqu'a l'appuie sur ENTER.

Lorsque j'affiche une boite de dialogue juste apres, celle-ci s'affiche puis disparait comme si j'avais encore appuyer ENTER.
Ce qui me fait passer directement a la prochaine boite de dialogue affiche.

Allors je voudrais savoir comment vous faite ca correctement ?

J'ai accelerer le clavier comme ceci au de but de mon programme
[PRE]
ki = Mode.keyi = OSInitKeyInitDelay( 40 );
kr = Mode.keyr = OSInitBetweenKeyDelay( 20 );
[/PRE]

mais bon il n'est pas dit que ENTER est une touche repetitive a ce que je sache.

2

Tu confonds deux trucs : _keytest est un alias de _rowread, c'est bas niveau donc il n'y a aucun tampon ni rien, ça renvoie juste vrai si la touche est enfoncée et faux si elle ne l'est pas. C'est à toi de gérer si tu veux que ça ne compte qu'un seul appui, et/ou une éventuelle répetition.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Oh ! J'ai dit une betise la grin

Mais bon n'empeche apres un appel a _keystest dnas une boucle ne s'interrompant que par appui
sur les touches ESC ou ENTER, le prochain appel a une boite de Dialogue, n'attend pas l'appui sur ENTER ou ESC
et se referme aussitot.

J'en conclu qu'il y a residu du _keytest qui fait foire les choses.

4

non, c'est tout à fait normal, _keytest ne fait que te dire si une touche est enfoncée ou non.
si tu as laissé l' (les?) interruption(s) qui gère(nt) le clavier, la touche entrée sera conservé dans le buffer des touches et donc quand tu ouvre une boite de dialogue, elle se ferme aussitot car elle lit l'appui qui a été enregsitré avant

d'ailleurs il est bien dit dans le doc de _rawread que tu dois bien désactiver ces interruptions (la doc doit préciser lesquelles, de mémoire ça doit être la 1 et la 5 mais je suis pas sûr) car elles interferent avec _rawread (et donc keytest)
ce qui veut dire que sans interruption tu ne peux plus utilisers les fonctions comme ngetchx et les autres fonctions clavier de haut niveau
ce qui veut dire que les boites de dialogue ne devraient pas non plus fonctionner

donc soit tu évites de mélanger les deux, soit tu réactives les intéruptions quand tu as besoin d'une gestion haut niveau du clavier smile
avatar

5

J'expose tout ce que fait mon code comme cela ce sera un peu plus clair :

- Redirection AI 1,5
- Utilisation de _keytest jusqu'a appuie sur ENTER ou ESC
- Restauration des AI 1,5 ( je viens juste de faire la verification )
- Vidage du Tampon clavier avec GKeyFlush ( vous avez apparement l'air de dire que ca ne sert a rien ici )
- 2 appels DlgMessage ( le 1er Appel s'affiche puis disparait aussitot pour laisser place au second )

En conclusion, je n'ai aboslument rien melange.
C'etait juste deplace de ma part de parler des accelerations du clavier pour les touches repetitives quand on appuie sur ENTER dans une boite de Dialogue.

De plus si les AI n'etaient pas restaurees correctement, pourquoi la 2 eme boite fonctionnerait et pas la 1ere ?

Dailleurs, il me semble que la TI doit crasher quand on appelle les boites de dialogue apres redirection des AI.



6

Je poste mon code au cas ou j'aurais mal Restaurer les AI :

[PRE]
void FN_Tkey(void)
{
// Detournement des AI
if( Mode.mouse.mode==MOUSE_AI_OFF && IsFirstArgLoop() ) {
UsedTestkey = TRUE;
save_int_1 = GetIntVec(AUTO_INT_1);//Sauvegarde
save_int_5 = GetIntVec(AUTO_INT_5);//Sauvegarde
//Remplacement de l'AUTO_INT_1
if( Mode.bits.UsedGray ) GraySetInt1Handler( DUMMY_HANDLER );
else SetIntVec( AUTO_INT_1, DUMMY_HANDLER );
//Remplacement AUTO_INT_5
SetIntVec( AUTO_INT_5, DUMMY_HANDLER );
if( !UsedOneCall && Mode.mouse.used ) {
// Activation Utilisation Souris
Mode.mouse.mode = MOUSE_AI_ON;
// 1er Affichage souris
MouseShow();
}
}
...
...
...

//Sortie detectee : Restauration AI
if( IS_ERROR() || ( !UsedOneCall && Mode.mouse.used ? \
Mode.mouse.mode==MOUSE_AI_EXIT : ExitFunc || IsEndArgLoop() ) ) {
if( !Mode.mouse.used && !CountUp ) push_longint(0);
UsedTestkey = FALSE;
//Vidage du tampon des touches
GKeyFlush();
//Restauration l'AUTO_INT_1
if( Mode.bits.UsedGray ) GraySetInt1Handler( save_int_1 );
else SetIntVec( AUTO_INT_1, save_int_1 );
//Restauration l'AUTO_INT_5
SetIntVec( AUTO_INT_5, save_int_5 );
}
}
[/PRE]
Extrait Code Source ExtLiB


Le detournement des AI prend en compte l'activation des niveaux de gris.

7

Une solution pas très propre (mais qui marche ^^) consisterait à effectuer un ngetchx() au niveau de la restauration des interruptions.
avatar
Time is on our side.

THE EXPERT 4 : topics/74978-the-expert-4
THE EXPERT 5 : topics/101326-the-expert-5
DUNE 2 : topics/111247-dune-2

8

C'est a peu pres ce que je fait actuellement. Mais bon je ne comprends pas
pourquoi GKeyFlush() qui est sense faire la meme chose que ngetchx()
ne vide pas le Keyboard Queue correctement.

A tout hasard, je vais faire le GKeyFlush() apres avoir restaurer les AI ;
on ne sait jamais. J'essayerai ngetchx() par la suite.

9

Ton code ne doit pas gérer le bon cas, cad, que tu attend que la touche soit enfoncé, et rien ne prouve (au contraire) que l'utilisateur a encore la touche appuyé au moment ou tu restore les INT, donc l'OS prend la touche en compte.

Il faut que tu attende que la touche ai été enfoné, puis relaché avant de passer au reste du code, sinon tu t'expose a ce genre de soucis
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

10

Merci Godzil.
Ca me pose pas mal de soucis ce truc.
Mais bon je n'ai pas le choix, vu le fonctionnement de ma librairie.
Les touches que je teste sont dans une Liste Ti-Basic. Le moteur de ma librairie effectue une boucle
en parcourant chaque elements "Row1Col1Row2Col2..." de la liste , puis fait une autre boucle pour chaque
RowCol de la chaine en appelant _keytest pour lire l'Etat de la touche.

Je ne peux donc plus retester les touches pour savoir si elle sont relachees.