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

Doufám, že si PalmOS programátoři přes svátky oddychli - pokračujeme v našem seriálu o PalmOS programování. V tomto dílu si uvedeme základní sadu obalujících funkcí pro práci s políčky. Povíme si o tom, kam do zdrojového textu umístit příkazy, a doplníme program o jednoduché čtení a nastavování textu políček.

4.10. Obalující funkce pro čtení a nastavování textu políček

Nyní dáme dohromady funkce z předchozích dvou ukázek a ukážeme si základní sadu funkcí pro čtení a nastavování textu políček. Text políčka je obsažen v bloku paměti, jehož ovladač získáme voláním funkce FldGetTextHandle(). Má-li ovladač hodnotu NULL, je políčko prázdné.

void KopirujTextPolicka(UInt16 idPolicka, Char* kam, UInt16 pocet)
{
    FieldPtr policko = (FieldPtr)Objekt(idPolicka);
    MemHandle ovladacTextu = FldGetTextHandle(policko);
    Char* textPolicka;

    if(ovladacTextu)
    {
        textPolicka = (Char*)MemHandleLock(ovladacTextu);
        StrNCopy(kam, textPolicka, pocet);
        MemHandleUnlock(ovladacTextu);
    }
    else
    {
        StrCopy(kam, "");
    }
}

Funkce KopirujTextPolicka() vyžaduje jako parametr jednoznačnou identifikaci políčka v aktuálním formuláři, jehož text vyzvedáváme. Také omezujeme nejvyšší počet znaků, které z políčka vyzvedáváme parametrem pocet.

Pro nastavování a mazání textu políčka rozložíme obalující funkci, kterou jsme si ukázali v dílu 4.9., na tři funkce. První z nich nastaví nový ovladač bloku paměti, ve kterém je uložen text políčka. Druhá funkce text políčka vymaže a třetí jej nastaví podle předaného řetězce.

void NastavNovyOvladacPolicka(UInt16 idPolicka, MemHandle novyOvladac)
{
    FieldPtr policko = (FieldPtr)Objekt(idPolicka); 
    MemHandle staryOvladac = FldGetTextHandle(policko);
	
    FldSetTextHandle(policko, novyOvladac);
    FldDrawField(policko);

    if(staryOvladac)
    {
        MemHandleFree(staryOvladac);
    }
}

void VymazTextPolicka(UInt16 idPolicka)
{
    NastavNovyOvladacPolicka(idPolicka, NULL);
}

void NastavTextPolicka(UInt16 idPolicka, Char* text)
{
    MemHandle novyOvladac;

    novyOvladac = (MemHandle)MemHandleNew(StrLen(text) + 1);
    StrCopy((Char*)MemHandleLock(novyOvladac), text);
    MemHandleUnlock(novyOvladac);

    NastavNovyOvladacPolicka(idPolicka, novyOvladac);
}

Uvedené čtyři funkce zcela stačí pro práci s políčky pro úpravy textu v našich aplikacích. Můžeme jimi číst a nastavovat text v políčkách, která může uživatel upravovat, i v políčkách, která slouží pouze pro zobrazení textu. Funkce, které nastavují text v políčku prostřednictvím řetězce, nebudeme v našich programech zatím používat.

4.11. Předávání dat mezi formuláři

Při psaní zdrojového textu aplikace musíme mít stále na paměti, že všechny činnosti programu (třeba příkazy pro zašifrování textu) musí být přiřazeny k některému z formulářů aplikace. Událostmi řízená aplikace pro PalmOS musí vhodně rozložit svoji činnost tak, aby mohla reagovat na zprávy, které jí operační systém zasílá.

Nejjednodušším příkladem, který jsme už jednou použili, je přepnutí se do jiného formuláře v závislosti na stisknutí tlačítka. Funkce FrmGotoForm() je volána při stisknutí tlačítka. Funkce FrmGotoForm() vloží do fronty zpráv sérii zpráv nutných pro přechod do jiného formuláře a vrátí řízení operačnímu systému.

Operační systém pak postupně - po jedné - zasílá zprávy naší aplikaci. První zprávou je frmCloseEvent pro uzavření aktivního formuláře a poslední je frmOpenEvent sloužící k inicializaci a vykreslení formuláře nového.

Při zpracování žádné ze zpráv se naše aplikace nesmí "zaseknout" - zpracovávat zprávu příliš dlouho. Později si ukážeme, jak je možné i úlohy náročné na výpočet rozdělit do menších bloků a v době mezi zpracováním těchto bloků reagovat na zprávy operačního systému.

Ale zpět k naší aplikaci. Chceme, aby se při stisknutí tlačítka OK v hlavním formuláři text nejprve zašifroval a poté aby se zobrazil ve formuláři druhém. Mezi formuláři přejdeme funkcí FrmGotoForm(). Vlastní příkazy pro zašifrování textu musíme vhodně rozdělit do obou funkcí formulářů.

Naše aplikace totiž nikdy nemá přístup k oběma formulářům současně. Proto musíme vyřešit způsob, kterým budou předávána data mezi formuláři. K uložení dat budeme zatím používat globální proměnné. Příkazy pro zašifrování můžeme vložit do zdrojového textu dvěma způsoby, popsanými v následující tabulce:

První způsob Druhý způsob
Zpracování zprávy o stisknutí tlačítka ctlSelectEvent v prvním formuláři
  1. Vyzvednutí textu, který má být zašifrován z políčka
  2. Uložení tohoto textu do globální proměnné
  3. Volání funkce FrmGotoForm()
  1. Vyzvednutí textu, který má být zašifrován z políčka
  2. Zašifrování textu
  3. Uložení zašifrovaného textu do globální proměnné
  4. Volání funkce FrmGotoForm()
Zpracování zprávy frmOpenForm druhého formuláře
  1. Vyzvednutí textu z globální proměnné
  2. Zašifrování textu
  3. Vložení textu do políčka výsledků
  1. Vyzvednutí zašifrovaného textu z globální proměnné
  2. Vložení textu do políčka výsledků

V aplikacích, ve kterých budeme používat více než dva formuláře, musíme dobře rozvážit, kam do zdrojového kódu funkcí formulářů umístíme jednotlivé příkazy. Musíme si také dobře rozmyslet, jak budou předávána data mezi formuláři. K tomuto úkolu nám nejlépe poslouží, nakreslíme-li si jednotlivé formuláře aplikace a doplníme k nim šipky. Každá šipka bude znázorňovat přechod mezi formuláři. V následujících kapitolách si budeme uvádět čím dál tím složitější příklady návrhu aplikací.


Příště doplníme náš program o funkci šifrování a ukážeme si, jak přenášet data mezi formuláři.