IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Console.ReadKey() ve form aplikaci

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Neaktivní uživatel:30.11.2017 17:58

Ha há zase já :D Narazil jsem na problém: Ve console aplikaci je Console.ReadKey() což čeká na to než se stiskne klávesa a já potřebuju něco takového i ve form aplikaci. Zkusil jsem tohle:

while (true)
{
        if (Control.ModifierKeys == Keys.Enter)
        {
                bla bla bla něco...
        }
}

ale po tomhle mi aplikace zamrzne a už nerozmrzne a tak se ptám tady

Odpovědět
30.11.2017 17:58
Neaktivní uživatelský účet
Avatar
Peter Sciranka
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Peter Sciranka:30.11.2017 18:14

Ahoj, neviem či som to pochopil, ale asi si potrebuješ nadefinovať event, niečo v tomto zmysle:

private void textBox_KeyUp(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    MessageBox.Show("Enter key pressed");
  }
}
Nahoru Odpovědět
30.11.2017 18:14
Act as if it was Impossible to Fail
Avatar
Odpovídá na Peter Sciranka
Neaktivní uživatel:30.11.2017 18:50

Potřebuju aby form aplikace počkala dokud uživatel nezmáčkne klávesu (v console aplikaci se to dělá Console.ReadKey(); ale to ve form samozřejmě nefunguje)

Editováno 30.11.2017 18:53
Nahoru Odpovědět
30.11.2017 18:50
Neaktivní uživatelský účet
Avatar
Petr Balzer
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Balzer:30.11.2017 19:19

Je nutné nastavit v příslušném formuláři atribut KeyPreview na true (ve výchozím stavu je tam false) a potom ohandlovat KeyDown, KeyPress (nejoptimálnější) nebo KeyUp.

Nahoru Odpovědět
30.11.2017 19:19
Ono to ještě funguje?!?
Avatar
VitekST
Člen
Avatar
Odpovídá na Neaktivní uživatel
VitekST:30.11.2017 20:01

Pro počkání, dokud nenastane nějaká událost, použij třídu AutoResetEvent (https://msdn.microsoft.com/…vs.110).aspx).

Metoda WaitOne nevrátí hodnotu, dokud nezavoláš funkci Set, čímž volání metody WaitOne skončí a pokračuje se dále.

Pěkné vysvětlení je zde: http://programujte.com/…a-v-c-5-dil/

Nutno ale podotknout, že čekáním blokuješ hlavní vlákno, čímž zabraňuješ zpracovávání okenních zpráv, což má za následek "vytuhnutí" grafického rozhraní aplikace. Tento problém bych řešil vytvořením nového vlákna (třída Thread), odkud provedeš to, co jsi zamýšlel.

Veškerý kód aktualizující formulář a prvky v něm pak musí být obsažen v delegátovi, který se předá metodě Invoke na formuláři, který chceš aktualizovat, čímž se zavolá ve vlákně, ve kterém právě běží ten formulář. V opačném případě by ti akorát byla vyhozena výjimka TargetInvocati­onException.

Editováno 30.11.2017 20:03
 
Nahoru Odpovědět
30.11.2017 20:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.