[VB.NET] Toetsaanslag alleen opgevangen met keyup?

Pagina: 1
Acties:

  • The__Virus
  • Registratie: Januari 2005
  • Nu online
Ik wil graag voor een programma de knoppen opvangen die op het toetsenbord worden ingedrukt. Dus als ik de 1 indruk, dat er een bepaalde actie wordt uitgevoerd, bij 2 een andere enz.
Dit heb ik nu:
code:
1
2
3
4
5
    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.Enter Then
            btn1.Enabled = False
        End If
    End Sub

Alleen nu werkt het dus pas als de Key weer wordt losgelaten en ik wil dat ie constant door wordt uitgevoerd (dus als je de 1 inhoudt, de hele tijd die actie wordt uitgevoerd. Als de actie dan een 1 in een textbox zetten is, dat je een hele rij 1'en krijgt). Gebruik ik keydown, dan werkt het direct al niet meer. Keypress werkt weer iets anders:
code:
1
2
3
4
5
    Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
        If e.KeyChar = Chr(Keys.Enter) Then
            btn1.Enabled = False
        End If
    End Sub

Maar ook deze werkt niet.

Mijn vragen:
1. Welke van de drie soorten moet ik gebruiken voor mijn doel? (zelf denk ik keypressed)
2. Hoe krijg ik deze werkend?

Evt. mag het ook zo zijn dat je herhaaldelijk op de toets moet drukken om een hele reeks te krijgen, dat is niet zo'n probleem. Echter, het mag dus niet met KeyUp zijn, aangezien dat te 'traag' werkt.
Ik heb in de Form1_load al Me.KeyPreview = True gezet, aangezien dat nodig bleek te zijn (raar dat het niet tussen de eigenschappen staat van het form zelf in de designer :|).

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 11:13

Reptile209

- gers -

KeyPress kan je gebruiken om de user herhaaldelijk op dezelfde (of een andere) toets te laten drukken. Met een combo van KeyDown en KeyUp kan je een automagisch repeterend geheel maken.
Bij een KeyDown start je een lus die elke bijvoorbeeld 200 ms de gewenste actie uitvoert. Deze lus let ook op een flag die door KeyUp kan worden gezet (of gewist, wat jij wil :)) dat de key is losgelaten en dat de lus dus moet stoppen. In plaats van een lus zou je (makkelijker) met een timer van bijv. 200 ms kunnen werken die checkt of hij nog "verder mag" (diezelfde flag) en dan de actie uitvoert.

[ Voor 5% gewijzigd door Reptile209 op 02-07-2006 21:21 ]

Zo scherp als een voetbal!


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Dit werkt bij mij ook gewoon hoor om herhaaldelijk iets in de textbox te zetten:

C#:
1
2
3
4
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
         textBox1.Text += e.ToString();
}


Als je wil kijken of het een enter is:

C#:
1
2
3
4
5
6
7
8
9
10
11
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
       if (e.KeyChar==(char)13)
       {
            textBox1.Text += "Enter!"; // of whatever
       }
       else
        {
             textBox1.Text += e.ToString();
         }
}

  • The__Virus
  • Registratie: Januari 2005
  • Nu online
C# begrijp ik dus niet helemaal en het probleem is dus dat hij gewoon de toetsaanslag niet pakt, terwijl hij dat wel zou moeten. Waarom pakt hij alleen KeyUp? :?

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
The__Virus schreef op maandag 03 juli 2006 @ 04:50:
C# gegrijp ik dus niet helemaal en het probleem is dus dat hij gewoon de toetsaanslag niet pakt, terwijl hij dat wel zou moeten. Waarom pakt hij alleen KeyUp? :?
Het form vangt alleen alle keyevents af als je de property "KeyPreview" van je form op true zet, anders krijg je deze events niet als je een anders control op het form geselecteerd hebt.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
:?

Visual Basic:
1
2
3
4
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
     If e.KeyChar == (char)13 Then textBox1 = textBox1 + "Enter!"
     Else textBox1 = textBox1 +  e.ToString();
End Sub

  • The__Virus
  • Registratie: Januari 2005
  • Nu online
Ik wil jullie hartelijk bedanken, alles werkt naar behoren. Het blijkt dat de Enter het niet doet, maar de toetsen die ik eigenlijk nodig heb wel. Wel vreemd dat enter nog steeds niet wordt gepakt:
code:
1
2
3
        If e.KeyChar = Chr(Keys.Enter) Then
            Label1.Text = 1
        End If

Die pakt ie niet.
code:
1
2
3
        If e.KeyChar = Chr(Keys.D1) Then
            Label1.Text = 1
        End If

En deze wel :? Heeft iemand daar nog een antwoord op? Dan kan mijn dag niet meer stuk ;). Iig hartelijk dank voor jullie hulp en geduld ;).

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
The__Virus schreef op maandag 03 juli 2006 @ 16:20:
En deze wel :? Heeft iemand daar nog een antwoord op? Dan kan mijn dag niet meer stuk ;). Iig hartelijk dank voor jullie hulp en geduld ;).
Probeer eens:
Visual Basic .NET:
1
2
3
        If e.KeyChar = CType(13, Char) Then
            Label1.Text = 1
        End If

  • The__Virus
  • Registratie: Januari 2005
  • Nu online
Visual studio geeft aan dat het dit moet zijn (het scheelt maar heel weinig ;)):
code:
1
2
3
        If e.KeyChar = CType(ChrW(13), Char) Then
            Label1.Text = 1
        End If

En het werkt, mits ik eerst in een textbox geklikt heb :? De 1 pakt ie prima, maar zodra ik ENTER gebruik moet ik eerst in een textbox geklikt hebben, nergens anders helpt, enkel een textbox :|.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Misschien zo?
Maak een PreviewKeyDown event aan, en schrijf in de eventhandler:

Visual Basic .NET:
1
2
3
4
5
Private Sub Form1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
        If e.KeyCode = Keys.Enter Then
            btn1.Enabled = False
      End If
End Sub

  • The__Virus
  • Registratie: Januari 2005
  • Nu online
Ook hier geldt dat het wel voor de 1 enzo werkt, maar niet voor de enter :'(
Pagina: 1