Komponenty Timer a Gauge

Při déletrvajících procesech je dobře informovat uživatele o jejich průběhu. K tomu je zapotřebí komponenta, která umí sledovat čas - Timer (časovač). Tato komponenta, která je viditelná jen v návrhu projektu ale už ne při běhu programu, umí spouštět procedury v daných časových intervalech. Pro grafické zobrazení průběhu děje (plynutí času) použijeme v této lekci komponentu Gauge.

Komponenta Timer je na paletě System a pro nás důležité jsou jen její dvě vlastnosti:
Enabled - udává, jestli je komponenta Timer aktivní a jestli se vykonává její událost OnTimer
Interval - udává dobu v milisekundách, která uplyne mezi dvěma událostmi OnTimer (teoreticky, v praxi záleží na tom, co počítač právě dělá)
Jedinou událostí této komponenty je
OnTimer - do této události se píšou příkazy, které pak komponenta Timer pravidelně vykonává. Frekvence tohoto vykonávání závisí na hodnotě vlastnosti Interval. Událost OnTimer se vykonává jen pokud je vlastnost Enabled komponenty Timer nastavena na true

Komponenta Gauge (paleta Samples) umožňuje graficky znázornit velikost svojí vlastnosti Progress, ve spojení s komponentou Timer tak může znázornit průběh nějakého děje. Její nejdůležitější vlastnosti jsou:
MinValue a MaxValue - minimální a maximální hodnota
Progress - aktuální hodnota komponenty
Kind - specifikuje vzhled komponenty. Možné hodnoty: gkHorizontalBar – standardní vodorovný pruh; gkVerticalBar – standardní svislý pruh; gkNeedle – jakýsi „analogový tachometr“; gkPie – „koláč“, jde o standardní kruhový tvar se zvětšující se výsečí; gkText – textová procentuální hodnota.

Jak již bylo řečeno (dvakrát :-) ), uvedené komponenty se využívají například často ke znázornění průběhu déletrvajícího procesu (načítání nebo ukládání dat apod.). My využijeme tyto komponenty v jednoduché hře, která je variací na dávnou televizní hru VIDEOSTOP. Úkolem hráče je zastavit "kostky" ve chvíli, kdy jsou na nich stejná čísla.

Projekt Videostop

Jak je vidět z obrázku, projekt obsahuje Labely pro znázornění "kostek", zobrazení počtu bodů a nadpis. Návod ke hře je vložen do komponenty Memo, pro spuštění "otáčení" kostek a jeho ukončení jsou určena dvě tlačítka.
Nejvíc nás ale zajímají nové komponenty - Timer je vidět na obrázku vlevo nahoře (protože se po spuštění programu nezobrazuje, na jeho umístění vůbec nezáleží) a Gauge je umístěný nad návodem.

Hlavní procedura je obsažena v události OnTimer komponenty Timer. Procedura se bude opakovat po tolika milisekundách, kolik je udáno v její vlastnosti Interval, pokud ale bude vlastnost Enable nastavena na True (časovač bude zapnutý, v návrhu jej můžete vypnout, aby kostky neběžely hned po spuštění):
procedure TForm2.Timer1Timer(Sender: TObject);
begin
Gauge1.Progress := Gauge1.Progress + 2;
if gauge1.progress>=100 then
begin
timer1.Enabled:=false;
showmessage ('Získal jsi '+inttostr(body)+' bodů');
application.terminate;
end;
a:=1+random(6); b:=1+random(6); c:=1+random(6);
label1.Caption:=inttostr(a);
label2.Caption:=inttostr(b);
label3.Caption:=inttostr(c);
end;
Opět vezmeme jeden příkaz nebo řádek po druhém:
- zvětší se hodnota Gauge (o kolik to záleží na vás)
- jestliže je hodnota Gauge větší než 100 (maximální hodnota), vypne se Timer, vypíše se hláška s body a aplikace se ukončí
- jinak se zvolí tři náhodná čísla a vypíší se do příslušných Labelů

Procedura na tlačítku START je krátká a jednoduchá - jen "zapíná" Timer:
procedure TForm2.Button2Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;


Tlačítko STOP obsahuje tuto proceduru:
procedure TForm2.Button1Click(Sender: TObject);
begin
timer1.Enabled:=false;
if (a=b) or (a=c) or (b=c) then body:=body+5;
if (a=b) and (b=c) then body:=body+5;
label5.Caption:=inttostr(body);
end;
Procedura není složitá - "vypne" se Timer, zkontroluje se, zda jsou některé dvě kostky stejné, pak se body zvětší o 5, další kontrola zvětší body ještě o 5, pokud jsou stejná všechna tři čísla na kostkách. Výsledný počet bodů se vypíše do příslušného Labelu.

A to je vše, můžete hrát, než vám vyprší čas (nebo skončí vyučovací hodina :-) ).

Aplikace ukládej do složky s názvem lekce14 .

Úkoly:

Základní úloha:

Vytvoř aplikaci Videostop podle textu lekce (viz ukázka ).


Úlohy na plus (za každou jedno plus):

1. Oprav projekt tak, aby se nepřičítaly body při opakovaném kliknutí na tlačítko STOP.

2. V projektu podle textu lekce se všechny kostky "otáčí" stejně rychle. Uprav projekt tak, aby se kostky "otáčely" různými rychlostmi, které se navíc po každém startu volí náhodně.


Úlohy na jedničku:

Doplň úlohu na plus o další kostku.


Úloha pro experty:

Upravte projekt tak, aby se místo čísel zobrazovaly "puntíky".