Uživatelské nástroje

Nástroje pro tento web


vyuka:podminky_ve_flashi_-_kalkulacka

Podmínky ve Flashi - kalkulačka

V předchozí hodině jsme vytvořili základ kalkulačky, která umí jen sčítat - kalkulacka-plus.zip.

Nyní se podíváme na to, jak zajistit, aby kalulačka uměla více matematických operací. Nejprve si přidáme další „funkční“ (ne číselná) tlačítka na Plochu, smyslupně je pojmenujeme (např. tlac_minus, tlac_krat a tlac_deleno) a nastavíme jim odpovídající popisek:

tlac_minus.popisek.text="-";
tlac_krat.popisek.text="*";
tlac_deleno.popisek.text="/";

Nyní upravíme stávající událostní proceduru pro tlačítko plus tak, aby fungovala i pro nová tlačítka - budeme si potřebovat zapamatovat nejen číslo, které bylo na displeji, ale také které tlačítko (+, -, * nebo /) bylo stisknuto, abychom byli po stisku tlačítka „rovná se“ schopni provést odpovídající matematickou operaci. Číslo na displeji tedy bude uložené v číselné proměnné cislo1 (typ Number) a pro matematickou operaci si založíme novou textovou proměnnou (typ String) nazvanou např. operace (deklarujeme jí pomocí var operace:String;), do které si uložíme nějakou smluvenou hodnotu (asi nejépe jednu z variant 'plus', 'minus', 'krat', 'deleno', ale šlo by také např. úspornější '+', '-', '*', '/') podle toho, které tlačítko bylo stisknuto.

Máme v zásadě 2 možnosti - buďto stávájící událostní proceduru nakopírujeme čtyřikrát a mírně upravíme pro každé tlačítko, např:

tlac_plus.addEventListener(MouseEvent.CLICK, zapamatujPlus);

function zapamatujPlus(e) {
	cislo1=Number(displej.text);
	operace="plus";
	displej.text="";
})
tlac_minus.addEventListener(MouseEvent.CLICK, zapamatujMinus);

function zapamatujMinus(e) {
	cislo1=Number(displej.text);
	operace="minus";
	displej.text="";
})

nebo totéž ve „zhuštěné“ podobě se sloučeným posluchačem a funkcí:

tlac_plus.addEventListener(MouseEvent.CLICK, function(e) {
	cislo1=Number(displej.text);
	operace="plus";
	displej.text="";
})
tlac_minus.addEventListener(MouseEvent.CLICK, function(e) {
	cislo1=Number(displej.text);
	operace="minus";
	displej.text="";
})

To je ale stále velké množství řádek kódu, lepší by asi bylo, kdyby se nám podařilo vytvořit jednu univerzální událostní proceduru, která by si rozuměla se všemi čtyřmi tlačítky. K tomu konečně použijeme parametr události „e“ (jako event), který posluchač povinně předává událostní proceduře - jednou z předávaných informací je i který objekt (tlačítko) událost vyvolal. Na tuto informaci se dostaneme jako e.currentTarget - kdyby nas zajímalo konkrétní jméno objektu, použijeme vlastnost name - t.j. e.currentTarget.name, kdyby nás zajímal např. text popisku konkrétního tlačítka, použijeme e.currentTarget.popisek.text. Pojďme si vyzkoušet, jak to funguje pomocí funkce trace, která zobrazí obsah libovolné proměnné (či objektu) - budeme mít tedy 4 posluchače (pro každé tlačítko +, -, *, /) a všechny budou ukazovat na stejnou událostní proceduru - vraťme se třeba k původnímu jménu zapamatujCislo:

tlac_plus.addEventListener(MouseEvent.CLICK, zapamatujCislo)
tlac_minus.addEventListener(MouseEvent.CLICK, zapamatujCislo)
tlac_krat.addEventListener(MouseEvent.CLICK, zapamatujCislo)
tlac_deleno.addEventListener(MouseEvent.CLICK, zapamatujCislo)

