Cvičení 3

Timer

Jednou z nejužitečnějších komponent je komponenta Timer na paletě Systém. Jak z názvu vyplývá, tato komponenta slouží k časování. Je-li zapnuta, způsobuje pravidelné události v nastaveném cyklu.

Úmyslně je zdůrazněna cykličnost časovače, protože to je jeho největší výhoda – ale také současně jeho největší slabina a riziko. Stačí málo, aby se neobsloužené události nahromadily, a jakmile dojde k přetečení zásobníku, je havárie systému nasnadě. Je to ukázáno v tomto příkladu.

Splash screen

Mnohdy je spuštění aplikace komplikované a zdlouhavé. Za takové situace se často stává, že aplikace se stále ještě natahuje z disku, zatímco uživatel už dávno ztratil trpělivost, jsa přesvědčen, že počítač se opět zasekl. Typicky tato situace nastává při otevírání většího množství databázových souborů (viz následující semestr), což může být velmi časově náročné.

Aby se předešlo podobným nedopatřením, je zvykem hned při startu aplikace zobrazit formulář (obrazovku), která uživatele vhodným způsobem informuje, že program se teprve startuje. Tomuto druhu formuláře se říká Splash Screen.

Nejjednodušší způsob, jak SplashScreen vyvolat, je použít ho jako modální formulář během aktivace pracovního formuláře, tzn. uvnitř obsluhy události OnActivate. Příklad, jak je možno to udělat, je zde.

ImageList

Seznam obrázků, ImageList, se uplatní všude, kde je potřeba přistupovat k většímu počtu obrázků. S výhodnou pak k obrázkům lze přistupovat podle indexů (počínaje od nuly), jako by se jednalo o pole obrázků.

Typické použití je v souvislosti se seznamem akcí ActionList. Nejprve je potřeba umístit na formulář seznam obrázků a naplnit ho. Proto na seznam poklepeme myší a postupně jednotlivé obrázky přidáváme. Postup je názorně ukázán na tomto záznamu.

Potom propojíme oba seznamy tak, že v ActionList.Images se vybere příslušný ImageList.

Poklepáním na ActionList otevřeme editační okno akcí. Postupně přidáváme akce a v Object Inspectoru vyplňujeme jejich vlastnosti, například tak, jak to ukazuje tento záznam. Kdybychom na akci poklepali myší, otevře se nám kostra procedury pro obsluhu této akce (na záznamu to ukázáno není). Tímto postupem připravíme všechny akce.

Nyní již můžeme akce používat. Například, kdybychom na formuláři měli tlačítka, můžeme je jednoduše propojit s akcemi tak, že u každého tlačítka vyplníme jeho vlastnost Action. Je to ukázáno na tomto příkladu. Všimněte si, že tímto propojením se všechno, co bylo připraveno v akci, naplní do tlačítka. Celý příklad je možno stáhnout zde.

Instalace komponent a balíčků

Největší silou Delphi je schopnost pracovat s cizími komponentami, od kterých nemusí být k dispozici zdrojový kód. Jedná se o plné využití objektově-orientovaného přístupu. Protože komponenty nejsou jen run-time kód, který by se projevoval až při běhu programu, ale protože komponenty musejí pracovat už v design-time, tedy ve fázi návrhu programu, je nutno je zakomponovat přímo do Delphi. Proto nestačí komponenty prostě nakopírovat do stejného adresáře s Delphi, ale musejí se do prostředí Delphi nainstalovat.

Jednotlivé komponenty se instalují prostřednictvím menu Component-->Install Component. Ve formuláři, který se otevře, zadáme soubor s komponentou a její nainstalování proběhne už automaticky. Za zmínku stojí, že instalace komponent a zejména balíčků je dosti riskantní; velmi často vede k "naboření" celých Delphi s nutností kompletní přeinstalace. Nejčastějším problémem je, když se snažíme nainstalovat novou verzi komponenty, aniž bychom předtím odinstalovali verzi starou (což se dělá přes stejný formulář prostřednictvím menu Component-->Install Component). Jediná (ne vždy spolehlivá) ochrana je, před přidáváním komponent pečlivě zazálohovat celé Delphi.

