4.9. Nastavování textu v políčku
Pro nastavování textu v políčku můžeme - podobně jako pro čtení - použít jak ovladač bloku paměti, tak přímo adresu textu. Tyto způsoby ale nemůžeme použít oba u jednoho políčka.
void FldSetTextPtr(FieldType* políčko, Char* text) Nastaví ukazatel na text políčka. | |
Vstupní parametry |
|
Funkce FldSetTextPtr() je určena pro nastavování textu v políčkách, která nedovolíme uživateli měnit. Tato políčka můžeme použít pro text, který chceme jen zobrazit ve formuláři. Chceme-li text políčka vymazat, můžeme použít příkaz FldSetTextPtr(policko, NULL).
Pokud se rozhodneme nastavovat text políčka funkcí FldSetTextPtr(), tak musíme zajistit, aby byl ukazatel na text, který jsme funkci předali, po celou dobu zobrazení formuláře stále platný. Po nastavení textu políčka funkcí FldSetTextPtr() není změněn text na displeji. Po nastavení textu musíme sami zavolat funkci FldDrawField(), která políčko na displeji vymažou a vykreslí s novým textem.
void FldSetTextHandle(FieldType* políčko, MemHandle ovladač) Nastaví ovladač bloku paměti, ve kterém je uložen text políčka. | |
Vstupní parametry |
|
Funkci FldSetTextHandle() můžeme použít k nastavení textu všech textových políček - editovatelných i těch, která uživatel programu nemůže měnit. Podobně jako předchozí funkce i funkce FldSetTextHandle() neobnovuje obsah displeje; po nastavení nového textu políčka musíme zavolat FldDrawField() k překreslení políčka.
Předáme-li funkci FldSetTextHandle() hodnotu NULL jako nový ovladač bloku paměti, bude text políčka vymazán. S použitím této funkce je svázána ještě jedna komplikace, kterou musíme vzít v úvahu: musíme vrátit systému nepoužité bloky paměti.
Ovladač bloku paměti, ve kterém je uložen text políčka, je uložen v datové struktuře FieldType. Při zrušení formuláře, ve kterém jsme políčko umístili, je tento blok paměti automaticky vrácen operačnímu systému. Pokud však předáme operačnímu systému nový blok paměti, ve kterém bude text políčka, tak se o vrácení původního bloku paměti operačnímu systému musíme postarat sami.
Chceme-li tedy úspěšně nastavit nový text políčka pomocí funkce FldSetTextHandle() musíme udělat následující:
- Vytvořit blok paměti, do kterého uložíme nový text políčka. Tento blok musí obsahovat text políčka a ukončující znak '\0'.
- Zjistit původní ovladač bloku paměti, ve kterém je text políčka, funkcí FldGetTextHandle().
- Připojit funkcí FldSetTextHandle() k políčku nově vytvořený blok paměti.
- Překreslit políčko.
- Zrušit blok paměti, ve kterém byl uložen starý text políčka.
void NastavTextPolicka(FieldPtr policko, CharPtr text) { MemHandle novyOvladac, staryOvladac; novyOvladac = (Handle)MemHandleNew(StrLen(text) + 1); StrCopy((CharPtr)MemHandleLock(novyOvladac), text); MemHandleUnlock(novyOvladac); staryOvladac = FldGetTextHandle(policko); FldSetTextHandle(policko, novyOvladac); FldDrawField(policko); if(staryOvladac) { MemHandleFree(staryOvladac); } } |
Celý postup je zřejmý z předchozí obalující funkce. Pokud zapomeneme vrátit operačnímu systému blok, ve kterém byl původní text, bude postupně ubývat volná paměť. V původní dokumentaci je uvedeno, že při překreslení políčka jej musíme nejprve vymazat a poté vykreslit znovu. Funkce FldDrawField() však obstarává překreslování políček zcela sama a nevyžaduje předchozí vymazání políčka.
V příštím 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.