|
|
# 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:
|
|
|
|
|
|
```chsharp
|
|
|
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:
|
|
|
```csharp
|
|
|
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
|
|
|
```csharp
|
|
|
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ť
|
|
|
|
|
|
```csharp
|
|
|
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á:
|
|
|
|
|
|
```csharp
|
|
|
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:
|
|
|
|
|
|
```csharp
|
|
|
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
|
|
|
```
|
|
|
|
|
|
1. Definujte si nový event
|
|
|
```csharp
|
|
|
private void ButtonNumber_Click(object sender, EventArgs e)
|
|
|
```
|
|
|
2. Vytvorte si nový objekt typu Button
|
|
|
3. 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
|
|
|
4. V dvoch vnorených cykloch takto pridajte 9 tlačidiel (do mriežky 3x3)
|
|
|
5. Pridajte 0
|
|
|
6. 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 -=_
|
|
|
```csharp
|
|
|
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. |
|
|
\ No newline at end of file |