Premium

Získejte všechny články
jen za 89 Kč/měsíc

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

Základním prvkem uživatelského rozhraní Palm Pilota jsou formuláře. Proto si uvedeme seznam funkcí, které s formuláři pracují, a několik poznámek k jejich využití.

2.34 Funkce pro zpracování událostí ve formuláři

Ke každému formuláři, který v naší aplikaci použijeme, můžeme definovat funkci pro zpracování událostí, které se ho týkají a na které si přejeme reagovat (jeho zobrazení na obrazovce, zmáčknutí tlačítka apod.). Této funkci říkáme funkce formuláře.

Této funkci je systémem předána zpráva o události (prostřednictvím ukazatele na strukturu EventType, ve které je zpráva o události uložena). Pokud naše funkce formuláře událost zpracuje (nebo si přeje, aby ji PalmOS dále nezpracovával) tak vrátí nenulovou hodnotu (true). Pokud funkce formuláře událost nezpracuje (vrátí hodnotu 0, false), tak se událost pokusí zpracovat operační systém PalmOS standardním způsobem.

Otevření a zavření formuláře

V každém formuláři, pro který definujeme naši vlastní funkci formuláře, musíme reagovat na událost frmOpenEvent. Při zpracování této události musíme vykreslit formulář na obrazovce (voláním funkce FrmDrawForm()) a chceme-li, tak můžeme do formuláře něco přikreslit, nastavit počáteční hodnoty přepínačů, zaškrtávacích a textových políček apod. ve formuláři.

Na obdobnou událost frmCloseEvent (uzavření formuláře) reagovat nemusíme. Pokud je funkci pro zpracování událostí formuláře předána zpráva o události frmCloseEvent a tato funkce vrátí nulovou hodnotu (false), tak je událost frmCloseEvent zpracována operačním systémem - formulář je vymazán z obrazovky a jsou zrušena jeho data.

Definice funkce pro zpracování událostí formuláře

Prototyp funkce pro zpracování událostí ve formuláři je následující:

Boolean FormEventHandlerType(EventType *event)

Ve struktuře event je v položce event->eType uložen typ zprávy (nebo chceme-li typ události). Jednotlivé konstanty pro typy událostí si můžete prohlédnout v tabulce, která byla uvedena výše v této kapitole. Příklad obsahu funkce pro zpracování událostí formuláře je ukázán v rámečku. Tato funkce reaguje na událost frmOpenEvent (povinné vykreslení formuláře) a kromě toho i na událost penDownEvent (dotek pera na displeji).

Boolean ZpracovaniUdalostiFormulare(EventType* event)
{
  Boolean zpracovano;

  switch(event->eType)
  {
    case frmOpenEvent:
        
		// zpracovani udalosti otevreni formulare: vykresleni 
		// aktivniho formulare na displeji
		
        FrmDrawForm(FrmGetActiveForm());
        
		// tady můžeme do formuláře něco nakreslit

        zpracovano = true;
        break;

    case penDownEvent:
	
		 // Zde je umístěno například zpracování 
		 // události doteku pera na displeji. Protože
		 // tuto událost zpracováváme, vrátíme hodnotu true
		
		 ...
		
         zpracovano = true;
         break;

    default:

        // pro všechny ostatní události vrátíme hodnotu false,
		// protože nás nezajímají

        zpracovano = false;
        break;
  }

  return zpracovano;
}

2.35 Data přiložená ke zprávám o událostech

Definici datové struktury EventType naleznete v hlavičkovém souboru Core/UI/Event.h. V této datové struktuře jsou mimo typ zprávy (v prvku eType) uložena i související data, která upřesňují podrobnosti o události. Definice této struktury je následující (pro stručnost uvedu jen začátek definice, úplnou definici si prohlédněte v hlavičkovém souboru).

