Programování pro PalmOS počítače krok za krokem (49)

Dnes přikročíme k popisu posouvání textu v políčku pomocí posuvníku.

4.17. Posuvník

Druhý, a mnohem elegantnější způsob posouvání textu v políčku je spojen s použitím posuvníku. Posuvník se objevuje až ve verzi PalmOS 2.0. Bývá obvykle umístěn podél pravé strany políčka a většinou je i stejně vysoký jako políčko, ke kterému patří. Šířka posuvníku musí být 7 obrazových bodů.

V souboru prostředků aplikace definujeme posuvník pomocí klíčového slova SCROLLBAR. Při umisťování posuvníku do formuláře můžeme výhodně použít konstanty PREVRIGHT, PREVTOP a PREVHEIGHT. S jejich pomocí můžeme umístit posuvník vedle příslušného políčka.

FORM ID FormularVystupni AT (0 0 160 160)
BEGIN
...
    FIELD ID ... AT (5 18 145 121) HASSCROLLBAR ...
    SCROLLBAR ID ... AT (PREVRIGHT PREVTOP 7 PREVHEIGHT) VALUE 10 MIN 0 MAX 100 PAGESIZE 10
...
END

Jako šířku posuvníku můžeme zadat hodnotu AUTO, která by měla znamenat, že posuvník bude široký 7 bodů. Drobná chyba v překladači souboru prostředků aplikace pilrc však způsobuje, že zadáme-li jako šířku posuvníku hodnotu AUTO, tak program pilrc vypíše varování o špatné šířce posuvníku. Proto bychom měli zadávat šířku posuvníku vždy číslem.

Počátečním nastavením vlastností MIN, MAX, VALUE a PAGESIZE se nemusíme příliš zabývat. Tyto vlastnosti slouží pouze k prvnímu zobrazení posuvníku na dipleji a budeme je v naší aplikaci programově měnit.

Políčka, která si přejeme posouvat pomocí posuvníku, bychom měli důsledně definovat s atributem HASSCROLLBAR. Tento atribut říká operačnímu systému, aby zaslal naší aplikaci zprávu fldChangedEvent, kdykoliv dojde ke změně celkové výšky nebo pozice textu v políčku. Naše aplikace pak má možnost při zpracování zprávy fldChangedEvent aktualizovat zobrazení posuvníku na displeji.

Na rozdíl od posouvání textu po stránkách pomocí opakovacích tlačítek nám použití posuvníku nabízí mnoho výhod. Text můžeme posouvat více způsoby. Dotekem pera na šipce nahoru nebo dolů můžeme posunout text o řádek nahoru nebo dolů. Dotekem pera na šedě vybarvenou plochu posuvníku posuneme text o stránku. Konečně tažením vozíku můžeme posouvat text plynule.

Při pohledu na posuvník také uživatel okamžitě vidí, jaká relativní část textu je zobrazená na displeji.

Události posunutí posuvníku

Když se uživatel dotkne perem displeje kdekoliv na posuvníku, operační systém uloží do fronty zpráv zprávu sclEnterEvent. Tuto zprávu většinou naše aplikace nepotřebuje zpracovávat.

Dokud uživatel posuvníkem pohybuje, tak operační systém zasílá naší aplikaci v pravidelných intervalech zprávu sclRepeatEvent. V datové struktuře, která popisuje událost, je uložena jednoznačná identifikace posuvníku. Dále je v ní uložena i pozice vozíku na začátku pohybu a na konci pohybu v tomto kroku.

Z rozdílu těchto dvou hodnot můžeme spočíst počet řádků, o které políčko musíme v tomto kroku posunout, abychom udrželi krok s posuvníkem. Směr posunutí, který předáváme jako druhý parametr funkci FldScrollField(), zjistíme snadno ze znaménka rozdílu. Dokud uživatel pohybuje posuvníkem - ať už tažením vozíku nebo šipkami - je zpráva sclRepeatEvent zasílána opakovaně.

sclRepeatEvent
EventType* event;
UInt16 event->data.sclRepeat.scrollBarID
Jednoznačná identifikace posuvníku, kterým uživatel pohybuje
Int16 event->data.sclRepeat.value
Pozice posuvníku na počátku pohybu
Int16 event->data.sclRepeat.newValue
Pozice posuvníku na konci pohybu

Na konci pohybu, tedy když uživatel zvedne pero z displeje, zašle operační systém PalmOS naší aplikaci zprávu sclExitEvent. Tato zpráva obsahuje informaci o pozici vozíku na začátku pohybu posuvníku (v okamžiku zaslání zprávy sclEnterEvent) a při skončení pohybu (při zvednutí pera z displeje).

sclExitEvent
EventType* event;
UInt16 event->data.sclExit.scrollBarID
Jednoznačná identifikace posuvníku, kterým uživatel pohybuje
Int16 event->data.sclExit.value
Pozice posuvníku na počátku pohybu
Int16 event->data.sclExit.newValue
Pozice posuvníku na konci pohybu

Hodnoty pozice vozíku na počátku a konci pohybu u zprávy sclExitEvent se týkají celého posunu vozíku od začátku pohybu až do konce. Oproti tomu hodnoty zasílané každou zprávou sclRepeatEvent se týkají jen jedné části pohybu posuvníku. V naší aplikaci můžeme zpracovávat buď jednu, nebo druhou zprávu - hodnoty, které vrací, nemůžeme míchat.


Příště si po krátkém úvodu povíme o funkcích, jejichž prostřednictvím manipulujeme s posuvníkem.