Premium

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

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

Po týdenním výpadku, za který se omlouváme, pokračujeme v programování pro PalmOS!

3.20. Pomocné funkce ve zdrojovém kódu

Návrh programu se nám výrazně zjednoduší, budeme-li již od začátku používat pomocné funkce pro obsluhu systémových volání. Jména pomocných funkcí vám doporučuji zvolit česká, aby se tyto funkce snadno odlišily od systémových volání. Prohlédněte si dva příklady v následujícím rámečku:

// Příklad 1 - přímé volání systémových funkcí

...

  if(CtlGetValue((ControlPtr)FrmGetObjectPtr(formular, FrmGetObjectIndex(formular, TlacitkoJedna))))
  {
    promenna = 1; 
  }

...
  
// Příklad 2 - pomocné funkce

Boolean JeStisknute(FormPtr formular, UInt16 id)
{
  UInt16 index = FrmGetObjectIndex(formular, id);
  ControlPtr tlacitko = (ControlPtr)FrmGetObjectPtr(formular, index);
  return CtlGetValue(tlacitko);
}

...

  if(JeStisknute(formular, TlacitkoJedna))
  {
    promenna = 1; 
  }

...    

Zdrojový text ve druhém příkladu je sice delší, použitím pomocné funkce však program získává na srozumitelnosti. Rychlost a velikost programu jsou díky kvalitní optimalizaci kompilátoru gcc ovlivněny jen minimálně.

Pomocné funkce, které jste již napsali, můžete mít uložené samostatně a při psaní nového programu je vložit do zdrojového textu. V dalších kapitolách si ukážeme, jak je možné vytvářet knihovnu pomocných funkcí.

Pomocné funkce pro překreslení a zjištění stavu tlačítka

Změníme-li text tlačítka, tak se změna projeví na displeji až při jeho opětovném vykreslení funkcí CtlDrawControl(). Před vykreslením musíme ale sami tlačítko vymazat funkcí CtlEraseControl(), jinak by nebyl nový text čitelný. Pomocná funkce, která tento úkol usnadní je následující:

static void PrekresliTlacitko(UInt16 prvekTlacitka)
{
    ControlPtr tlacitko = (ControlPtr)Objekt(prvekTlacitka);

    CtlEraseControl(tlacitko);
    CtlDrawControl(tlacitko);
}

Zda je tlačítko nebo políčko k zaškrtnutí vybrané nebo ne, zjistíme pomocí funkce CtlGetValue(). I pro použití této funkce je výhodné napsat si funkci pomocnou, která zpřehlední zápis programu:

static Boolean JeVybrane(UInt16 prvekTlacitka)
{
    ControlPtr tlacitko = (ControlPtr)Objekt(prvekTlacitka);

    return CtlGetValue(tlacitko);
}

Základem úspěšného použití pomocných funkcí ve vašich programech je několik zásad, které si pro přehlednost uvedeme v seznamu:

  • Jména pomocných funkcí zvolit jednoduchá a přitom dostatečně výstižná.
  • Nedávat funkcím jména, která by mohla být zaměněna se jmény funkcí PalmOS.
  • Nepoužívat ve svých funkcích žádné globální proměnné.
  • Používat pouze datové typy podporované PalmOS (Int16 místo int apod.).
  • Zkontrolovat, zda funkce za určitých okolností (třeba předáme-li ji jako parametr příliš dlouhý řetězec) nemůže způsobit systémovou chybu a tyto případy ošetřit.

3.21. Vlastní výpočet

Při použití pomocných funkcí, které jsme si uvedli v předchozím odstavci, můžeme nyní napsat jednoduchou funkci, která spočte spodní a horní hodnotu pásma cílové výšky. Popsaná funkce poté text zobrazí ve dvou tlačítkách, která nepůjdou stisknout a budou pouze tvořit rámečky pro text (budou v souboru prostředků aplikace deklarována s atributem DISABLED).

V našem programu proto musíme nejprve deklarovat dvě řetězcové proměnné, ve kterých budou uloženy texty těchto dvou tlačítek. Tyto proměnné budou obsahovat výšku v centimetrech, která do nich bude ukládána přímo funkcí StrIToA(). Tyto proměnné doporučuji deklarovat s délkou maxStrIToALen (a to i když v nich nebude nikdy delší než trojmístné číslo). Ve funkci formuláře pak voláním funkce CtlSetLabel() nastavíme příslušná tlačítka tak, aby zobrazovala text v těchto proměnných.

Char gVysledekSpodni[maxStrIToALen] = "";
Char gVysledekHorni[maxStrIToALen] = "";

Tuto funkci pro výpočet budeme volat pokaždé, když se změní data ve formuláři. Uživatel může změnit hodnotu výšky jednoho z rodičů i pohlaví dítěte - tato změna se musí bezprostředně odrazit ve výsledných číslech. Ve funkci formuláře si tedy musíme ohlídat jak změnu kterékoliv číslice výšek rodičů, tak stisknutí některého z políček pro zaškrtnutí pohlaví. Příklad řešení funkce formuláře je v následujícím rámečku:

static Boolean UdalostHlavnihoFormulare(EventPtr udalost)
{
    Boolean zpracovano = false;
    Boolean zmena = false;

        // Zavedeme pomocnou promennou, ktera bude mit hodnotu
        // |true| pokud zmenime data ve formulari
        
    switch(udalost->eType)
    {
        case frmOpenEvent:
		
                ...  

                // Inicializujeme tlacitka, ve kterych zobrazujeme
                // vysledek
                
            CtlSetLabel((ControlPtr)Objekt(TlacitkoVyskaOd), gVysledekSpodni);
            CtlSetLabel((ControlPtr)Objekt(TlacitkoVyskaDo), gVysledekHorni);

            FrmDrawForm(FrmGetActiveForm());

                // Na zacatku nastavime parametr |zmena| tak, aby se
                // zobrazila vypoctena data.

            zmena = true;
            zpracovano = true;
            break;

        case ctlSelectEvent:
            switch(udalost->data.ctlSelect.controlID)
            {
                ...
                    // Sledujeme zpravy generovane policky k zaskrtnuti -
                    // pokud zmenime pohlavi zmeni se totiz i vysledek ...

                case ZaskrtniChlapec:
                case ZaskrtniDivka:
                    zmena = true;
                    break;

                default:
                    break;
            }
            break;

        case ctlRepeatEvent:

            switch(udalost->data.ctlRepeat.controlID)
            {
                case OpakujOtecPlus:
                    zmena = UpravTlacitko(SkupinaOtec, 1);
                    break;

                case OpakujOtecMinus:
                    zmena = UpravTlacitko(SkupinaOtec, -1);
                    break;

                case OpakujMatkaPlus:
                    zmena = UpravTlacitko(SkupinaMatka, 1);
                    break;

                case OpakujMatkaMinus:
                    zmena = UpravTlacitko(SkupinaMatka, -1);
                    break;
            }
            break;

        default:
            break;
    }

        // Byla-li zmeneno nektere z cisel nebo pohlavi, bude
        // vysledek prepocitan a znovu zobrazen
        
    if(zmena)
    {
        SpoctiANastavVysledek();
    }

    return zpracovano;
}

Ve funkci SpoctiANastavVysledek() použijeme naše pomocné funkce JeVybrane() a PrekresliTlacitko(). Zdrojový text funkce, který byste ale již uměli napsat sami, je následující:

static void SpoctiANastavVysledek()
{
    UInt16 vyskaMatky = (gMatka100cm[0] - '0') * 100 + (gMatka10cm[0] - '0') * 10 + gMatka1cm[0] - '0';
    UInt16 vyskaOtce = (gOtec100cm[0] - '0') * 100 + (gOtec10cm[0] - '0') * 10 + gOtec1cm[0] - '0';
    UInt16 stred = 0;

        // Kontrola spravnosti a vypocet

    if(vyskaMatky > 154 >> vyskaMatky < 178 >> vyskaOtce > 165 >> vyskaOtce < 193)
    {
            // Testujeme pohlavi podle ctverecku k zaskrtnuti
            
        if(JeVybrane(ZaskrtniChlapec))
        {
            stred = (vyskaOtce + vyskaMatky + 13 + 1) / 2;
        }
        else if(JeVybrane(ZaskrtniDivka))
        {
            stred = (vyskaOtce + vyskaMatky - 13 + 1) / 2;
        }
    }

        // Byl-li vypocet stredu spravny, uloz do globalnich
        // promennych, ktere obsahuji text tlacitek, ciselne
        // hodnoty; jinak tam budou otazniky.
        
    if(stred > 0)
    {
        StrIToA(gVysledekSpodni, stred - 10);
        StrIToA(gVysledekHorni, stred + 10);
    }
    else
    {
        StrCopy(gVysledekSpodni, "?");
        StrCopy(gVysledekHorni, "?");
    }

        // Po nastaveni prekreslime obe tlacitka
        // (promenne obsahujici text byly aktualizovany)
        
    PrekresliTlacitko(TlacitkoVyskaOd);
    PrekresliTlacitko(TlacitkoVyskaDo);
}

Zdrojový text příkladu si můžete stáhnout zde. Sami jistě přijdete na mnoho vylepšení. Můžete do programu například doplnit kontrolu vstupních hodnot výšky matky a otce tak, aby nebylo možné zadat nesmyslné číslo. Také se můžete zamyslet nad jinými způsoby vstupu číselných údajů. Co třeba udělat jednu skupinu přepínačů pro stovky a desítky centimetrů a druhou pro jednotky?


V příští a poslední části třetí kapitoly si povíme o způsobu, jak uložit stav našeho programu tak, aby měl uživatel při práci s ním dojem multitaskingu.

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

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

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

Svatý grál na suchou kůží na nohou. Přečtěte si, co vám pomůže!
Svatý grál na suchou kůží na nohou. Přečtěte si, co vám pomůže!

30 uživatelů eMimina mělo možnost otestovat krém na nohy od Manufaktury z kolekce Louka. Pomohl vám na suchou a hrubou pokožku chodidel? Přečtěte...

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

Za vytlačení z linky do Brna musí Student Agency zaplatit náhradu 21 milionů

Společnost Student Agency provozující autobusy a vlaky pod označením RegioJet musí zaplatit bývalému konkurentovi 21...