typedef struct EventType {
   eventsEnum     eType;
   Boolean        penDown;
   UInt8          tapCount;
   Int16          screenX;
   Int16          screenY;

   union {
      struct ctlSelect {
         UInt16             controlID;
         struct ControlType *pControl;
         Boolean            on;
         UInt8              reserved1;
         UInt16				value;		
         } ctlSelect;

      struct frmOpen {
         UInt16             formID;
         } frmOpen;

      struct menu {
         UInt16             itemID;
         } menu;
		 
	...
	
      } data;

} EventType;

Tato struktura obsahuje některé prvky, které jsou společné pro všechny zprávy o událostech (například eType: typ události) a prvky, které jsou pro každou zprávu o události specifické (uloženy v prvku data). Jediný z prvků společných pro všechny události, který je vždy vyplněn, je typ události (prvek eType);

K jednotlivým prvkům struktury, které jsou specifické pro jednotlivé zprávy, přistupujeme přes union data, jehož prvky jsou pojmenované podobně jako události (například event.data.ctlSelect.value je hodnota přepínače, která je předávána při zprávě ctlSelectEvent). V dalším popisu zpráv o událostech v této i příštích kapitolách budu uvádět jen ty prvky struktury EventType, které jsou při předávání dané zprávy naší aplikaci vyplněny.

2.36. Události pro nahrání a otevření formuláře

Požadavek na aktivaci formuláře - frmLoadEvent

Tato zpráva je požadavek na aktivování jednoho z našich formulářů. Tuto zprávu obvykle zasílá naše aplikace sama sobě voláním funkce FrmGotoForm() nebo FrmPopupForm(). Ve struktuře EventType je vyplněn následující prvek:

frmLoadEvent
EventType* event;
UInt16 event->data.frmLoad.formID
Číslo prostředku formuláře, který bude aktivován.

Tuto zprávu musíme v naší aplikaci také zpracovat. Správnou reakcí na tuto zprávu je aktivace formuláře, jehož číslo prostředku je v této zprávě předáno:

  1. Voláním funkce FrmInitForm() inicializovat formulář, jehož číslo prostředku bylo uvedeno ve zprávě.
  2. Voláním funkce FrmSetActiveForm() tento formulář aktivovat.
  3. Podle čísla prostředku formuláře sdělit operačnímu systému funkci formuláře, která bude použita pro zpracování událostí právě aktivovaného formuláře (voláním FrmSetEventHandler().)

Fragment zdrojového textu popisující zpracování této zprávy je v následujícím rámečku:

FormPtr formular = FrmInitForm(event->data.frmLoad.formID);

if(formular == NULL)
{
    // Chyba - nesouhlasí čísla prostředků definována v souboru 
    // prostředků aplikace.  
}

FrmLoadForm(formular);

switch(event->data.frmLoad.formID)
{
    case Formular1:
        FrmSetEventHandler(formular, FunkceFormulare1);
        break;

    case Formular2:
        FrmSetEventHandler(formular, FunkceFormulare2);
        break;
...
}

Tato zpráva je jediná, kterou musíme v naší aplikaci zpracovat nezávisle na funkcích formulářů. Pro zpracování této zprávy později definujeme vlastní funkci, kterou nazveme UdalostZpracovanaAplikaci().

Otevření formuláře - frmOpenEvent

Tato událost je zaslána funkci aktivního formuláře jako požadavek na jeho vykreslení na displeji a na nastavení ovládacích prvků formuláře. Při této události je ve struktuře EventType vyplněn následující člen:

frmOpenEvent
UInt16 event->data.frmOpen.formID
Číslo prostředku formuláře, který bude vykreslen na displeji.

Naše funkce formuláře může zjistit ukazatel na strukturu FormType s daty příslušného formuláře voláním funkce FrmGetActiveForm() a je zodpovědná za vykreslení formuláře na obrazovce (funkcí FrmDrawForm()).

...
    case frmOpenEvent:
        formular = FrmGetActiveForm();
        FrmDrawForm(formular);
        return true;
