Actions selon la durée de pression d'une touche

Actions selon la durée de pression d'une touche - C#/.NET managed - Programmation

Marsh Posté le 14-03-2009 à 13:39:45    

Alors déja, connaissez vous le morse?
Je voudrais le retranscrire en c# donc en gros quand j'appuie sur la barre d'espace plus de "n" temps je veux un certain caractère et si c'est moins de "n" temps je veux afficher un autre caractère.
SI quelqu'un a des idées je suis PRENEUR!!!!! je planche dessus depuis un certain temps mais rien d'interessant malheuresement! Merci beaucoup
 
voici mon essai, mais rien ne s'affiche :  
 

Code :
  1. private void textBox2_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  2.         {
  3.             Stopwatch Temps = new Stopwatch();
  4.             if (e.KeyCode == Keys.Back)
  5.             {
  6.                 Temps.Start();
  7.             }
  8.             if (e.KeyData != Keys.Back)
  9.             {
  10.                 Temps.Stop();
  11.             }
  12.             TimeSpan ts = Temps.Elapsed;
  13.             if (ts.Milliseconds > 1000)
  14.             {
  15.                 textBox2.Text = ".";
  16.             }
  17.             else
  18.             {
  19.                 textBox2.Text = "-";
  20.             }
  21.         }


 
Merci de votre aide

Reply

Marsh Posté le 14-03-2009 à 13:39:45   

Reply

Marsh Posté le 15-03-2009 à 13:02:22    

Pourquoi ne pas mettre ton Stopwatch dans la déclaration de ta Form, l'activer dans le KeyDown, l'arrêter dans le KeyUp, et de là récupérer la valeur du Stopwatch et mettre à jour ton textBox?


---------------
Another .Net Blog
Reply

Marsh Posté le 15-03-2009 à 13:21:04    

oui faut traiter les deux events.
KeyDown et KeyUp


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
Reply

Marsh Posté le 15-03-2009 à 17:49:47    

Donc après des recherches, Déja je prends F3 comme touche d'appui!
j'ai ça :  
 

Code :
  1. private DateTime t1;
  2.         private bool isKeyDown = false;
  3.         private void textBox2_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (!isKeyDown && e.KeyCode == Keys.F3)
  6.             {
  7.                 isKeyDown = true;
  8.                 t1 = DateTime.Now;
  9.             }
  10.         }
  11.         private void textBox2_KeyUp(object sender, KeyEventArgs e)
  12.         {
  13.             if (isKeyDown)
  14.             {
  15.                 isKeyDown = false;
  16.                 WriteCode(sender, DateTime.Now - t1);
  17.             }
  18.         }
  19.         private void WriteCode(object sender, TimeSpan tps)
  20.         {
  21.             String toWrite;
  22.             if (tps.TotalMilliseconds >= 1000)
  23.                 toWrite = "-";
  24.             else
  25.                 toWrite = ".";
  26.             textBox2.Text = toWrite;
  27.         }


 
 
Ca compile,s'execute mais ne fait rien quand j'appuie sur F3, des idées?

Reply

Marsh Posté le 15-03-2009 à 19:02:41    

Et quand en debug, tu arrives pas à voir ce qui se passe (pas bien)?


---------------
Another .Net Blog
Reply

Marsh Posté le 15-03-2009 à 22:15:55    