function zapamatujCislo(e) {
	cislo1=Number(displej.text); //uloz obsah displeje do promenne
	displej.text=""; //smaz displej
	trace(e.currentTarget.popisek.text)
}

Kontrolní otázka - dovedete si představit, že by se vytvoření posluchače přesunulo dovnitř symbolu funkčního tlačítka? this.addEventListener(MouseEvent.CLICK, MovieClip(parent).zapamatujCislo) Není to ale pro nás příliš praktické řešení, protože by pak funkci zapamatujCislo volaly i tlačítka „C“ a “=“, což nechceme, a museli bychom pro ně asi vytvořit zvláštní knihovní symbol, který by tuto událostní proceduru uvnitř neměl.

Pomocí funkce trace jsme si tedy ověřili, že e.currentTarget.popisek.text vrací aktuální popisek tlačítka, na které bylo kliknuto (tedy '+', '-', '*' nebo '/') a nic nám nebrání tento popisek uložit do proměnné operace pomocí přiřazení operace = e.currentTarget.popisek.text;. Funkce zapamatujCislo bude tedy vypadat následovně:

function zapamatujCislo(e) {
	cislo1=Number(displej.text); //uloz obsah displeje do promenne
	displej.text=""; //smaz displej
	operace = e.currentTarget.popisek.text; //uloz matematickou operaci
}

Nyní už zbývá jen upravit událostní proceduru pro tlačítko “=“ (tlac_rovnase) tak, aby si přečetla hodnotu proměnné operace a vykonala odpovídající matematickou operaci. K tomu budeme potřebovat příkaz ActionScriptu if (což znamená anglicky „jestliže“) - pomocí tohoto příkazu se dají vyhodnocovat podmínky a vykonat různý kód podle toho jestli je podmínka splněna nebo ne. Obecná syntaxe příkazu if je následující:

if (podmínka) {
	... kód, který se provede je-li podmínka splněna ...	
}
else {
	... kód, který se provede není-li podmínka splněna ...	
}

Část else (anglicky „v opačném případě“) je nepovinná, protože obvykle nám stačí pouze vykonat kód jen je-li podmínka splněna. A jak vypadá podmínka? Většinou je to nějaké matematické porovnání dvou hodnot - chceme-li testovat, jestli se dvě hodnoty rovnají, použijeme symbol dvojitého rovnítka == (např. otestování, jestli se proměnná a rovná pěti se zapíše jako a==5), porovnání „větší než“, „menší než“, „větší rovno“ nebo „menší rovno“ se zapisují standartními matematickými symboly (např. a>5, a<5, a>=5, a< =5). V našem případě budeme chtít testovat, jestli se proměnná operace rovná jedné ze čtyř hodnot '+', '-', '*', '/' a protože to není číselná, ale stringová (textová) proměnná, budeme muset při porovnávání použít uvozovky (““) kolem matematického znaménka (ale ne kolem samotné proměnné operace!). Budeme mít tedy celkem čtyři příkazy if - první otestuje, zda je v proměnné operace znaménko '+' a pokud ano, provede sčítání, druhé if otestuje na znaménko '-' a případně provede odčítání atd. Nebudeme tedy potřebovat žádné else. Funkce spoctiVysledek (volaná při události kliknutí na tlačítko “=“) bude teday vypadat následovně:

function spoctiVysledek(e) {
	cislo2=Number(displej.text); //vezmi co je na displeji
	if (operace=="+") {vysledek=cislo1+cislo2} //secti
	if (operace=="-") {vysledek=cislo1-cislo2} //odecti
	if (operace=="*") {vysledek=cislo1*cislo2} //vynasob
	if (operace=="/") {vysledek=cislo1/cislo2} //vydel
	displej.text=String(vysledek); //zobraz vysledek
}

Nyní by tedy měly fungovat všechny čtyři matematické operace - výsledný soubor je zde: kalkulacka-komplet.zip.

vyuka/podminky_ve_flashi_-_kalkulacka.txt · Poslední úprava: 2010/12/02 23:29 autor: kripi