V tomto díle začneme programovat a vrhneme se na komponenty.
Úvod
Vítám vás v dalším dílu našeho kurzu. Tento díl je pro náš kurz zcela zlomový, protože se konečně vrhneme na komponenty a na programování. Jako hlavní program jsem zvolil nápad Seberma, jednoho ze čtenářů tohoto kurzu. V následujících dílech budeme vytvářet MP3 přehrávač. Nenadchlo vás to? Nevadí. Protože na MP3 přehrávači nelze demonstrovat použití všech komponent (asi tam těžko budeme komponovat tabulku nebo rich-textové pole), budeme vytvářet i textový procesor. Na úroveň Microsoft Wordu nebo OpenOffice.org Writeru se asi nedostaneme, ale myslím, že nakonec budeme mít celkem profesionální programy. Je možné, že v jednom dílu budeme pracovat na obou programech, například až se naučíme pracovat s dialogovými okny (Otevřít, Uložit atd.) tak je zakomponujeme jak do editoru, tak do přehrávače.
V dnešním dílu začneme pouze s MP3 přehrávačem (když jsme u toho – vyhlašuji soutěž o nejvhodnější název). Naučíme se pracovat s několika nejzákladnějšími komponentami, které se vyskytují asi v každém programu: Formulář, Label, Button, Edit, dále se podíváme na komponenty Timer a Gauge a ukážeme si tzv. runtimové vytvoření komponent – tedy vytvoření komponenty za běhu aplikace.
Na úvod vše, jdeme na to!
Návrh uživatelského prostředí
Když vytváříme aplikaci, je nutné si nejprve navrhnout uživatelské rozhraní (teď nemluvím o konzolových aplikacích, tam žádné není:)).
Zde je seznam všeho, co je nutné umístit na formulář a co se musí nastavit. V prvním sloupci je uvedena komponenta, resp. její typ. V druhém sloupci je uvedeno, jak bude komponenta pojmenována (mění se v Object Inspectoru u položky Name), ve třetím sloupci je pak seznam dalších atributů, které se mají změnit a hodnoty, které se mají nastavit. Atributy, které zde nejsou uvedené, nechte, jak jsou.
Komponenta | Název (Name) | Další atributy |
Formulář | Form1 | Caption: MP3 přehrávač BorderStyle: bsToolWindow |
Button | prehrat_btn | Caption: Přehrát |
Button | zastavit_btn | Caption: Zastavit Enabled: false |
Label | původní (Label1) | Caption: Soubor: |
Edit | soubor | Text: žádný |
Gauge | ukazatel | Height: 12 ShowText: false |
Timer | casovac | Enabled: false Interval: 250 |
Tady je návrh, jak by mohlo rozložení komponent vypadat (fotka z doby návrhu, za běhu není komponenta Timer vidět):
A teď si rozebereme jednotlivé komponenty:
Button
Tlačítko patří mezi nejzákladnější komponenty vůbec. Z těch nejčastějších věcí u něj lze nastavit jen popisku (samozřejmě toho je mnohem víc – rozměry, název, pozice a hromady dalších věcí, ale to vše lze buď nastavit na formuláři, nebo je to nastavení, které se nepoužívá). Popiska (caption) je typu string.
Při kliknutí se vyvolá událost OnClick, další události se opět příliš nepoužívají.
Label
Label, česky popiska, slouží k zobrazení needitovatelného textu. Nejčastěji se mění pouze Caption (text popisky), který je typu string, a poté ještě atribut Font. Pokud v Object Inspectoru rozbalíte položku Font, dostáváte k dispozici nastavení písma (Name), velikosti (Size), barvy (Color), znakové sady (Charset) a dalších vlastností.
Edit
Komponenta Edit by se dala česky nazvat jako vstupní pole a slouží k jednořádkovému zadávání textu. Text je poté uložen v atributu Text a je typu string. Stejně jako u komponenty Label lze nastavit písmo. Při jakékoliv změně textu se vyvolá událost OnChange.
Gauge
Tato komponenta funguje jako ukazatel průběhu, umožňuje i zobrazení procent. Zobrazení procentuálního stavu se dá nastavit pomocí booleanovského atributu ShowText (true zobrazí, false vypne). Minimální hodnota se nastavuje u atributu MinValue, maximální pak u MaxValue, oba jsou typu integer. Samotný stav ukazatele se nastavuje pomocí Progress, též typu integer. Ještě lze pomocí atributu ForeColor nastavit barvu ukazatele (typ TColor).
Timer
Časovač patří mezi tzv. nevizuální komponenty. V době návrhu je na formuláři vidět jako ikonka, za běhu programu se nezobrazuje. Vlastnost Interval (typ integer) je udávána v milisekundách a určuje interval, ve kterém se má vyvolat událost OnTimer. Atribut Enabled (typ boolean) určuje, jestli má být časovač aktivní, či ne. Pokud například nastavíte interval na 2000, vyvolá se každé dvě sekundy událost OnTimer.
Formulář
Ano, i formulář je komponentou. Stejně jako ostatní komponenty i on má mnoho vlastností, událostí a metod. Mezi nejčastěji používané vlastnosti patří BorderStyle, která určuje typ okraje okna. Caption (typ String) udává text v titulkovém pruhu okna, dále atribut Font a FormStyle. Myslím, že to teď stačí, v průběhu kurz případně objasním další.
Komponenty máme pro dnešek za sebou. A teď začneme programovat, ne?
Programujeme!
Jdeme na to. Nejprve do USES přidejte knihovnu MPlayer (ta nám poté umožní vytvořit komponentu MediaPlayer za běhu aplikace) a nadeklarujte globální proměnné pauza typu boolean a prehravac typu TMediaPlayer.
Teď vytvořte událost formuláře OnCreate. Tato procedura se zavolá, když je vytvořen formulář, tzn. při spuštění aplikace. My si v ní vytvoříme novou instanci třídy TMediaPlayer. MediaPlayer je sama o sobě také komponenta, ale protože by nám na formuláři teď jen překážela, vytvoříme si ji až za běhu.
procedure TForm1.FormCreate(Sender: TObject);
begin
pauza:=false;
prehravac:=TMediaPlayer.Create(Form1); //vytvoří novou instanci objektu TMediaPlayer
prehravac.Parent:=Form1; //nastaví vlastníka komponenty
prehravac.Visible:=false; //a skryje ji
end;
Dále vytvořte událost formuláře OnClose a do ní vložte příkaz na uvolnění přehrávače z paměti. U komponent, které vložíte na formulář v době návrhu, se to provádí automaticky, ale pokud komponentu vytvoříte sami až za běhu, musíte ji také sami smazat.
prehravac.free; //zruší instanci objektu TMediaPlayer
Nyní vytvořte událost tlačítka prehrat_btn OnClick: ta se skládá ze dvou částí rozdělených podmínkou. Toto tlačítko se totiž chová jako přehrávací i jako pauzovací. Pokud je tedy popiska tlačítka Přehrát, tak zkontroluje, jestli je zadán soubor, a pak začne přehrávat (pokud je přehrávání zapauzováno, pak pouze odpauzuje přehrávač). Pokud je popiska tlačítka Pauza, pak proběhne pouze druhá část procedury, kdy se přehrávání zapauzuje.
procedure TForm1.prehrat_btnClick(Sender: TObject);
begin
if prehrat_btn.Caption='Přehrát' then begin //pokud má tlačítko popisku Přehrát...
if soubor.Text='' then begin //pokud je pole soubor prázdné...
MessageDlg('Nebyl zadán soubor',mtError,[mbOK],0); //..vyhodit hlášku...
Exit; //...a skončit proceduru
end;
if not FileExists(soubor.Text) then begin //pokud soubor neexistuje...
MessageDlg('Zadaný soubor neexistuje',mtError,[mbOK],0); //...vyhodit hlášku
Exit; //...a skončit proceduru
end;
prehrat_btn.Caption:='Pauza'; //změnit popisku tlačítka
if not pauza then begin //pokud není pauza... (pokud pauza má hodnotu false)
prehravac.FileName:=soubor.Text; //...otevře v přehrávači ten soubor...
prehravac.Open; //...načte ho...
prehravac.Play; //...a začne ho přehrávat...
zastavit_btn.Enabled:=true; //...zpřístupní tlačítko Zastavit...
soubor.Enabled:=false; //...a znepřístupní pole pro název souboru
end else prehravac.Resume; //...pokud je pauza (pauza má hodnotu true tak pokračovat v přehrávání
casovac.Enabled:=true; //zapne časovač
ukazatel.MinValue:=0; //nastaví ukazatel (minimální hodnota)
ukazatel.MaxValue:=prehravac.Length; //(maximální hodnota=délka souboru)
ukazatel.Progress:=prehravac.Position; //pozice ukazatele=pozice přehrávání
end else begin //pokud je má tlačítko popisku Pauza
pauza:=true;
prehrat_btn.Caption:='Přehrát'; //změní popisku tlačítka
prehravac.Pause; //zapauzuje přehrávání
end;
end;
Zde se pozastavím nad příkazem MessageDlg. Tato funkce slouží k zobrazení dialogového okna. Parametry okna jsou následující:
MessageDlg(text,typ,tlačítka,help_kontext)
Text je samozřejmě typu string, typ může být mtError (chyba), mtInformation (informace), mnConfirmation (potvrzení) nebo mtWarning (varování). Tlačítka jsou mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll a mbHelp. Seznam tlačítek se udává jako výčet, tedy v hranatých závorkách (např. [mbYes, mbNo] zobrazí tlačítka Ano a Ne). Help kontext je obvykle 0, jinak slouží k odkazu na položku nápovědy.
Další událostí je událost OnClick tlačítka zastavit_btn, která zastaví přehrávání a vypne časovač
procedure TForm1.zastavit_btnClick(Sender: TObject);
begin
prehravac.Stop; //zastaví přehrávání
casovac.Enabled:=false; //vypne časovač
soubor.Enabled:=true; //nastaví vše do původního stavu
prehrat_btn.Caption:='Přehrát';
pauza:=false;
end;
A nakonec událost časovače OnTimer. Ta nám obstará, aby se každou ¼ sekundy obnovil ukazatel stavu přehrávání. Pokud se pak přehrávač dostane na konec (to se zjišťuje porovnáváním délky písničky a aktuální pozicí přehrávání), tak se přehrávání zastaví.
procedure TForm1.casovacTimer(Sender: TObject);
begin
ukazatel.Progress:=prehravac.Position; //obnoví pozici ukazatele
if prehravac.Position=prehravac.Length then begin //pokud se přehrávač dostane na konec...
pauza:=false; //nastaví původní hodnoty
prehrat_btn.Caption:='Přehrát';
soubor.Enabled:=true;
casovac.Enabled:=false;
zastavit_btn.Enabled:=false;
end;
end;
Pokud jste vše udělali správně, pak by vám pro přeložení (Run → Run nebo klávesa F9) mělo vše fungovat. Do vstupního pole zadáte cestu a název souboru, kliknete na Přehrát a je to.
Závěr
No a pro dnešek končíme. Doufám, že se vám povedlo aplikaci vytvořit, pokud ne, zkuste to znovu, musí to jít ;), a že se vám tento díl líbil (pokud ne, tak nevím, co budete dělat v dalších dílech – asi je přestanete číst:)). Příště rozebereme další komponenty, ale už začneme pracovat na našem textovém editoru.
Úkol
Už jste se těšili, že dneska žádný úkol nebude? Smůla:) I dneska pro vás něco mám;)
Vytvořte aplikaci, kde bude jeden Label, jeden Edit a tři Buttony. Po kliknutí na tlačítko se text v Editu zobrazí v Labelu, při kliknutí na druhé tlačítko to bude naopak. Při kliknutí na třetí tlačítko se budou podle popisky toho tlačítka přepínat styly písma na komponentě Label. Při prvním kliknutí bude popiska třeba Změnit a písmo bude třeba Verdana, při dalším kliknutí se změní popiska na Vrátit zpět a písmo se změní třeba na Arial. Při dalším kliknutí se to zase vrátí do stavu, který byl při prvním kliknutí.
Snad jsem to podal dost jasně, pokud přesto budou nějaké problémy, očekávám vaše dotazy na fóru, emailu, ICQ nebo formou úkolu.