A vrai dire, je ne connais pas très bien la programmation donc quand tu m parles de debug, ça ne me dit rien dsl. Le problème c'est que le prog ne rentre même pas dans la première fonction, j'ai mis un printf (enfin l'équivalent) dans le if dans la 1ère fonction, j"appuie sur f3 et rien ne s'affiche. Il me manque un je ne sais quoi qui m'énerve!

Reply

Marsh Posté le 15-03-2009 à 22:33:17    

Le F3 tu le fais bien qd tu es sur ta texbox2 ?

Reply

Marsh Posté le 16-03-2009 à 10:13:40    

chiqitos a écrit :

Il me manque un je ne sais quoi qui m'énerve!


Fais des recherches pour ce que c'est que le mode debug, tu verras que ça pourra t'aider grandement  :D  
 
Et comment tu sais que tu ne rentres pas dans la première fonction d'abord?


---------------
Another .Net Blog
Reply

Marsh Posté le 16-03-2009 à 12:37:58    

Oui, j'appuie bien sur f3 dans la textbox2.
Sinon merci pour le debug, je me renseignerai.
 
Alors pour le fait que je ne rentre pas dans la première fonction, voici mon code :  
 

Code :
  1. private DateTime t1;
  2.         private bool isKeyDown = false;
  3.         private void textBox2_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (!isKeyDown && e.KeyCode == Keys.Control)
  6.             {
  7.                 isKeyDown = true;
  8.                 textBox2.Text = "test";
  9.                 t1 = DateTime.Now;
  10.             }
  11.         }


 
Donc normalement, si j'appuie sur control dans la textBox2, le mot test devrait apparaitre dans la textbox2, non? Et bah quand j'essaye rien ne se fait.


Message édité par chiqitos le 16-03-2009 à 12:39:06
Reply

Marsh Posté le 16-03-2009 à 17:20:41    

Code :
  1. private DateTime time;
  2.         private bool pressed;
  3.         private void textBox1_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             if (e.KeyCode == Keys.F3 && !pressed)
  6.             {
  7.                 time = DateTime.Now;
  8.                 pressed = true;
  9.             }
  10.         }
  11.         private void textBox1_KeyUp(object sender, KeyEventArgs e)
  12.         {
  13.             if (e.KeyCode == Keys.F3)
  14.             {
  15.                 TimeSpan holdTime = DateTime.Now.Subtract(time);
  16.                 if (holdTime.TotalMilliseconds >= 1000)
  17.                 {
  18.                     textBox1.Text += "-";
  19.                 }
  20.                 else
  21.                 {
  22.                     textBox1.Text += ".";
  23.                 }
  24.                 pressed = false;
  25.             }
  26.         }


L'astuce ici est que tant que tu gardes F3 appuyé, l'événement KeyDown est appelé, et donc time prend à chaque fois la même valeur, ce qui fait que tu auras toujours un temps < 1000ms entre le moment où tu relaches la touche et celui où l'évènement OnKeyUp est appelé. D'où le flag pressed qui se charge de ne pas mettre à jour le temps si la touche est déjà enfoncée...


---------------
Another .Net Blog
Reply

Marsh Posté le 16-03-2009 à 17:20:41   

Reply

Marsh Posté le 16-03-2009 à 18:59:14    

Merci pour ces précisions, mais cela marche t-il chez toi? j'essaye encore en laissant des traces (printf) mais rien ne s'affiche.  
Tu es sûr de ton : TimeSpan holdTime = DateTime.Now.Subtract(time); ?  
Je ne connaissais pas. Merci ;)

Reply

Marsh Posté le 16-03-2009 à 20:22:27    

Oui, je suis sûr, et oui ça marche :)


---------------
Another .Net Blog
Reply

Marsh Posté le 16-03-2009 à 21:05:52    

Donc chez toi ça marche, et chez moi non... :D
 
Alors s'il te plaît, vois-tu une erreur (même surement conne du fait que je commence la programmation) dans mon code:  
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using SpeechLib;
  11. namespace MorseC
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.        
  20.  
  21.         private DateTime time;
  22.         private bool pressed;
  23.  
  24.         private void textBox1_KeyDown(object sender, KeyEventArgs e)
  25.         {
  26.             if (e.KeyCode == Keys.F3 && !pressed)
  27.             {
  28.                     time = DateTime.Now;
  29.                     pressed = true;
  30.              }
  31.         }
  32.  
  33.         private void textBox1_KeyUp(object sender, KeyEventArgs e)
  34.         {
  35.                if (e.KeyCode == Keys.F3)
  36.                {
  37.                    TimeSpan holdTime = DateTime.Now.Subtract(time);
  38.  
  39.                    if (holdTime.TotalMilliseconds >= 1000)
  40.                    {
  41.                       textBox1.Text += "-";
  42.                    }
  43.                    else
  44.                    {
  45.                        textBox1.Text += ".";
  46.                    }
  47.  
  48.                    pressed = false;
  49.                }
  50.          }
  51.     }
  52. }


 
