IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

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);

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é:

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();

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#

 

Predchádzajúci článok
Zadávanie vstupu z klávesnice
Všetky články v sekcii
Konzoly C # .NET a jej možnosti
Preskočiť článok
(neodporúčame)
Textový výstup do okna konzoly a zložené formátovanie
Článok pre vás napísal Luděk Novotný
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity