Premium

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

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

Dnes si uvedeme a podrobně popíšeme zdrojový text aplikace a ukážeme si, jak ji přeložit.

2.40 Zdrojový text aplikace

Vyjdeme ze zdrojového textu naší první, nicnedělající aplikace, který doplníme o smyčku zpracování událostí (příklad této funkce jsme si uvedli v rámečku nahoře) a o funkci zpracovávající události určené pro naši aplikaci (která bude zpracovávat událost frmLoadEvent).

Funkce PilotMain() zůstává stejná jako v první kapitole. Testuje kód spuštění aplikace a má-li hodnotu sysAppLaunchCmdNormalLaunch (jedná se o normální spuštění aplikace), tak přejde do smyčky zpracování událostí:

UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
        Err chyba;

        if (cmd == sysAppLaunchCmdNormalLaunch)
        {
                chyba = ZacatekProgramu();

                if(chyba)
                {
                        return chyba;
                }

                ZpracovaniUdalosti();

                KonecProgramu();
        }

        return 0;
}

Smyčka zpracování událostí byla již v této kapitole popsána a v prvních třech kapitolách se nebude měnit. Základem je vyzvednutí zprávy o události (případně počkání na událost) a její zpracování. Nejprve dáme operačnímu systému možnost zprávu zpracovat. Pokud operační systém nebude zpráva o události zajímat (funkce SysHandleEvent() vrátí hodnotu false), tak předáme událost funkci UdalostZpracovanaAplikaci().

Ve funkci UdalostZpracovanaAplikaci() budeme reagovat pouze na zprávu požadující aktivaci formuláře - frmLoadEvent. V této funkci ošetříme popsaným způsobem vlastní mechanismus výměny formulářů. Všechny ostatní události bude tato funkce ignorovat a budou předány funkcí FrmDispatchEvent() funkci příslušného formuláře.

static void ZpracovaniUdalosti()
{
    EventType udalost;

    do
    {
        EvtGetEvent(&udalost, evtWaitForever);

        if(SysHandleEvent(&udalost)) continue;

        if(UdalostZpracovanaAplikaci(&udalost)) continue;

        FrmDispatchEvent(&udalost);	
    }
    while(udalost.eType != appStopEvent);
}

Základ funkce UdalostZpracovanaAplikaci(), reagující na zprávu o požadavku na aktivaci formuláře, jsme si již uvedli. V naší aplikaci musíme ošetřit přepínání se mezi dvěma formuláři. Pokud funkce UdalostZpracovanaAplikaci() zprávu o události zpracuje, vrátí hodnotu true.

static Boolean UdalostZpracovanaAplikaci(EventPtr udalost)
{
    Boolean zpracovano = false;
    UInt16 cisloFormulare;
    FormPtr formular;

    if(udalost->eType == frmLoadEvent)
    {
        // Zjistíme číslo prostředku formuláře, který aktivujeme
		
        cisloFormulare = udalost->data.frmLoad.formID;
        formular = FrmInitForm(cisloFormulare);
        FrmSetActiveForm(formular);

        // Nastavíme správnou funkci pro zpracování událostí formuláře
		
        switch(cisloFormulare)
        {
            case FormularSFotkou:
                 FrmSetEventHandler(formular, UdalostFormulareSFotkou);
                 zpracovano = true;
                 break;

            case FormularSInformacemi:
                 FrmSetEventHandler(formular, UdalostFormulareSInformacemi);
                 zpracovano = true;
                 break;
				 
            default:
                 break;
         }
    }

    return zpracovano;
}

Nyní napíšeme funkci, která bude obsluhovat zpracování událostí ve formuláři s fotkou. Tato funkce bude muset zpracovat dvě události:

  • frmOpenEvent (povinná) - nakreslení formuláře na displeji pomocí funkce FrmDrawForm().
  • penDownEvent - když se uživatel dotkne perem displeje, tak se přepneme do formuláře s informacemi. K přepnutí do formuláře s informacemi použijeme funkci FrmGotoForm().
static Boolean UdalostFormulareSFotkou(EventPtr udalost)
{
    Boolean zpracovano;

    switch(udalost->eType)
    {
        case frmOpenEvent:

            FrmDrawForm(FrmGetActiveForm());
            zpracovano = true;
            break;

        case penDownEvent:

            FrmGotoForm(FormularSInformacemi);
            zpracovano = true;
            break;

        default:

            zpracovano = false;
            break;
    }

    return zpracovano;
}

Funkce, která bude zpracovávat události formuláře s informacemi o programu, bude velmi podobná - na událost frmOpenEvent bude reagovat úplně stejně, ale při doteku perem na displej přejde pomocí funkce FrmGotoForm() zpět do prvního formuláře (s fotkou). Zkuste tuto funkci napsat sami a podívat se do přílohy, zda jste se trefili.

