Eventy tlačítka   zodpovězená otázka

VB.NET, Windows Phone, WinForms

Zdrávím, mám drobný problém který zřejmě způsobený tím, že jsem špatně pochopil eventy tlačítka (button).

Všiml jsem si že button má kromě bežně využívané události click i keyPress, KeyDown a KeyUp. Chtěl jsem využít KeyPress aby se mi pořád dokola spouštěla procedura namapovaná na tuto událost, dokud tlačítko držím. Tato událost se mi ale při stisku tlačítka myší vůbec nevyvolá.

Takže moje otázka: týka se událos KeyPress vůbec daného buttonu nebo se jedná o vstup z klávesnice (mate mě tam to slovo Key).

Pro upřesnění ještě uvádím že tento problém řeším v aplikaci pro windows mobile, ale počítám s tím že tak základní věc jako je button bude fungovat stejně jako v klasické windows form aplikaci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud máte stisknutou klávesu klávesnice, opakuje se KeyDown - KeyPress, po uvolnění klávesy KeyUp - míníte-li tlačítkem tlačítko myši, pochopitelně se neprovede událost klávesnice, ale událost myši Mouse...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nene, já jsem právě myslel tlačítko které je umístěno na formuláři. (system.windows.forms.button)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, píšu o událostech tlačítka - tedy o Button1_KeyDown, Button1_KeyPress, Button1_KeyUp

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Naprostá hloupost. Než něco napíšete, ověřte si to. Při stisku klávesy představující tisknutelný znak se opakuje pouze událost KeyPress, událost KeyDown nastane pouze jednou. Při stisku jiné (řídící) klávesy nastane pouze událost KeyDown, také pouze jednou.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Naprostá hloupost. Než něco napíšete, ověřte si to

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Při stisku jiné (řídící) klávesy nastane pouze událost KeyDown, např. Shift, ale při držení klávesy se opakuje!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Události KeyPress a KeyDown, náležící třídě Control a všem odvozeným třídám se týkají výhradně vstupu z klávesnice, s klepáním na tlačítko nemají nic společného. Rozdíl mezi těmito událostmi je ten, že KeyPress rozlišuje stisknutí kláves představujících tisknutelné znaky, zatímco KeyDown nastává i při stisku řídících kláves (Ctrl, Alt, Shift apod.). Pokud stisknete klávesu představující tisknutelný znak, KeyPress nastane jako první, potom KeyDown.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, myslel jsem si že jsem to špatně pochopil. Takže pokud budu potřebovat monitorovat zda je tlačítko (system.windows.forms.button) stisknuté, musím si vystačit s událostí click například spuštěním nějákého cyklu který bude stisk kontrolovat? Nebo na to jdu zase uplně špatně?:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jedině tak, že si při KeyDown/MouseDown nastavíte nějaký příznak a při KeyUp/MouseUp ho zase zrušíte. Událost Click říká, že na tlačítko bylo klepnuto (ať už myší nebo klávesnicí), neřeší jestli je stisknuto nebo uvolněno.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Netušil jsem že bude problém odchytit událost KeyPress buttonu. Zkusím to tedy vyřešit něják jinak.

Ale i tak děkuji:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Button1_Click nenastane při události klávesnice, jen myši

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ale nastane, pokud tlačítko stisknete mezerníkem, Enterem, nebo pomocí akcelerátoru (Alt+<písmeno>), tak je událost Click také vyvolána.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Při stisku a uvolnění tisknutelné klávesy vč. mezery se první provede KeyDown. Při stisku a uvolnění řídích kláves po KeyDown následuje KeyUp. Při stisku a uvolnění Enteru jenom KeyUp a to x i při držení Enteru

nahlásit spamnahlásit spam 0 odpovědětodpovědět

vypadla jednička - Při stisku a uvolnění Enteru se provede jenom KeyUp a to pouze 1x i při držení Enteru

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není pravda. První nastává KeyPress.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Při aktivním Button1 po stisku klávesy "a":

KeyDown - 65

KeyPress - a

KeyUp - 65

při prdržení klávesy "a":

KeyDown - 65

KeyPress - a

KeyDown - 65

KeyPress - a

KeyDown - 65

KeyPress - a

KeyUp - 65

při přidržení "Shift":

KeyDown - 16

KeyDown - 16

KeyDown - 16

KeyUp - 16

po "Enter":

KeyUp - 13

Vypsáno s

  Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown
    Debug.Print("KeyDown - " & e.KeyValue)
  End Sub

  Private Sub Button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Button1.KeyPress
    Debug.Print("KeyPress - " & e.KeyChar)
  End Sub

  Private Sub Button1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyUp
    Debug.Print("KeyUp - " & e.KeyValue)
  End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě si nedokážu nijak vysvětlit, proč s použitím stejných událostí ale MessageBoxu místo Debug.Print se jako první zobrazí MessageBox identifikující jako první KeyPress...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

...a navíc se neprovede KeyUp

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback