4.7. Uložení textu políčka
V datové struktuře FieldType je uložen ovladač přemístitelného bloku paměti, ve kterém je uložen text políčka. Operační systém PalmOS je navržen tak, aby co nejvíce šetřil pamětí. Pokud je políčko prázdné, není k němu přiřazen žádný blok paměti. Vepíšeme-li do políčka první znak, vytvoří operační systém nový přemístitelný blok paměti, který bude obsahovat editovaný text. Ovladač nově vytvořeného bloku je poté uložen ve struktuře FieldType.
Velikost přemístitelného bloku paměti, ve kterém je uložen text políčka, se při editaci políčka průběžně mění. Blok paměti spojený s políčkem je vždy o něco větší, než je délka textu v políčku, a jeho velikost se zvětšuje nebo zmenšuje po skocích. K získání nebo nastavení ovladače bloku paměti spojeného s políčkem použijeme funkce FldGetTextHandle() a FldSetTextHandle().
U textových políček, která nemůžeme upravovat (jsou definovány s vlastností NONEDITABLE), je mezi daty políčka uložen nejen ovladač bloku textu, ale i adresa počátku textu v paměti. Text v těchto políčkách můžeme číst i nastavovat přímo pomocí funkcí FldGetTextPtr() a FldSetTextPtr().
Nastavování textu pomocí ovladačů (FldGetTextHandle() a FldSetTextHandle()) a pomocí ukazatele (FldGetTextPtr() a FldSetTextPtr()) nemůžeme kombinovat. Pokud je políčko možno upravovat (definováno s vlastností EDITABLE v souboru prostředků aplikace), použijeme k nastavení a čtení textu ovladače bloků paměti. Je-li naproti tomu políčko definováno tak, že jej nemůžeme změnit (vlastnost NONEDITABLE), můžeme použít jak ovladače bloků paměti, tak přímo řetězce. Tyto způsoby však u jednoho políčka nelze kombinovat.
4.8. Čtení textu políčka
K textu zobrazenému v políčku můžeme přistupovat buď prostřednictvím ovladače bloku paměti, nebo prostřednictvím ukazatele na text. Tyto způsoby však spolu nemůžeme kombinovat. První způsob (použití ovladačů) je vhodný pro políčka, která uživatel může měnit. Přístup k textu prostřednictvím ukazatele na text je vhodný pro políčka, která nelze editovat.
Char* FldGetTextPtr(FieldType* políčko) Vrátí ukazatel na text políčka. | |
Vstupní parametry |
|
Vrácená hodnota |
|
Použití funkce FldGetTextPtr() s sebou přináší jedno riziko. Pokud uživatel do políčka po zavolání funkce FldGetTextPtr() vepíše text, tak se může počáteční adresa bloku paměti, ve kterém je uložen text, změnit. Adresa vrácená funkcí FldGetTextPtr() pak ukazuje na již neplatný blok paměti a její použití způsobí systémovou chybu. Pro vzyvedávání textu z políček, která může uživatel měnit, doporučuji proto používat funkci FldGetTextHandle().
MemHandle FldGetTextHandle(const FieldType* políčko) Vrátí ovladač bloku paměti, ve kterém je uložen text políčka. | |
Vstupní parametry |
|
Vrácená hodnota |
|
Pokud chceme číst text políčka, které uživatel edituje pomocí funkce FldGetTextHandle(), tak musíme vrácený blok paměti před použitím uzamknout. Jednoduchý příklad vyzvednutí textu z editovatelného políčka je v následujícím rámečku:
void KopirujTextPolicka(FieldPtr policko, Char* kam) { MemHandle ovladacTextu = FldGetTextHandle(policko); Char* textPolicka; if(ovladacTextu) { textPolicka = (Char*)MemHandleLock(ovladacTextu); StrCopy(kam, textPolicka); MemHandleUnlock(ovladacTextu); } else { // Ma-li ovladacTextu hodnotu NULL, je policko prazdne StrCopy(kam, ""); } } |
V další kapitole si ukážeme dokonalejší obalující funkci pro vyzvedávání textu políčka. Funkci budeme jako parametry navíc předávat přímo hodnotu jednoznačné identifikace políčka a nejvyšší délku textu.
Délka textu v políčku
Pokud potřebujeme rychle zjistit délku textu, který je vepsán v políčku, použijeme funkci FldGetTextLength().
UInt16 FldGetTextLength(const FieldType* políčko) | |
Vstupní parametry |
|
Vrácená hodnota |
|
Blok paměti, ve kterém je text uložen, má vždy stejnou nebo větší velikost, než je hodnota vrácená funkcí FldGetTextLength(). Najvyšší počet znaků, které můžeme do políčka vepsat, určujeme při definici políčka v souboru prostředků aplikace vlastností MAXCHARS n. Pokud by nás zajímala velikost bloku paměti, ve kterém je text políčka uložen, můžeme použít funkci FldGetTextAllocatedSize().
Příští díl věnujeme popisu toho, jak můžeme text v políčku nastavovat, a definujeme si několik dalších obalujících funkcí pro práci s políčky.