C#/Compact Framework - Form KeyDown registreert 1 event 2x?

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 27-11 13:59
Hoi, voor een project heb ik een PDA applicatie gemaakt, deze applicatie registreert de vierpuntstoets op een PDA (die joystick onderaan), aan de hand hiervan worden verschillende bewerkingen gedaan.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
                if ((e.KeyCode == System.Windows.Forms.Keys.Up))
                {
                    if (menulbx.SelectedIndex > 0)
                        menulbx.SelectedIndex--;
                    speelStemgeluid((string)menulbx.Items[menulbx.SelectedIndex]);
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Down))
                {
                    if (menulbx.SelectedIndex < menulbx.Items.Count)
                        menulbx.SelectedIndex++;
                    speelStemgeluid((string)menulbx.Items[menulbx.SelectedIndex]);
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Left))
                {
                    // Left
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Right))
                {
                    // Right
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
                {
                    SelecteerMenu();
                }
        }

hier de code die achter het event zit.
Mijn probleem is dat de bewegingen (Left,Up,Right,Down) 2x geregistreerd worden (dus hij meteen twee plekken verspringt in de listbox) in plaats van 1x. Hoe komt dit probleem en belangrijker hoe losi k het op?

Owja, de Enter word maar 1x geregistreerd

Mess with the best, die like the rest


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Misschien dat de d-pad op een PDA sneller in repeat-modus springt? Je zou met een timer kunnen afvangen dat er te snel door de lijst gescrolld wordt.

Certified smart block developer op de agile darkchain stack. PM voor info.


Verwijderd

Gebruik een bool die standaard false is, wanneer de toets ingedrukt wordt, gaat de bool op true. Wanneer je dan voor de tweede keer bij het event komt, mag je (aan de hand van de bool value) dit keer WEL het event uitvoeren en zet 'm aan het einde van het event weer op false.

Misschien dat je er zo een workaround voor kan maken? Of probeer anders er doorheen te stappen dan zie je goed wat er gebeurt.

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 27-11 13:59
Verwijderd schreef op vrijdag 15 juni 2007 @ 09:32:
Gebruik een bool die standaard false is, wanneer de toets ingedrukt wordt, gaat de bool op true. Wanneer je dan voor de tweede keer bij het event komt, mag je (aan de hand van de bool value) dit keer WEL het event uitvoeren en zet 'm aan het einde van het event weer op false.

Misschien dat je er zo een workaround voor kan maken? Of probeer anders er doorheen te stappen dan zie je goed wat er gebeurt.
geprobeert, het vreemde is dat hij nu de eerste keer het wel goed doet, maar de tweede keer weer snel verspringt

Mess with the best, die like the rest


Verwijderd

Loop er eens stap voor stap door. Met de debugger. Zie waar het fout gaat, staat je bool misschien op een verkeerde plaats?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        bool CanReact = false;

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // mogen we reageren dan...
            if(CanReact)
            {
                if ((e.KeyCode == System.Windows.Forms.Keys.Up))
                {
                    if (menulbx.SelectedIndex > 0)
                        menulbx.SelectedIndex--;
                    speelStemgeluid((string)menulbx.Items[menulbx.SelectedIndex]);
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Down))
                {
                    if (menulbx.SelectedIndex < menulbx.Items.Count)
                        menulbx.SelectedIndex++;
                    speelStemgeluid((string)menulbx.Items[menulbx.SelectedIndex]);
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Left))
                {
                    // Left
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Right))
                {
                    // Right
                }
                if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
                {
                    SelecteerMenu();
                }
                // terugzetten
                CanReact = false;
            }
            else // mogen we niet reageren dan zetten we 'm op true en dan komen we de
                   // tweede keer wel in de bovenstaande keyhandling
                CanReactie = true;
        }

[ Voor 86% gewijzigd door Verwijderd op 15-06-2007 12:17 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:34

mulder

ik spuug op het trottoir

Misschien kun je beter het KeyPress of KeyUp event gebruiken?

oogjes open, snaveltjes dicht


  • smallboy
  • Registratie: September 2000
  • Laatst online: 26-11 19:11

smallboy

N/A

Is het niet omdat een down standaard (als de focus op de listbox staat) al het volgende item selecteert?

Als je perse zelf de selectie wilt zetten, kun je misschien: e.Handled = true zetten (niet getest)

[ Voor 34% gewijzigd door smallboy op 15-06-2007 18:13 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Kleine tip: maak er "else if"jes of een switch van. Nu ga je altijd alle if'jes langs, ook als de eerste al meteen raak is.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Kennelijk geeft hij dan 2x een KeyDown door, wellicht doordat de key delay heel laag staat. Moet je ff kijken of je dat ergens in het OS zelf in kan stellen.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

De key wordt door je nergens op handled gezet. Dat zorgt ervoor dat jouw code de index in de lijst verzet, maar vervolgens de Windows Mobile versie die op de PDA draait ook. Zet de handled property van de key op true, en waarschijnlijk ben je van je probleem af ....

Zie ook smallboy zijn post ...

[ Voor 8% gewijzigd door OZ-Gump op 16-06-2007 11:38 . Reden: lezen Gump, LEZEN ]

My personal website


  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 27-11 13:59
ongelofeloos :) e.Handled = true; was de oplossing, ik vond het wel raar dat ie soms 1 stap deed en soms 2 stappen, terwijl hij toch geselecteer was. :)

Mess with the best, die like the rest

Pagina: 1