Protože programy produkované z Delphi jsou značně objemné, mají Delphi zavedenou možnost poněkud zredukovat počet a velikost dodávaného kódu. Jde o to, že se vytvářejí určité "balíčky" navzájem provázaných DLL a knihoven, které se navzájem potřebují. Jestliže například náš program pracuje s databázemi, pak samozřejmě potřebuje databázový balíček - pokud s nimi nepracuje, balíček by byl zbytečný a zbytečně by zvětšoval objem programu. Delphi mají automaticky optimalizující linker, který do výsledného programu zařazuje jen ty balíčky, které jsou opravdu potřeba. Definovat, které komponenty a části budou obsaženy v kterém balíčku, je možno přes menu Component-->Install Packages. Práce s balíčky ovšem už přesahuje rozsah tohoto předmětu, proto se jimi nebudeme dále zabývat.

Podobně, pokud několik komponent používá společné DLL knihovny a další soubory, je výhodné zabalit je do "balíčku" a instalovat je jako jeden celek. Balíčky mají příponu DPK a jsou v zásadě dvou druhů - balíčky pro run-time a balíčky pro design-time.

RX-Library

Jedním z nejpoužívanějších balíků komponent je balík známý pod názvem RX-Library. Jedná se o kompilát komponent z mnoha, převážně ruských, zdrojů. Komponenty jsou vesměs dobře chodivé, velice užitečné a jejich jediným nedostatkem je, že k nim není dostatečná literatura. Nejnovější verzi komponent si lze zdarma stáhnout z http://www.rxlib.com . Pro účely cvičení je kopie uložena zde.

Postup instalace RX-Library

Dále popsaný postup instalace je nutno beze zbytku dodržet; těm, kdo se neradi diví, nedoporučuji zbytečně experimentovat.

  1. Rozbalíme základní soubor a spustíme instalaci. Instalace jen na domluvené místo rozbalí potřebné soubory a nedělá nic nebezpečného. Je dobré, zvolit umístění uvnitř adresáře Delphi, například v "Program Files\Borland\Delphi4\RX".
  2. Rozbalíme soubor "záplat" (patch), který odstraňuje některé známé chyby. Zdroji z tohoto souboru nahradíme původní zdroje ze základního souboru.
  3. Rozbalíme počeštěné zdroje (resources). Těmito soubory nahradíme původní soubory.
  4. Pokud máte Delphi jen v edici Standard nebo Professional, tak v souboru RX.INC deaktivujte direktivu {$DEFINE DCS}.
  5. V menu "File\Open..." otevřete run-time balíček RXCTL5.DPK (pro Delphi 4 je v názvu místo pětky číslo 4).
  6. V okně "Package..." zvolte "Compile" a počkejte, až se soubor překompiluje.
  7. Důležité: na jakoukoliv otázku typu "Save modified files…" odpovídat NE!
  8. Podobně přeložte soubory RXDB5.DPK, RXBDE5.DPK. (Jsou to balíčky pro práci s databázemi, pro účely tohoto předmětu je potřebovat nebudete.)
  9. Vzniklé (přeložené) knihovny s příponou BPL překopírujte do některého adresáře, nastaveného v cestě PATH. Osvědčilo se umístit je rovnou do adresáře WINDOWS\SYSTÉM.
  10. Znovu přes menu Use "File\Open..." otevřete design-time balíček DCLRX5.DPK (pro Delphi 4 je v názvu místo pětky číslo 4).
  11. V okně "Package..." zvolte "Compile" pro překlad a potom "Install" pro instalaci komponent do palety komponent v Delphi.
  12. Postup opakujte pro soubory DCLRXDB5.DPK a DCLRXBD5.DPK (Jsou to balíčky pro práci s databázemi, pro účely tohoto předmětu je potřebovat nebudete.)
  13. Nyní již by se měly v Delphi objevit palety RX… Jsou na konci mezi posledními; pokud je chceme přesunout dopředu, musíme zvolit menu Component-->Component Palette a v nově otevřeném okně v levém sloupci Pages přeházet (tažením myší) palety, jak požadujeme.
  14. Zbývá nainstalovat nápovědu. Česká nápověda neexistuje. Máme možnost nápovědy v angličtině nebo v ruštině. (Obě fungují stejně špatně).
  15. Postupujeme tak, že soubory nápovědy rozbalíme do vhodného adresáře (třeba do HELP v adresářích Delphi).
  16. Potom v menu Delphi zvolíme Help-->Customize a v novém okně Edit-->Add Files.
  17. Přidáme všechny Help soubory, tzn. *.HLP, *.CNT i *.GID.

Instalace RX-Library je tím úspěšně ukončena.

Některé důležité komponenty z RX-Library

TRxDBLookupCombo

