Premium

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

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

V tomto dílu doplníme program o schopnost nastavování výšky matky a otce.

3.19. Nastavování výšky matky a otce v našem programu

Připomeňme si, jak budeme v našem programu nastavovat výšku matky a otce - budeme mít tři přepínače obsahující číslice stovek, desítek a jednotek centimetrů. Vpravo od nich budou dvě opakovací tlačítka: jedno pro zvětšení vybrané číslice a druhé pro její zmenšení.

U každé trojice přepínačů (stovky, desítky a jednotky centimetrů) je uvedeno jiné číslo skupiny. Připomeňme, že z každé skupiny přepínačů může být aktivní jen jeden. Na zprávy těchto přepínačů nemusíme nijak reagovat.

Budou nás však zajímat zprávy opakujících tlačítek pro zmenšení nebo zvětšení hodnoty. Po stisknutí jednoho z těchto tlačítek budeme muset změnit číslici ve vybraném přepínači o jedničku nahoru nebo dolů. Jednotlivé součásti programu si rozebereme podrobněji.

Pomocné funkce

V našem programu budeme používat jedinou pomocnou funkci, a to funkci Objekt(), která vrátí ukazatel na datovou strukturu objektu v závislosti na jeho jednoznačné identifikaci. Tuto funkci jsme již v této kapitole uvedli a nebudeme se jí dále zabývat.

Přepínače jsou uspořádané do skupin

V souboru prostředků aplikace při definování formuláře nesmíme zapomenout uvést u obou trojic přepínačů odlišné číslo skupiny (vlastnost GROUP). Výhodné je použít k tomu konstantu, která byla definována v hlavičkovém souboru:

FORM ID FormularHlavni AT (0 0 160 160)
BEGIN
    ...
    PUSHBUTTON "" ID TlacitkoMatka100cm AT (...) GROUP SkupinaMatka
    PUSHBUTTON "" ID TlacitkoMatka10cm AT (...) GROUP SkupinaMatka
    PUSHBUTTON "" ID TlacitkoMatka1cm AT (...) GROUP SkupinaMatka
    ...
END

Podobně je uvedeno číslo skupiny (které má hodnotu SkupinaOtec) i u tlačítek pro zadávání výšky otce. Jako text tlačítek můžeme u všech těchto tlačítek ponechat prázdný řetězec; budeme jej nastavovat v programu sami.

Bude se měnit text přepínačů

Protože text uvedený v přepínačích (číslice) se bude měnit, musíme pro každé tlačítko deklarovat vlastní globální řetězcovou proměnnou, ve které bude uložen ukazatel na text tlačítka. Pokud hodnotu této proměnné změníme a překreslíme tlačítko (vymažeme a znovu nakreslíme funkcemi CtlEraseControl() a CtlDrawControl()), změní se i zobrazený text tlačítka.

Jména globálních proměnných budou vždy začínat malým písmenem "g". Definice těchto proměnných na začátku programu je v následujícím rámečku. Proměnným přiřazujeme počáteční hodnoty, které musí být číselné.

Char gMatka100cm[2] = "1";
Char gMatka10cm[2] = "7";
Char gMatka1cm[2] = "0";
Char gOtec100cm[2] = "1";
Char gOtec10cm[2] = "8";
Char gOtec1cm[2] = "0";

Na začátku programu tedy musíme nastavit ukazatel na text každého tlačítka tak, aby ukazoval na příslušnou globální proměnnou. Toto nastavení provedeme ve funkci formuláře při zpracování události frmOpenEvent voláním funkce CtlSetLabel(). Nejlepší místo pro toto nastavení je před vykreslením formuláře funkcí FrmDrawForm().

Nastavení ukazatelů na text tlačítek

Připomeňme si, že zpráva frmOpenEvent je zaslána naší aplikaci v okamžiku, kdy je formulář inicializován a připraven k vykreslení na displeji. Tuto zprávu zpracováváme ve funkci formuláře, kde na ni většinou reagujeme případnou inicializací datových struktur a poté vykreslením formuláře.

    case frmOpenEvent:

        CtlSetLabel((ControlPtr)Objekt(TlacitkoOtec1cm), gOtec1cm);
        CtlSetLabel((ControlPtr)Objekt(TlacitkoOtec10cm), gOtec10cm);
        ...
        FrmDrawForm(FrmGetActiveForm());
        zpracovano = true;
        break;

V našem programu zavoláme při zpracování této události funkci CtlSetLabel() pro každý přepínač, jehož text budeme v měnit. V ukázce si povšimněte použití pomocné funkce Objekt(). Tato funkce vrací ukazatel na datovou strukturu objektu formuláře (v tomto případě přepínače) a její vrácenou hodnotu musíme převést na správný typ (pro přepínač je to ControlPtr).

Změna textu tlačítka

Stiskne-li uživatel jedno z opakovacích tlačítek pro změnu některé z číslic výšky, musíme vybranou číslici změnit. Tuto změnu budeme provádět ve funkci, které jako parametr předáme dvě hodnoty: označení skupiny tlačítek (jednu z konstant SkupinaOtec nebo SkupinaMatka) a hodnotu, o kolik chceme číslici změnit.

V této funkci pak musíme udělat následující:

  1. zjistit, které tlačítko ze skupiny je vybrané (funkcí FrmGetControlGroupSelection())
  2. vyzvednout ukazatel na text vybraného přepínače (funkcí CtlGetLabel())
  3. změnit číslici v textu přepínače
  4. překreslit tlačítko (funkcemi CtlEraseControl() a CtlDrawControl())

V následujícím rámečku je uvedena popsaná funkce pro změnu textu tlačítka.

static void UpravTlacitko(UInt16 skupina, Int16 pricti)
{
    UInt16 indexTlacitka;
    UInt16 prvekTlacitka;
    Char* textTlacitka;
    FormPtr formular;
    Int16 cisloTlacitka;
    Boolean zmena = false;


        // Pokud je v teto skupine nejake tlacitko nastavene, vrati
        // funkce FrmGetControlGroupSelection() jeho index.
        
    formular = FrmGetActiveForm();
    indexTlacitka = FrmGetControlGroupSelection(formular, skupina);
    
        // Pokud bylo nejake tlacitko ve skupine zvyraznene, muzeme
        // jej menit.
        
    if(indexTlacitka != frmNoSelectedControl)
    {
            // V kazdem tlacitku je ulozen ukazatel na jeho text,
            // ktery muzeme vyzvednout pomoci funkce CtlGetLabel().
            
        textTlacitka = (Char*)CtlGetLabel((ControlPtr)FrmGetObjectPtr(formular, indexTlacitka));

            // Provedeme zmenu textu v pameti a podle ni nastavime
            // promennou informujici nas o zmene hodnoty tlacitka.
            // Zkontrolujeme pritom, aby v tlacitku byla cislice od
            // nuly do devitky.
            
        cisloTlacitka = (textTlacitka[0] - '0') + pricti;
        zmena = (cisloTlacitka >= 0) && (cisloTlacitka <= 9);

        if(zmena)
        {
            textTlacitka[0] = '0' + cisloTlacitka;

            // Prekresleni tlacitka
        }

    }
}

Tlačítko překreslíme voláním funkce CtlEraseControl(), která jej vymaže z displeje, a funkce CtlDrawControl(), která tlačítko vykreslí s novým textem. Zkuste sami vymyslet, jak bude možné tyto funkce volat se správnými parametry (toto zadání má více řešení: zkuste nalézt alespoň dvě).

Opakovací tlačítka

Při zpracování zpráv ctlRepeatEvent, které generují opakovací tlačítka, budeme volat právě popsanou funkci UpravTlacitko(). Funkci UpravTlacitko() předáme příslušné parametry: číslo skupiny, které se změna týká, a hodnotu +1 nebo -1 podle toho, zda číslici upravujeme směrem nahoru nebo směrem dolů.

        case ctlRepeatEvent:

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

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

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

            break;

Důležité je, že při zpracování opakujících tlačítek musí funkce formuláře vracet nulovou hodnotu, aby mohl operační systém tlačítka správně zvýrazňovat a mazat. Proto při zpracování zprávy ctlRepeatEvent nenastavujeme hodnotu proměnné zpracovano na hodnotu true.

Teď již tlačítka pro nastavování výšky matky a otce fungují tak, jak od nich očekáváme. Zde si můžete stáhnout zdrojový text i s dvěma příklady řešení překreslení přepínačů.


Příště náš program doplníme o vlastní výpočet cílové výšky - zkuste si ale sami rozmyslet, co všechno k tomu budete potřebovat a co ještě v programu postrádáte.

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

Doma si natáhnete neviditelné kabely k internetu. Huawei ukázal inovace

17. dubna 2024

Huawei na každoroční roadshow ukázal v Praze své inovace pro letošní rok. Vedle průmyslových...

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

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

Možná s nenápadnou výbavou, ale je to poctivě postavená stylovka

22. dubna 2024

Oppo se v kontextu dalších čínských výrobců prezentuje jako prémiová značka. Rozhodně se nesnaží o...

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

Slož puzzle a vyhraj jedinečné dárky od značky BEBELO
Slož puzzle a vyhraj jedinečné dárky od značky BEBELO

Každý den po celý tento týden můžete vyhrávat jedinečné dárky od značky BEBELO.

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

Sexy Sandra Nováková pózovala pro Playboy. Focení schválil manžel

Herečka Sandra Nováková už několikrát při natáčení dokázala, že s odhalováním nemá problém. V minulosti přitom tvrdila,...

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