3.16. Čtení a nastavování hodnoty přepínačů a políček k zaškrtnutí
Přepínače i políčka k zaškrtnutí mohou být buď ve vypnutém, nebo v zapnutém (invertovaném nebo zaškrtnutém) stavu. Pomocí funkce CtlGetValue() je možné zjistit logickou hodnotu (true nebo false) odpovídající stavu tlačítka.
Int16 CtlGetValue(const ControlType *control) Zjistí stav přepínače nebo políčka k zaškrtnutí. | |
Vstupní parametry |
|
Vrácená hodnota |
|
Stav přepínačů nebo políček k zaškrtnutí je možné i nastavit pomocí funkce CtlSetValue(). Této funkci předáme ukazatel na datovou strukturu příslušného prvku formuláře a logickou hodnotu odpovídající požadovanému novému stavu přepínače. O případné překreslení prvku formuláře na displeji se postará operační systém PalmOS sám.
void CtlSetValue(ControlType *control, Int16 hodnota) Změní stav přepínače nebo políčka k zaškrtnutí a překreslí jej na displeji. | |
Vstupní parametry |
|
Ukazatel na datovou strukturu přepínače nebo políčka k zaškrtnutí, který vyžadují funkce v této kapitole, získáme voláním funkcí FrmGetObjectPtr() a FrmGetObjectIndex(). Chceme-li hodnotu těchto prvků formuláře nastavit nebo číst v našem programu, budeme potřebovat funkci, která bude jako parametr požadovat spíše hodnotu jednoznačné identifikace prvku formuláře.
MemPtr Objekt(UInt16 prvek) { FormPtr formular = FrmGetActiveForm(); return FrmGetObjectPtr(formular, FrmGetObjectIndex(formular, prvek)); } |
V oddíle 3.8. jsme si ukázali funkci Objekt(), která vrátí adresu kontrolní struktury prvku aktuálního formuláře v závislosti na jeho jednoznačné identifikaci. V programu můžeme tuto funkci použít dvěma způsoby. Pro každou funkci, která vyžaduje ukazatel na datovou strukturu, můžeme do programu začlenit příslušnou obalující funkci, která zjednoduší zápis programu jako v následujícím příkladu.
Termínem obalující funkce budeme rozumět takovou naši funkci, která slouží k zjednodušenému volání systémové funkce PalmOS. Důvodem pro vytváření obalujících funkcí je hlavně (jako v následujícím příkladu) zpřehlednění zápisu zdrojového textu programu.
Boolean Zaskrtnuto(UInt16 jednoznacneID) { ControlPtr control = (ControlPtr)Objekt(jednoznacneID); return CtlGetValue(control); } // použití if(Zaskrtnuto(PolickoJedna)) { // příkazy vykonávané, je-li políčko k zaškrtnutí aktivní } |
Předchozí obalující funkci můžeme zjednodušit a použít příkaz preprocesoru jazyka C #define. Použití je stejné jako v předchozím příkladu:
#define Zaskrtnuto(policko) CtlGetValue((ControlPtr)Objekt(policko)) |
Třetí a nejméně přehledný způsob je uvádět funkci Objekt() (nebo podobnou) na každém řádku, například:
CtlSetValue((ControlType)Objekt(PrepinacJedna), true); CtlSetValue((ControlType)Objekt(PrepinacDva), false); ... |
3.17. Skupiny přepínačů nebo políček k zaškrtnutí
Pomocí vlastnosti GROUP můžeme v souboru prostředků aplikace vytvářet skupiny přepínačů nebo políček k zaškrtnutí. Z každé skupiny může být aktivní jen jediný prvek.
Ke zjištění, který prvek ze skupiny je aktivní, můžeme použít funkci CtlGetValue(). Pokud jsou ve skupině pouze dva prvky, je tento způsob výhodný; se stoupajícím počtem přepínačů nebo políček k zaškrtnutí ve skupině se však komplikuje.
Ke zjištění, který prvek ze skupiny je aktivní, slouží funkce FrmGetControlGroupSelection(). Této funkci předáme číslo skupiny, která nás zajímá. Funkce FrmGetControlGroupSelection() pak vrátí index prvku skupiny, který je vybrán. Připomeňme, že index je pořadové číslo prvku ve formuláři, které převedeme na hodnotu jednoznačné identifikace pomocí funkce FrmGetObjectId().
UInt16 FrmGetControlGroupSelection(FormType *formular, UInt8 skupina) Vrátí index prvku formuláře, který je v dané skupině aktivní. | |
Vstupní parametry |
|
Vrácená hodnota |
|
Ve verzích PalmOS nižších než 3.5 vracela tato funkce osmibitovou hodnotu. Příklad obalující funkce, která zjednodušuje použití funkce FrmGetControlGroupSelection() v našem programu, je v následujícím rámečku. Uvedená funkce opravuje také chybu v dřívějších verzích PalmOS.
UInt16 VybranoZeSkupiny(UInt8 skupina, UInt16 jinak) { FormPtr formular = FrmGetActiveForm(); UInt16 index = FrmGetControlGroupSelection(formular, skupina); if((index & 0xFF) == (frmNoSelectedControl & 0xFF)) { return jinak; } else { return FrmGetObjectId(formular, index); } } // Použití switch(VybranoZeSkupiny(SkupinaJedna, 0)) { case TlacitkoJedna: ... case TlacitkoDva: ... } |
Funkce FrmSetControlGroupSelection() doplňuje předchozí funkci a umožňuje aktivovat libovolný prvek skupiny. Všechny ostatní prvky skupiny budou pak neaktivní. Funkce pracuje přímo s jednoznačnou identifikací prvku a číslem skupiny, a proto je její použití (na rozdíl od funkce předešlé) velmi jednoduché:
void FrmSetControlGroupSelection(const FormType *formular, UInt8 skupina, UInt16 id) Vybere (aktivuje) jeden prvek z dané skupiny. | |
Vstupní parametry |
|
Funkce také aktualizuje zobrazení na displeji - překreslí všechny prvky skupiny. Použití funkce FrmSetControlGroupSelection() je velmi přímočaré a ilustruje jej následující rámeček kódu:
FrmSetControlGroupSelection(FrmGetActiveForm(), SkupinaJedna, TlacitkoJedna); |
V následujícím dílu dokončíme popis funkcí manipulujících s kontrolními prvky formulářů popisem funkcí, které mění text v tlačítku a umožňují tlačítka schovávat a odkrývat.