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

  • 38
Dnes dokončíme popis jednoduchého stránkování a doplníme zdrojový text o stránkování ve vstupním formuláři.

4.16. Stránkování pomocí opakovacích tlačítek

Pokud chceme náš formulář doplnit o nejjednodušší metodu posouvání textu v políčku nahoru a dolů, musíme splnit několik podmínek. Nejprve musíme zkontrolovat, zda je v souboru prostředků aplikace definováno příslušné políčko pro editaci textu s vlastností MULTIPLELINES. V blízkosti políčka musí být dvě opakovací tlačítka s šipkami nahoru a dolů. Tato opakující tlačítka budou obsahovat znaky na první a druhé pozici písma obsahujícího symboly (písmo číslo 5).

FORM ID FormularVstupni AT (0 0 160 160)
BEGIN
...
    FIELD ID PoleTextVstupni AT (...) MULTIPLELINES 
    REPEATBUTTON "\001" ID OpakujTextNahoru AT (...) NOFRAME FONT 5
    REPEATBUTTON "\002" ID OpakujTextDolu AT (...) NOFRAME FONT 5
...
END

Opakovací tlačítka většinou umisťujeme pod pravý roh políčka, ke kterému patří. Vlastnost NOFRAME určuje, že opakovací tlačítka si nepřejeme orámovat.

Do zdrojového textu naší aplikace musíme doplnit zpracování zpráv ctlRepeatEvent a keyDownEvent. Jako reakci na stisknutí opakovacího tlačítka nebo hardvarové klávesy pro stránkování musíme posunout text v políčku funkcí FldScrollField(). Text posouváme o stránku nahoru nebo dolů. Počet řádků, o které text v políčku posouváme nahoru nebo dolů, zjistíme funkcí FldGetVisibleLines().

Můžeme napsat pomocnou obalující funkci, která posune text v políčku nahoru nebo dolů. Tuto funkci budeme volat při jakémkoliv posunutí textu v políčku.

void PosunTextOStranku(UInt16 idPolicka, WinDirectionType smer)
{
    FieldPtr policko = (FieldPtr)Objekt(idPolicka);
    UInt16 radky;

    if(policko)
    {
        radky = FldGetVisibleLines(policko);
        FldScrollField(policko, radky, smer);
    }
}

Pomocnou obalující funkci PosunTextOStranku() budeme volat při zpracování událostí stisknutí hardwarových kláves pro posuv nahoru nebo dolů. Parametr smer může nabývat hodnot winUp nebo winDown.

static Boolean UdalostVstupnihoFormulare(EventPtr udalost)
{
    Boolean zpracovano = false;

    switch(udalost->eType)
    {
        ...
		 					  
        case keyDownEvent:

            // Stisk klávesy - zajímají nás pouze hardwarové klávesy

            switch(udalost->data.keyDown.chr)
            {
                case vchrPageUp:
                    PosunTextOStranku(PoleTextVstupni, winUp);
                    zpracovano = true;
                    break;

                case vchrPageDown:
                    PosunTextOStranku(PoleTextVstupni, winDown);
                    zpracovano = true;
                    break;

                default:
                    break;
            }
            break;
    }
...

Podobně budeme postupovat i při zpracování zprávy ctlRepeatEvent. Nesmíme však zapomenout nenastavovat při zpracování události stisknutí opakovacích tlačítek příznak zpracování události. Pokud funkce formuláře vrátí nenulovou hodnotu, nebude se operační systém již zpracovávanou událostí zabývat. Při stisknutí opakovacích tlačítek však potřebujeme, aby se operační systém PalmOS postaral o automatické opakování, a funkce formuláře musí vrátit hodnotu false.

static Boolean UdalostVstupnihoFormulare(EventPtr udalost)
{
    Boolean zpracovano = false;

    switch(udalost->eType)
    {
        ...
    
        case ctlRepeatEvent:

            // Strankovani nahoru a dolu pomoci tlacitek

            switch(udalost->data.ctlRepeat.controlID)
            {
                case OpakujTextNahoru:
                    PosunTextOStranku(PoleTextVstupni, winUp);
                    break;

                case OpakujTextDolu:
                    PosunTextOStranku(PoleTextVstupni, winDown);
                    break;

                default:
                    break;
            }
			
                // Nesmí být nastaven příznak zpracováno

            break;

        default:
            break;
    }

    return zpracovano;
}

Ještě musíme vyřešit poslední úkol: upravit po každé změně textu v políčku zobrazení opakujících tlačítek. Opakující tlačítka pro posuv textu nahoru a dolů informují uživatele o tom, zda může posunovat text nahoru nebo dolů. Příkazy pro úpravu zobrazení opakovacích tlačítek jsme již v této kapitole uváděli. Doplníme náš zdrojový text o další pomocnou funkci, která bude upravovat zobrazení opakujících tlačítek v uávislosti na textu v políčku.

void UpravTlacitkaStrankovani(UInt16 idPolicka, UInt16 idNahoru, UInt16 idDolu)
{
    FormPtr formular = FrmGetActiveForm();
    FieldPtr policko = (FieldPtr)Objekt(idPolicka);

    if(policko)
    {
        FrmUpdateScrollers(formular,
            FrmGetObjectIndex(formular, idNahoru),
            FrmGetObjectIndex(formular, idDolu),
            FldScrollable(policko, winUp),
            FldScrollable(policko, winDown));
	}
}

Popsané funkci UpravTlacitkaStrankovani() předáme čísla prostředků jak políčka, tak obou opakujících tlačítek. Tuto funkci musíme zavolat po každé úpravě textu v políčku: přidání nebo vymazání znaku, táhnutí perem v políčku, stisknutí stránkovacího tlačítka. Nejjednodušší je volat funkci UpravTlacitkaStrankovani() při každém volání funkce formuláře.

static Boolean UdalostVstupnihoFormulare(EventPtr udalost)
{
    Boolean zpracovano = false;

    switch(udalost->eType)
    {
        ...
	
        default:
            break;
    }

        // Voláme při každém průběhu funkcí formuláře 
		
    UpravTlacitkaStrankovani(PoleTextVstupni, OpakujTextNahoru, OpakujTextDolu);

    return zpracovano;
}

Kompletní zdrojový text aplikace, ve které je doplněno jednoduché stránkování pomocí opakovacích tlačítek, si můžete prohlédnout zde.


Příště přikročíme k popisu posouvání textu v políčku pomocí posuvníku.