J'ai supprimé les autres fonctions de ce code pour simplifier la vision. Vois tu quelque chose?

Reply

Marsh Posté le 17-03-2009 à 08:51:16    

Je vais dire quelque chose de bête mais tu as rajouté tes méthodes aux évènements KeyDown et KeyUp de ton textBox ?
 
Bon après comme dit plus haut ca serait plus simple de mettre un breakpoint au début de chaque méthode et de vérifier si elles sont bien exécutées en debug.
 
PS: Tu as bien sélectionné ton textBox avant d'appuyer sur une touche ?


Message édité par Tarabiscote le 17-03-2009 à 13:37:06
Reply

Marsh Posté le 17-03-2009 à 16:04:12    

Quand tu perles des méthodes, c'est mettre:  
 
public event KeyEventHandler KeyUp;
public event KeyEventHandler KeyDown;
 
???  
 
D'ailleurs cela se met où? Entre les fonctions?  
 
Sinon à chaque fois, je selectionne bien le bon textBox avant d'appuyer sur la touche ;) Merci

Reply

Marsh Posté le 17-03-2009 à 16:19:52    

Dans l'éditeur, tu dois sélectionner ton textbox, aller dans ses propriétés, et double cliquer sur les évènements KeyUp et KeyDown, ce qui aura pour effet de créer automatiquement les fonctions textBox1_KeyUp et textBox1_KeyDown.
 
Pour savoir si tu passes bien dans ces fonctions, tu dois cliquer au niveau de la première ligne de chaque fonction sur le bandeau tout à gauche de ta fenêtre de code, ce qui aura pour effet de surligner la ligne en rouge.
 
Ensuite tu vérifies que tu compiles bien en debug et pas en release, et ensuite tu lances ton programme en sélectionnant le menu Debug > Start Debugging (j'ai pas de VS en français)
 
Normalement quand tu passeras dans les fonctions VS viendra au 1er plan et t'indiquera sur quelle ligne tu te trouves actuellement.


---------------
Another .Net Blog
Reply

Marsh Posté le 18-03-2009 à 13:36:27    

Sinon à la main dans le constructeur:
 
textBox1.KeyDown += new EventHandler(textBox1_KeyDown);
 
Et il faut que tu saches debuuguer une application en effet, c'est vital :D

Message cité 1 fois
Message édité par ov3rflow le 18-03-2009 à 13:37:24
Reply

Marsh Posté le 18-03-2009 à 15:02:44    

ov3rflow a écrit :

Sinon à la main dans le constructeur:
 
textBox1.KeyDown += new EventHandler(textBox1_KeyDown);


Pas besoin de se faire chier avec ça, l'EDI le fait tout seul quand on affecte un évènement


---------------
Another .Net Blog
Reply

Marsh Posté le 18-03-2009 à 18:20:33    

:jap:
 
Ca va super vite aussi quand on le tape , la touche tab est ton amie :D
 
Moi j'aime pas trop passer par l'éditeur pour ça, mais c'est surement des habitudes de vieux :D, ça évite de switcher entre l'éditeur et le code quand on fait des tests.


Message édité par ov3rflow le 18-03-2009 à 18:21:27
Reply

Marsh Posté le 18-03-2009 à 20:14:19    

:) Quand je dis que je débutais en C#, je débutes vraiment, je ne connaissais pas le système d'événements (l'éclair dans les propriétés)... Donc maintenant ça marche , merci beaucoup à vous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed