2. diel - Analýza dát zo vstupu z klávesnice
V minulej lekcii, Zadávanie vstupu z klávesnice , sme si predstavili možnosti zaistenia dátového vstupu z klávesnice pomocou metód a vlastností triedy Console - Read (), ReadLine () a ReadKey ().
V dnešnom C# tutoriálu sa naučíme efektívne analyzovať informácie,
ktoré sú z klávesnice zadávané. Uvidíme, že trieda Console
vie nielen načítať znaky, ktoré každej klávese prislúcha, ale že nám o
každej stlačené klávese dokáže odovzdať viac údajov. A tieto údaje
potom môžeme ľahko využiť na ovládanie svojich aplikácií.
Objekt ConsoleKeyInfo
Najprv si ukážeme, ako v jednom kroku zistiť názov stlačené klávesy a jej znak, a potom tiež kombináciu stlačených kláves.
Klávesa a znak
Zatiaľ sme sa naučili, ako použiť metódu ReadKey()
spolu s
vlastnosťami Key
a KeyChar
. Je to jednoduché a
funguje to dobre, avšak má to jednu nevýhodu. Získame iba malú časť
informácií, ktoré by sme získať mohli - buď len názov stlačené
klávesy, alebo len znak, ktorý klávesa
reprezentuje. Už pri zadávaní príkazu sa tak musíme rozhodnúť, akú
informáciu potrebujeme.
Existuje možnosť načítať pomocou ReadKey()
komplexné informácie o stlačené tlačidlu a uložiť ju do
premennej typu ConsoleKeyInfo
. Potom si z nej môžeme zistiť
potrebné informácie.
ConsoleKeyInfo
je objekt, ktorý podáva
úplný opis klávesy, ktorá bola stlačená, a to
vrátane stavu klávesov SHIFT, ALT a CTRL.
Na objekte ConsoleKeyInfo
môžeme volať tri atribúty ako
vlastnosti: Key
, KeyChar
a Modifiers
.
Vlastnosti Key
a KeyChar
sme si už predstavili
priamo pri metódy ReadKey()
. Tieto vlastnosti nám umožňujú
získať z klávesnice buď názov klávesy, alebo
znak, ktorý klávesa reprezentuje. Na objekte
ConsoleKeyInfo
tieto vlastnosti fungujú rovnako, ale s tým
rozdielom, že použitím objektu ConsoleKeyInfo
môžeme zistiť
oboje naraz.
V nasledujúcom príklade najskôr deklarujeme premennú zadani
ako typ ConsoleKeyInfo
, a potom do nej načítame znak metódou
ReadKey()
. Potom za použitia vlastností KeyChar
a
Key
môžeme zistiť ako zapísaný znak, tak aj názov stlačené
klávesy:
ConsoleKeyInfo zadani; Console.Write("Stlač klávesu"); zadani = Console.ReadKey(true); Console.WriteLine ("\ NZnak =" + zadani.KeyChar); Console.WriteLine ("Klávesa =" + zadani.Key);
Výstupom bude:
Konzolová aplikácia
Stiskni klávesu
Znak = g
Klávesa = G
Kombinácie klávesov
Objekt ConsoleKeyInfo
ponúka ešte tretiu vlastnosť, a to
vlastnosť Modifiers
, ktorá vracia bitovú kombináciu
stlačených kláves SHIFT, ALT a
CTRL. Tejto vlastnosti sa potom využíva v spojení s výpočtom
ConsoleModifiers
na určenie, ktorá z funkčných klávesov bola
stlačená.
Nerozlišujú sa ľavej a pravej klávesy SHIFT a CTRL. Klávesa pravá ALT sa správa tak, ako by bola stlačená kombinácie klávesov ľavá ALT + CTRL.
Ukážme si prakticky, ako informácie uložené v objekte
ConsoleKeyInfo
využiť pomocou volania vlastností
Key
, KeyChar
a Modifiers
: Najskôr si
deklarujte premennú zadani
typu ConsoleKeyInfo
a
reťazec vypis
typu string
pre uloženie
výsledku:
ConsoleKeyInfo zadani;
string vypis;
V ďalšom kroku vyzveme používateľov ku stlačení nejakej
kombinácie klávesov, alebo klávesy ESC pre
ukončenie. V kódu je použitý špeciálny znak \n
pre
odriadkovanie:
Console.WriteLine("Stlač kombináciu znaku a klávesy SHIFT, ALT a CTRL, \ nalebo pre ukončenie stlač ESC");
Následne vytvoríme cyklus, ktorý nám umožní zadávať znaky opakovane,
kým nebude stlačený kláves ESC. Pre podmienku je použitá
vlastnosť Key
v spojení s výpočtom ConsoleKey
pre
kontrolu stlačení klávesy ESC:
do { } while (zadani.Key != ConsoleKey.Escape);
Ďalšie príkazy píšeme dovnútra cyklu. Najprv
stlačenú kombináciu klávesov načítame do zadani
a použijeme
pritom parameter true
, aby sa znak pri zadávaní nevypisoval. Do
reťazca vypis
vložíme začiatok výpisu:
zadani = Console.ReadKey(true); vypis = "Stlačil si kláves:"
Nasleduje kontrola stlačení klávesov SHIFT, ALT,
alebo CTRL pomocou porovnania vlastnosti
Modifiers
s výpočtom ConsoleModifiers
. Pretože
informácie o stlačených klávesoch je uložená ako bitová
kombinácia, pre porovnanie s výpočtom sa používa bitový
logický operátor AND
&. Nájdenú kláves pridáme
do reťazca vypis
:
if ((zadani.Modifiers & ConsoleModifiers.Alt) != 0) vypis += "Alt +"; if ((zadani.Modifiers & ConsoleModifiers.Shift) != 0) vypis += "Shift +"; if ((zadani.Modifiers & ConsoleModifiers.Control) != 0) vypis += "Ctrl +";
Potom reťazec vypis
skompletizujeme informáciami z vlastností
Key
a KeyChar
a výsledok vypíšeme:
vypis += zadani.Key.ToString();
vypis += "znak =" + zadani.KeyChar;
Console.WriteLine(vypis);
Kompletný kód potom vyzerá takto:
{CSHARP_CONSOLE} ConsoleKeyInfo zadani; string vypis; Console.WriteLine("Stlač kombináciu znaku a klávesy SHIFT, ALT a CTRL, \ nanebo pre ukončenie stlač ESC"); do { zadani = Console.ReadKey(true); vypis = "Stlačil si kláves:"; if ((zadani.Modifiers & ConsoleModifiers.Alt) != 0) vypis += "ALT+"; if ((zadani.Modifiers & ConsoleModifiers.Shift) != 0) vypis += "SHIFT+"; if ((zadani.Modifiers & ConsoleModifiers.Control) != 0) vypis += "CTRL+"; vypis += zadani.Key.ToString(); vypis += " Znak = " + zadani.KeyChar; Console.WriteLine(vypis); } while (zadani.Key != ConsoleKey.Escape); {/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Stiskni kombinaci znaku a klávesy SHIFT, ALT a CTRL,
anebo pro ukončení stiskni ESC
Stiskl jsi klávesu L Znak = l
Stiskl jsi klávesu SHIFT+L Znak = L
Stiskl jsi klávesu ALT+CTRL+X Znak = #
Stiskl jsi klávesu Escape Znak =
Skúsme si vo svojom Visual Studiu kód otestovať stlačením kombinácie rôznych kláves. Napr. kláves + najprv s klávesom ľavý ALT a potom s klávesom pravý ALT.
Metóda Equals()
Metóda Equals()
slúži na porovnanie dvoch objektov
ConsoleKeyInfo
. Podľa toho, či sú objekty rovnaké, či nie,
vracia metóda bool
hodnotu true/false
. Aby objekty
boli uznané rovnakými, musia byť rovnaké všetky ich
vlastnosti, teda Key
, KeyChar
i
Modifiers
. To znamená, že napríklad kombinácie kláves
CTRL + A sa nerovná SHIFT + A.
Syntax príkazu je:
prvniZnak.Equals( druhyZnak)
V uvedenom príklade porovnávame, či dva zadané znaky sú rovnaké:
{CSHARP_CONSOLE} ConsoleKeyInfo prvniZnak; ConsoleKeyInfo druhyZnak; Console.Write("Zadaj prvý znak: "); prvniZnak = Console.ReadKey(); Console.Write("\nZadaj druhý znak: "); druhyZnak = Console.ReadKey(); if (prvniZnak.Equals(druhyZnak)) Console.WriteLine("\nZnaky sú rovnaké."); else Console.WriteLine("\nZnaky nie sú rovnaké."); Console.ReadKey(); {/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Zadaj prvý znak: t
Zadaj druhý znak: T
Znaky nie sú rovnaké.
Trieda Console
Na záver si ukážeme vlastnosti TreatControlCAsInput
,
CapsLock
a NumberLock
na triede
Console
.
Vlastnosť
TreatControlCAsInput
Možno, že už ste pri svojej programátorské práci zistili, že
stlačíte ak pri behu svoje aplikácie klávesy CTRL + C,
beh aplikácie sa ukončí. To je tým, že práve táto kombinácia kláves je
štandardne operačným systémom považovaná za prerušenie.
A práve vlastnosť TreatControlCAsInput
získava
alebo nastavuje bool
hodnotu, ktorá určuje, či
je kombinácia klávesov CTRL + C aktívny ako
prerušenie - v tom prípade nadobúda hodnoty false
. Ak
nastavíme vlastnosť na hodnotu true
, bude kombinácia klávesov
CTRL + C považovaná za bežný vstup.
Syntax:
Console.TreatControlCAsInput = false; // Nastavenie, že stlačenie kombinácie CTRL+C spôsobí prerušenie behu programu. Console.TreatControlCAsInput = true; // Nastavenie, že stlačenie kombinácie CTRL+C vypíše zodpovedajúce znak. bool ctrlC = Console.TreatControlCAsInput; // Do premennej ctrlC sa načíta aktuálne nastavenie.
Vlastnosť CapsLock
Táto vlastnosť vracia bool
hodnotu true
, ak je
CapsLock zapnutý a false
, ak je vypnutý:
bool capsLock = Console.CapsLock; Console.WriteLine($"Klávesa CapsLock je zapnutá: {capsLock}");
Vlastnosť NumberLock
Táto vlastnosť vracia bool
hodnotu true
, ak je
NumLock zapnutý a false
, ak je vypnutý:
bool numberLock = Console.NumberLock; Console.WriteLine($"Klávesa NumberLock je zapnutá: {numberLock}");
V ďalšej lekcii, Textový výstup do okna konzoly a zložené formátovanie , si ukážeme, ako ovládať textový výstup
svojich aplikácií do okna konzoly pomocou metódy Write()
s
použitím zloženého formátovania.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 7x (440.9 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#