4.3. Základ programu
Připravili jsme si soubor prostředků aplikace sifruj.rcp a hlavičkový soubor s čísly prostředků sifruj.h. Nyní vytvoříme základ programu, který se od programu v minulé kapitole bude lišit jen v použití dvou formulářů. V následujících několika odstavcích shrnu to, co už umíte udělat sami.
Vstupní bod programu - funkce PilotMain() - zůstává stejná, podobně jako pomocné funkce ZacatekAplikace() a KonecAplikace(). Ve funkci ZacatekAplikace() nesmíme zapomenout přejít do prvního formuláře, který si přejeme zobrazit na displeji. Půjde o formulář FormularVstupni pro vstup hesla a textu.
Dále si definujeme dvě funkce formuláře - jednu pro formulář vstupní a jednu pro formulář zobrazující výsledný text. Vhodně je pojmenujeme a v každé z nich zpracujeme událost frmOpenEvent tak, že vykreslíme formulář na displeji.
V každé funkci formuláře zpracujeme zprávu ctlSelectEvent, která je zasílána naší aplikaci jako odpověď na stisk tlačítka. Stiskne-li uživatel příslušné tlačítko ve formuláři (nespleťte si, které tlačítko máte ve kterém formuláři), bude volat funkci FrmGotoForm(), kterou přejde do druhého formuláře. Příklad funkce výstupního formuláře je v rámečku:
static Boolean UdalostVystupnihoFormulare(EventPtr udalost) { Boolean zpracovano = false; switch(udalost->eType) { case frmOpenEvent: FrmDrawForm(FrmGetActiveForm()); zpracovano = true; break; case ctlSelectEvent: // Osetrime tlacitko (Sifruj) pro prechod zpet do druheho // formulare switch(udalost->data.ctlSelect.controlID) { case TlacitkoZpet: FrmGotoForm(FormularVstupni); zpracovano = true; break; default: break; } break; default: break; } return zpracovano; } |
Funkci ZpracovaniUdalosti() můžeme zkopírovat z programu v předchozí kapitole. Do funkce UdalostZpracovanaAplikaci() musíme však doplnit do příkazu case větve pro oba formuláře:
static Boolean UdalostZpracovanaAplikaci(EventPtr udalost) { Boolean zpracovano = false; UInt16 cisloFormulare; FormPtr formular; if(udalost->eType == frmLoadEvent) { cisloFormulare = udalost->data.frmLoad.formID; formular = FrmInitForm(cisloFormulare); FrmSetActiveForm(formular); switch(cisloFormulare) { case FormularVstupni: FrmSetEventHandler(formular, UdalostVstupnihoFormulare); zpracovano = true; break; case FormularVystupni: FrmSetEventHandler(formular, UdalostVystupnihoFormulare); zpracovano = true; break; default: break; } } return zpracovano; } |
Tím máme zdrojový text programu kompletní a můžeme jej přeložit. Chybí jen maličkost: soubor Makefile. Jistě však přijdete na to, že je velmi jednoduchý a jeho napsání nezabere mnoho práce. Kompletní zdrojový text programu můžete stáhnout, prohlédnout a vyzkoušet zde.
4.4. Políčka
V příkladu jsme si mohli prohlédnout a vyzkoušet, jak fungují políčka pro vstup textu, která jsme umístili do formuláře, ale která ještě neumíme používat. Text je však už nyní možné zapisovat, označovat tažením perem a podobně.
Pro políčka v našem příkladu jsme použili vlastnost UNDERLINED, která určuje, že políčka pro vstup textu budou podtržená tečkovanou čarou. Tato políčka jsou na displeji zřetelně ohraničená a hodí se pro vstup textu. Pokud tuto vlastnost nepoužijeme, bude text zobrazen bez podtržení a uživatel bude mít potíže políčka na displeji nalézt.
Délka textu v políčku není omezena rozměry políčka na displeji; budeme-li zapisovat dlouhý text, bude se v jednořádkovém políčku posouvat. U víceřádkových políček se bude text správně lámat při pravém okraji. Bude-li text ve víceřádkovém políčku příliš dlouhý, bude políčko po řádcích rolovat nahoru a dolů. To vše řeší operační systém PalmOS zcela automaticky.
Ukazatel na data políčka
Data políčka jsou po inicializaci formuláře uložena ve struktuře FieldType. Ukazatel na tuto strukturu je datový typ FieldPtr. Funkce, které pracují s políčky, vyžadují jako parametr právě ukazatel na datovou strukturu políčka, tedy FieldPtr.
V minulé kapitole jsme si ukázali funkci FrmGetObjectPtr(), která vrátí ukazatel na data prvku formuláře. Tuto funkci můžeme použít i pro získání ukazatele na data políčka v závislosti na čísle prostředku. K tomu použijeme obalující funkci Objekt(), kterou jsme definovali v předchozí kapitole. Hodnotu, kterou funkce vrací, musíme jen přetypovat na typ FieldPtr.
MemPtr Objekt(UInt16 prvek) { FormPtr formular = FrmGetActiveForm(); return FrmGetObjectPtr(formular, FrmGetObjectIndex(formular, prvek)); } FieldPtr policko = (FieldPtr)Objekt(PolickoVstup); |
V příštím dílu si krátce povíme o zprávách, které jsou generovány při práci s políčky, a začneme mluvit o funkcích, které s políčky manipulují.