Appuie sur touche plus ou moins long

CeetixCeetix Membre
02:29 modifié dans API AppKit #1
Bonjour !

Voilà  j'ai un petit souci, en effet j'aimerai qu'en appuyant sur une touche de mon clavier je puisse afficher un message. Exemple : appuie de 1 seconde sur "pomme" affiche : Vous avez appuyé 1 seconde. Et dès que je passe à  plus de 5 secondes : Vous avez appuyé plus de 5 secondes.  Et si je relâche avant 1 ou 5 seconde on remette à  0 tout ça.
Je pensais utiliser les timers mais j'ai vraiment du mal :(

Si vous pouviez m'aider ce serait cool.
Merci !

Réponses

  • CéroceCéroce Membre, Modérateur
    02:29 modifié #2
    NSResponder (dont hérite NSView, entre autres) propose deux méthodes: -keyDown: et -keyUp:.

    Tu peux mémoriser l'heure d'appui sur la touche dans -keyDown:.
    Quand -keyUp est appelée, tu peux calculer la différence de temps depuis l'appui de la touche.
    Attention, il faudra vérifier qu'il s'agit de la bonne touche en décortiquant l'événement reçu.

    Pour connaà®tre le nombre de ticks écoulés depuis le lancement du processus, tu peux utiliser la fonction clock() définie dans time.h (bibliothèque standard du C). Sachant qu'il y a CLK_TCK ticks dans une seconde.
    Il y a sûrement une meilleure fonction, mais je n'arrive pas à  trouver dans mes docs.
  • NoNo Membre
    02:29 modifié #3
    Attention, keyUp et keyDown de NSResponder ne vont sans doute pas être appelés par l'appui de POMME(et des autres touches de modifications).

    Le plus simple est de sous-classer la fenêtre qui va recevoir les évènement, et redéfinir la méthode sendEvent:.
    Cette méthode reçoie un NSEvent en paramètre.
    Il suffit alors d'examiner :
    - son type (NSKeyDown, NSKeyUp et NSFlagsChanged),
    - le code de la touche (keycode, modifierFlags ou characters),
    - son timestamp (nombre de secondes écoulées depuis le dernier boot).
    La différence entre les 2 timestamp, celui de l'appui de la touche, puis celui de son relachement donnera le temps...
  • CeetixCeetix Membre
    02:29 modifié #4
    Bon alors chaque chose en son temps, j'assaie déjà  d'envoyer un message quand je clique sur le bouton de ma souris :

    <br />- (void)mouseDown(NSEvent *)event<br />{<br />	NSLog(@&quot;hello&quot;);<br />}<br />
    


    Et il y a déjà  une erreur ... J'ai oublié un truc c'est sur mais quoi?
  • AliGatorAliGator Membre, Modérateur
    02:29 modifié #5
    Ca veut dire quoi "y'a une erreur" ?
    Ca compile pas ? ça link pas ? t'as pas ton log ? ça crash à  l'exécution ? T'as ton log mais pas au moment où tu veux ?
  • CeetixCeetix Membre
    02:29 modifié #6
    Arf oui dsl j'ai meme dit ce que le compilateur me met :s .

    "error: syntax error before '(' token "
  • CeetixCeetix Membre
    02:29 modifié #7
    Bon eu suis un boulet. Ca fiat longtemps que j'ai pas touché à  l'objective c et en cours on fait que du C ^^.
    J'ai oublié le ":" avant "(" .
    Bref là  ca compile mais quand que je clique down rien ne se passe dans la console.
  • CeetixCeetix Membre
    02:29 modifié #8
    Bon j'ai reussi. Il fallait creer une NSView sous IB....
    Donc là  jai bien mon message qui s'affiche. C'est déjà  bien ^^.
    Vais essayer de continuer.
  • CeetixCeetix Membre
    02:29 modifié #9
    Je me permets de upper ce poste car je suis en train d'essayer mon programme en mettant en place l'appuie sur touche plus ou moins long.

    J'arrive donc a identifer la touche pressée, et a afficher l'heure (format assez bizar :"2406642" par ex) quand je la presse et a afficher l'heure quand je la relache. Le soucis c'est quand je reste appuyé sur ma touche mon timestamp s'actualise donc j'aurai appué longtemps, l différence de temps entre keyDown et keyUp sera toujours nulle.
    Vous voyez mon soucis ? :)
  • CeetixCeetix Membre
    02:29 modifié #10
    Bon eu encore une fois apres une grande reflection j'ai utilisé la fonction :

    (BOOL)isRepeat  pour savoir si ma touche etait restée enfoncée. Si c'est pas le cas on prend timestamp sinon on fait rien et hop le tour est joué ;)
  • CeetixCeetix Membre
    02:29 modifié #11
    J'up ce message car je cherche un moyen de connaitre en temps réel via un label le nombre de millisecondes quand je reste appuyé sur une touche. J'ai regardé dans la doc mais j'ai pas vu ce qui pourrait m'aider...
  • laudemalaudema Membre
    02:29 modifié #12
    dans 1244562820:

    J'up ce message car je cherche un moyen de connaitre en temps réel via un label le nombre de millisecondes quand je reste appuyé sur une touche. J'ai regardé dans la doc mais j'ai pas vu ce qui pourrait m'aider...


    NSDate ? Tu as une fonction de classe:
    [tt]
    + (NSTimeInterval)timeIntervalSinceReferenceDate
    timeIntervalSinceReferenceDate
    Returns the interval between the first instant of 1 January 2001, GMT and the current date and time.
    [/tt]

    Et NSObject (et sa méthode d'instance) performSelector:
    [tt]
    performSelector:withObject:afterDelay:inModes:
    Invokes a method of the receiver on the current thread using the specified modes after a delay.

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes
    [/tt]

    Enfin, j'essayerais comme ça..


  • CeetixCeetix Membre
    02:29 modifié #13
    Ok je vais essayer vers cette voie . Merci .
Connectez-vous ou Inscrivez-vous pour répondre.