....

Tuto zprávu musíme v každé funkci formuláře zpracovat: inicializovat přepínače a další prvky formuláře a vykreslit formulář na displeji. Poté můžeme dokreslit do formuláře vlastní grafické prvky a nakonec musí funkce formuláře vrátit hodnotu true jako příznak úspěšného zpracování této zprávy.


Příště si uvedeme seznam událostí, které jsou spojeny s dotekem a pohybem pera po displeji.

  • Nejčtenější

Spotem s Trojanem na horách operátor popudil Poláky. Nerozuměli nadsázce

21. dubna 2024  8:01

Po dvojici Vojtěch Kotek a Lukáš Pavlásek, k níž později přibyl Jakub Kohák, vsadil T-Mobile ve...

Je to už spíš foťák s mobilem a opravdu se povedl. Test Xiaomi 14 Ultra

21. dubna 2024

Prémiový smartphone Xiaomi 14 Ultra působí mezi současnou nabídkou mobilů jako unikát. Jaký jiný...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Toto zařízení mělo nahradit mobily. V recenzích se mu vysmáli

23. dubna 2024

Novinka s názvem Humane AI Pin se zdála být převratným zařízením. V mnoha ohledech měla nahradit...

Operátoři zahušťují pokrytí Česka signálem 5G. Máte ho doma? Podívejte se

20. dubna 2024

Premium V červenci to budou již čtyři roky, co byla v Česku spuštěna první komerční 5G síť. Zatímco v...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Vodafone měl výpadek, někteří zákazníci se nemohli dovolat

25. dubna 2024  10:03,  aktualizováno  10:15

Síť mobilního operátora Vodafone postihl ráno výpadek. Týkal se části zákazníků, kteří se nemohli...

Vodafone měl výpadek, někteří zákazníci se nemohli dovolat

25. dubna 2024  10:03,  aktualizováno  10:15

Síť mobilního operátora Vodafone postihl ráno výpadek. Týkal se části zákazníků, kteří se nemohli...

Toto mohl být nevídaný smartphone. Myšlenku však nakonec poslali k vodě

25. dubna 2024

S takovým smartphonem bychom už nikdy nemuseli řešit, že se zpomaluje, nemá dostatek paměti či je...

Samsung má povedenou stylovku. Zkusí to s ní na trhu, kde se mu nedaří

24. dubna 2024

Samsung po velmi dlouhé době oprášil modelovou řadu Galaxy C a představil stylový smartphone se...

Toto zařízení mělo nahradit mobily. V recenzích se mu vysmáli

23. dubna 2024

Novinka s názvem Humane AI Pin se zdála být převratným zařízením. V mnoha ohledech měla nahradit...

Manželé Babišovi se rozcházejí, přejí si zachovat rodinnou harmonii

Podnikatel, předseda ANO a bývalý premiér Andrej Babiš (69) s manželkou Monikou (49) v pátek oznámili, že se...

Bývalý fitness trenér Kavalír zrušil asistovanou sebevraždu, manželka je těhotná

Bývalý fitness trenér Jan Kavalír (33) trpí osmým rokem amyotrofickou laterální sklerózou. 19. dubna tohoto roku měl ve...

Herečka Hunter Schaferová potvrdila románek se španělskou zpěvačkou

Americká herečka Hunter Schaferová potvrdila domněnky mnoha jejích fanoušků. A to sice, že před pěti lety opravdu...

Největší mýty o zubní hygieně, kvůli kterým si můžete zničit chrup

Možná si myslíte, že se v péči o zuby orientujete dost dobře, přesto v této oblasti stále ještě existuje spousta...

Tenistka Markéta Vondroušová se po necelých dvou letech manželství rozvádí

Sedmá hráčka světa a aktuální vítězka nejprestižnějšího turnaje světa Wimbledonu, tenistka Markéta Vondroušová (24), se...