Zbývá vyřešit poslední úkol - jak pozná naše aplikace, který formulář zobrazit jako první? V předchozí kapitole jsme si popsali dvě naše pomocné funkce - ZacatekAplikace() a KonecAplikace() - obě dvě jsou volány z funkce PilotMain(). Výběr prvního zobrazeného formuláře provedeme ve funkci ZacatekAplikace() velmi jednoduše - voláním funkce FrmGotoForm(), které předáme číslo prostředku prvního formuláře:

static Err ZacatekProgramu()
{
    FrmGotoForm(FormularSFotkou);
    return 0;
}

static void KonecProgramu()
{
}

Samozřejmě nesmíme zapomenout vložit na začátek souboru prototypy funkcí a příkazy preprocesoru pro vložení standardního hlavičkového souboru <PalmOS.h> a našeho hlavičkového souboru obsahujícího konstanty použité i v souboru prostředků aplikace.

2.41 Soubor Makefile a překlad programu

Strukturu a obsah souboru Makefile jsme si popisovali v předchozí kapitole. Pro úplnost zde uvedu soubor Makefile, který použijeme pro překlad naší aplikace (je to jen mírně upravený soubor Makefile z předchozí kapitoly):

CC_MOZNOSTI=-O2 -Wall

fotka.prc: bin.hotovo grc.hotovo
    build-prc fotka.prc "Fotka" "NECO" *.grc *.bin

bin.hotovo: fotka.rcp
    pilrc fotka.rcp
    touch bin.hotovo

grc.hotovo: fotka
    m68k-palmos-obj-res fotka
    touch grc.hotovo

fotka: fotka.o
    m68k-palmos-gcc $(CC_MOZNOSTI) fotka.o -o fotka

fotka.o: fotka.c
    m68k-palmos-gcc $(CC_MOZNOSTI) -c fotka.c -o fotka.o

uklid:
    rm -f *.o *.grc *.bin *.hotovo fotka

Znovu připomínám: nezapomeňte na to, že řádky s pravidly (všechny odsazené řádky) musí začínat tabulátory.

Překlad aplikace

Přepněte se do adresáře, ve kterém máte všechny zmiňované soubory (obrazky fotka.bmp, ikona.bmp, mala.bmp, soubor prostředků aplikace fotka.rcp, hlavičkový soubor fotka.h, soubor zdrojového textu fotka.c a soubor Makefile). Napište příkaz:

make

a program bude přeložen. Pokud se při překladu objeví chyby, zkuste je najít a opravit. Také zkuste, co se stane, když uděláte v programu chybu schválně.

Pro vyzkoušení instalujte aplikaci nejprve do Emulátoru Palm Pilota (POSE) a zkuste ji vyzkoušet - aplikace by měla vypadat asi takto:

 

Zkuste pustit funkci emulátoru "Gremlins", která aplikaci otestuje. Pokud v aplikaci nedojde k žádné chybě, zálohujte všechna data vašeho Palm Pilota a zkuste ji nainstalovat a spustit.

2.41 Druhý krok

Tím jste vytvořili svoji první aplikaci. Teď zkuste změnit ve formuláři zobrazujícím informace jméno události pera, na kterou čekáme z penDownEvent na penUpEvent. Co se stane? Příklad je uložen v archivu v adresáři krok2.

Odpověď: formulář s informacemi o programu se zobrazí jen po dobu, kdy držíme pero na displeji, protože zatímco událost penDownEvent je poslána formuláři, na kterém je fotka a způsobí aktivaci formuláře s informacemi, tak událost penUpEvent je vždy posílána formuláři obsahujícímu informace a způsobí návrat do formuláře s fotkou.

Archiv se soubory aplikace můžete stáhnout zde.


V další kapitole zkusíme formuláře oživit - naučíme se používat tlačítka a přepínače na příkladu programu, který bude počítat výšku dítěte v dospělosti z výšky jeho rodičů.

  • 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...

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...

{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...}

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...

Úřad chce zatočit se spoofingem. Podezřelé hovory operátoři nespojí

26. dubna 2024  16:02

Český telekomunikační úřad (ČTÚ) vydal novelu všeobecného opatření, která stanovuje nové podmínky,...

Hlasujte o nejlepší sportovní fotku. Vyberete tak vítěze smartphonu vivo

26. dubna 2024

Soutěž o úplnou novinku, smartphone vivo V40 SE s bohatou výbavou nebo podepsaný dres...

Xiaomi už se nebude držet zpátky. Pro řadu T chystá další prémiové funkce

26. dubna 2024

Smartphony řady T od Xiaomi mají vždy parádní výbavu, ale zároveň i pár kompromisů, aby trochu...

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...

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...

Horňáci versus dolňáci. Víme, čemu muži dávají přednost, a je to překvapení

Ženské tělo je pro muže celkově velmi atraktivní a nabízí jejich očím mnoho zajímavých partií. Největší pozornosti se...