poskytuje inkrementální prohledávání seznamu okamžitě při zadávání z klávesnice. Seznam se přitom zobrazuje. LookupSource může být navázán na TTable, TQuery, TRxQuery nebo TQBEQuery. V takovém případě umí inkrementálně hledat i ve výsledku SQL Querry atd.

TRxDBLookupList

funkční obdoba TRxDBLookupCombo.

TRxDBComboBox

je zděděn z TDBComboBox a dovoluje zobrazit různé hodnoty z hodnot uložených v databázi, a to bez použití LookUp tabulky (rychlost). Používá se k zobrazení srozumitelných textů namísto kódovaných hodnot uložených v tabulce.

TRxDBGrid

má schopnost měnit barvu pozadí, barvu a druh fontu v jednotlivých buňkách, celých sloupcích a řádcích. Může uložit a načíst pořadí sloupců, zobrazit ikonky pro BLOBy, MEMO, OLE a obrázky. Dovoluje výběr (select) více řádků. Převádí nadpisy sloupců na tlačítka (Button).

TDBStatusLabel

zobrazuje stav DataSetu (pro všechny DataSety) a číslo aktuálního recordu (pro DBase a Paradox tabulky).

TDateEdit, TDBDateEdit (databázová verze)

dovoluje přímé zapisování datumu; vedle toho má tlačítko, přes který se vyvolá kalendář.

TQBEQuery

dovoluje aplikovat QBE (Query-By-Example, dotaz podle příkladu) jako v Paradoxu. Dovoluje SQL příkazy INSERT a UPDATE.

TRxQuery

zděděno z TQuery. Podporuje makra v SQL, která jsou podobná jako parametry, ale dovolují měnit SQL text i v případech, kdy to parametry nedovolují.

TSQLScript

dovoluje vícenásobné SQL příkazy v jednom SQL.

TRxDBFilter

zapouzdřuje schopnost BDE lokálně filtrovat recordy. Má událost OnFilter a lze v něm zadat podmínky pro filtrování StringList.

TDBProgress

zobrazí postup provádění BDE operací (pro ty IDAPI drivery, které podporují call-back funkce).

TDBIndexCombo

vizuální interface, dovolující uživateli jednoduchým způsobem měnit pořadí zobrazených dat v indexované tabulce. Když uživatel zvolí komponentu TDBIndexCombo, její rozvinovací seznam se zaplní všemi indexy (resp. jejich stringy DisplayName) z tabulky.

TBDEItems, TDatabaseItems, TTableItems

jsou seznamy, naplněné (automaticky) odpovídajícími informacemi z BDE, tzn. seznamem databází, seznamem tabulek, seznamem sloupců atd.

TDBSecurity

realizuje nejobvyklejší dialogy pro databázové aplikace: Login Dialog (přihlašovací dialog) a Change Password Dialog (změna hesla).

TRxRichEdit

komponenta, dovolující pracovat s RTF formátem textu (Rich Text Format), tzn. s textem s různými druhy fontů, vazbou na OLE a podobně.

TRxDBRichEdit

databázová varianta TRxRichEdit, která dovoluje ukládat a číst RTF texty z databáze.

TAnimatedImage

Animovaný obrázek - pohybující se bitmapa. Umožňuje načíst Windowsovské animované kursory (*.ANI soubory).

TClipboardViewer

prohlížeč schránky.

TCurrencyEdit

editor umožňující zadávání peněžních částek.

TRxCalcEdit, TRxDBCalcEdit (databázová verze)

dovoluje vstup čísel a obsahuje tlačítko, po jehož stisknutí se rozbalí kalkulačka. Výsledky z kalkulačky se přenášejí do editačního okénka.

TPicClip

dovoluje pohlížet na bitmapu jako na sérii bitmapových obrázků, ke kterým se přistupuje podle jejich indexu.

TFormPlacement

komponenta, která si v registrech nebi v INI souboru zapamatuje polohu a nastavení formuláře, takže při následujícím spuštění aplikace se formulář objeví ve stejném stavu, v jakém byl ukončen.

TFormStorage

jako TFormPlacement, ale navíc dovoluje uložit i hodnoty jednotlivých vlastností (properties) komponent umístěných na formuláři. Je to velmi důležitá komponenta. Pracuje i s komponentami třetích firem.

TPageManager

komponenta pro usnadnění práce s vícestránkovými dialogy, jako jsou různé "wizzardy".

TColorComboBox

komponenta pro výběr barvy.

TFontComboBox

komponenta pro výběr fontu.

TRxLabel

komponenta, rozšiřující možnosti TLabel o stínování.

TTextListBox

následovník TListBox, který v případě potřeby automaticky zobrazuje horizontální SrollBar.

TRxSplitter

odděluje dvě oblasti formuláře, s možností měnit jejich velikost za běhu programu.

TRxSlider, TRxSwitch

graficky pojednané vypínače/přepínače s možností změny jejich vzhledu.

TRxSpinEdit, TRxSpinButton

komponenty pro rychlé zvětšování/zmenšování číselné hodnoty.

TSpeedBar

může být umístěn ke kterémukoliv okraje formuláře. Za běhu programu se může pomocí drop-in aktualizovat a upravovat. Dovoluje užívat plochá a průhledná tlačítka.

TComboEdit, TRxDBComboEdit (databázová verze), TFilenameEdit, TDirectoryEdit

edit-boxy vybavené tlačítkem. Uživatel může buď vyplnit edit-box, nebo si pomocí tlačítka vyvolat příslušný dialog, který mu usnadní výběr hodnoty.

TMemoryTable

implementuje databázovou tabulku v paměti počítače, což se příznivě projeví na její rychlosti. Je to standardní tabulka BDE, včetně operace Delete.

TRxMemoryData

napodobuje chování standardního DataSet, ale v paměti. Na rozdíl od TMemoryTable je nezávislá na BDE, tzn. lze ji použít i bez BDE.

TRxCheckListBox

komponenta s vícenásobnými zaškrtávacími políčky.

TRxSpeedButton

oproti standardní komponentě TSpeedButton poskytuje víc možností, jako je plochý vzhled, průhledné tlačítko, vazba na Timer a šedé vybarvení neaktivního buttonu.

TRxTimerList

komponenta poskytuje všechny funkce standardní komponenty TTimer a navíc výhody Windowsovského timeru, který dovoluje naprogramovat až 32767 událostí časovače. Komponenta se dá přizpůsobovat pomocí snadno ovladatelného editoru.

TAppEvents

je zapouzdření, které usnadňuje práci s vlastnostmi a událostmi objektu TApplication v době návrhu (design-time).

TRxFolderMonitor

komponenta dovoluje sledovat, zda nastaly nějaké změny ve specifikovaných adresářích a podstromech; nastanou-li změny odpovídající nastaveným filtrům, komponenta vyvolá událost.

TRxTrayIcon

velmi důležitá komponenta, která dovoluje aplikaci zmenšit do statické nebo animované ikonky v trayi (vpravo dole v systémové řádce Windows).

TRxClock, TSecretPanel, TRxDice, TRxCalculator, TStrHolder, TMRUManager, TRxWindowHook, TRxGradientCaption, TRxLoginDialog, TRxMemoryData

rozšířené komponenty, které navíc ke svým standardním protějškům mají navíc další vlastnosti, jako uživatelská menu a podobně.

TPicture, TGraphic

editory těchto komponent mají navíc tlačítka Copy a Paste, podporují ikonky ve schránkách, podporují oblíbené adresáře a v otevíracím dialogu dovolují použít preview.

Hint

editor této komponenty dovoluje vytvářet víceřádkové hinty.

Project Resource Expert

nástroj pro práci se soubory zdrojů (resources). Lze ho vyvolat pomocí menu "Project --> Resources".

Řešené úlohy

  1. Naučte se instalovat RX-Library. Řešení: postupujte podle návodu v první části této stránky.
  2. Pomocí komponenty FormStorage zařiďte, aby se formulář po opětném otevření obnovil v přesně stejném uspořádání, jako před jeho uzavřením. Dbejte, aby byl i stejný obsah EditBoxů, stejná volba RadioGroup a stejný obsah v Memo. Vyzkoušejte zápis potřebných údajů jak do registrů, tak do INI souboru. Řešení je zde.
  3. Pomocí komponenty TrayIcon zařiďte, aby se aplikace minimalizovala do traye a zase se obnovila. Řešení je zde.

Otázky ke zkoušce

  1. Ukažte příklad použití komponenty Timer.
  2. Na příkladu vysvětlete použití komponenty ImageList.
  3. Vysvětlete, co je to a jak se vytvoří SplashScreen.
  4. Vysvětlete význam a ukažte příklad použití komponenty FormStorage.
  5. Popište, jak je potřeba postupovat, aby se aplikace dala minimalizovat do traye a aby se odtud mohla obnovit.