Cvičenie 4
Vzorové riešenie minulotýždňového zadania nájdete na https://gitlab.cit.fei.tuke.sk/oop/sample_solutions
Vytvorte si nový projekt, Cv4 - Windows Forms App (.NET Framework)
Malo by sa vám zobraziť niečo podobné:
Poznámka: rozloženie panelov sa môže líšiť v závislosti od nastavenia IDE; Ak nemáte zobrazený toolbox, viete si ho zobraziť pomocou View->Toolbox (Ctrl+Alt+X)
4.1 Brave new world
Doteraz sme vedeli pracovať iba s konzolovou aplikáciou, dnes sa to však zmení. V toolbox-e si nájdite tlačítko (Button) a presuňte ho do formulára. Samozrejme, štábna kultúra nám vraví, že názov button1 asi nebude v poriadku, nájdite si teda v Properties políčko Name a zmeňte hodnotu na buttonSubmit. Taktiež nájdite Text a nastavte tam submit (toto sa zobrazí užívateľovi na obrazovke).
Pozrite si, aké ďalšie veci tu viete meniť.
Dvojklikom na tlačítko sa vám vytvorí OnClick Event - táto metóda sa zavolá vtedy, keď stlačíte zodpovedajúce tlačidlo (alebo iný komponent, ktorý to má priradené).
Už nemáme k dispozícií výpis do konzoly, takže sa musíme vynájsť inak, napríklad pomocou triedy MessageBox:
MessageBox.Show("It works!");
Nech sa vám po stlačení tlačidla zobrazí správa.
4.2 Form
Rovnako, ako tlačidlo, aj form má svoje vlastnosti, medzi ne patrí farba pozadia, nájdite ju a nastavte na bielu.
Premenujte formulár, nech sa volá MainForm (štábna kultúra!)
Dvojklikom na form si vytvorte novú funkciu. Ako už názov napovedá, táto sa zavolá pri načítaní formuláru. Môžeme ju využiť na inicializáciu objektov pri spustení programu.
4.3 I wanna calculate!
Prekvapenie, nakoniec dnes nebudeme nič robiť s bankovými účtami, spravíme si jednoduchú kalkulačku.
Vytvorte si nový enum OperationType - nech obsahuje 5 hodnôt:
public enum OperationType
{
Unset, Add, Substract, Multiply, Divide
}
(pridajte si novú triedu a prepíšte class na enum)
Ďalej si vytvorte novú triedu Calculator, nech táto trieda obsahuje 3 členské premenné: 2 čísla (int) - operandy a operátor. Nech je operátor inicializovaný na OperationType.Unset
Pridajte si 4 funkcie: void AddDigit(int), void SetOperation(OperationType), double Calculate(), string ToString()
Ich funkcionalitu budeme implementovať o chvíľu.
Pridajte si na formulár TextBox, ktorý bude slúžiť ako zobrazovací display a zabráňte užívateľovi do neho priamo zapisovať (nastavte ReadOnly = true, samozjreme ho vhodne premenujte)
Pridajte si na formulár niekoľko tlačidiel: + - * / clear. (Nezabudnite ich vhodne premenovať a nastaviť vhodne popis/text). Premenujte aj submit na =.
Vytvorte si v triede formulára metódu
private void ButtonOperation_Click(object sender, EventArgs e)
Keď si zvolíte tlačidlo na formulári, v properties uvidíte malý blesk a keď naň ukážete, zobrazí sa Events
Nastavte štyrom tlačidlám zodpovedným za operácie OnClickEvent (Click) ButtonOperation_Click
V tomto momente všetky 4 tlačidlá vyvolajú tú istú akciu, ako ich ale dokážeme odlíšiť?
4.4 Sender to the rescue
V rámci WinForms keď nejaký komponent vyvolá udalosť / akciu, táto akcia dostane referenciu na objekt, ktorý ju zavolal - tzv. sender. Vďaka tomu dokážeme odlíšiť, o ktorý objekt sa jedná a nepotrebujeme pre každý komponent vytvárať osobitné funkcie (ktoré robia skoro to isté).
sender je typu object, teda ho musíme pretypovať na Button, aby sme s ním vedeli pracovať
Button button = (Button)sender;
V tomto momente by sme vedeli operáciu zistiť už aj podľa textu, ktorý je napísaný na tlačidle, ale existuje aj elegantnejší (a často lepší) spôsob: Každý komponent má v sebe jednu členskú premennú Tag, uložme si teda do nej informáciu o ktoré tlačidlo sa jedná:
buttonAdd.Tag = OperationType.Add; //set value
OperationType operation = (OperationType)button.Tag; //get value
poskladajte tieto informácie, aby ste v MainForm_Load pridelili tlačidlám operácie a v ButtonOperation_Click nastavili kalkulačke zodpovedajúcu operáciu.
Komponenty sú dostupné v kóde s rovnakým názvom, ako ste im nastavili v designeri.
Nezabudnite v MainForm_Load vytvoriť objekt kalkulačky.
4.5 Need... more... buttons
Potrebujeme pridať ďalších 10 tlačidiel na zadávanie čísel... robiť to ale ručne nie je praktické. Využijeme teda dynamické vytváranie a pridávanie komponentov:
Button button = new Button();
button.Click += ButtonSubmit_Click; //pridanie akcie tlačidlu
button.Top = 100;
button.Left = 100;
this.Controls.Add(button); //pridanie tlačidla na form
- Definujte si nový event
private void ButtonNumber_Click(object sender, EventArgs e)
- Vytvorte si nový objekt typu Button
- nastavte mu hodnoty:
- Top - Y súradnica
- Left - X súradnica
- Width
- Height
- Click
- Text
- Tag - uložte tam číslo tlačidla (int) - pri čítaní je znovu nutné pretypovať hodnotu na int
- V dvoch vnorených cykloch takto pridajte 9 tlačidiel (do mriežky 3x3)
- Pridajte 0
- Nech Clear vytvorí nový objekt kalkulačky
Poznámka: syntax for cyklu je rovnaká ako v C
Poznámka2: pridanie akcie je pomocou +=, jej odobratie zas pomocou -=
button.Click += ButtonNumber_Click
Poznámka3: Súradnice formu sú počítané od ľavého horného rohu, od [0, 0]
4.6 Calculator
Implementujte funkcionalitu kalkulačky:
- nech AddDigit pridáva čifru na koniec čísla: ak je operácie nenastavená, nech je to operand1, inak operand2
- SetOperation nastaví operáciu, je možné zavolať len ak ešte nie je nastavená operácia, inak nevykoná žiadnu akciu
- Calculate spočíta a vráti výsledok (prípadne si ho niekam odloží)
- ToString vráti aktuálny operand alebo výsledok, ak už existuje (ako string)
- TextBox slúžiaci ako display má v sebe premennú Text, do ktorej vložte to, čo sa má zobraziť
Poznámka: zatiaľ nepoznáte nástroje na automatické upozornenie pri zmene hodnoty, takže si budete musieť zavolať ToString() po každom stlačení tlačidla na aktualizovanie zobrazenej hodnoty.
Poznámka2: syntax switch je rovnaká ako v C.
Pridajte ešte možnosť zmazať posledný znak a podporu pre prácu s desatinnými číslami.
Zväčšite písmo na displeji kalkulačky.