3.8. Organizace prvků formuláře
V definičním souboru prostředků aplikace je ke každému prvku formuláře (tlačítko, přepínač) přiřazena 16bitová konstanta - jeho jednoznačná identifikace. K prvkům formuláře můžeme přistupovat právě prostřednictvím této konstanty, definované v hlavičkovém souboru.
V souboru *.prc a v paměti Palm Pilotu následují prvky formuláře za sebou v pořadí, v jakém byly definovány v souboru prostředků aplikace. Každý prvek má tak jednoznačně přiřazeno svoje pořadové číslo.
FORM ID Formular AT (30 60 100 100) MODAL BEGIN TITLE "Akce" LABEL "Vyberte akci" AUTOID AT (CENTER@50 20) BUTTON "Akce 1" ID Tlacitko1 AT (CENTER@50 PREVBOTTOM+2 AUTO AUTO) BUTTON "Akce 2" ID Tlacitko2 AT (CENTER@50 PREVBOTTOM+2 AUTO AUTO) END |
V předcházející definici jsme definovali jednoduchý formulář se dvěma tlačítky. Prvky tohoto formuláře jsou uloženy v paměti za sebou, podobně jako v následující tabulce.
Pořadové číslo prvku |
Popis | Jednoznačná identifikace |
---|---|---|
0 | Nadpis - TITLE | nemá |
1 | Text - LABEL AUTOID | 9000 (přiřazeno automaticky) |
2 | Tlačítko 1 - BUTTON ID Tlacitko1 ... | Tlacitko1 |
3 | Tlačítko 2 - BUTTON ID Tlacitko2 ... | Tlacitko2 |
Pořadové číslo prvku versus jeho jednoznačná identifikace
Pro zkomplikování práce programátorů asi polovina funkcí pracujících s prvky formuláře používá pořadové číslo (index) prvku. Parametrem druhé poloviny funkcí je naopak jednoznačná identifikace prvku formuláře (ID). Pro převod mezi pořadovým číslem prvku a jeho jednoznačnou identifikací slouží následující dvě funkce:
UInt16 FrmGetObjectId(const FormType *formular, UInt16 objIndex) Získá jednoznačnou identifikaci prvku z jeho pořadového čísla v inicializovaném formuláři | |
Vstupní parametry |
|
Vrácená hodnota |
|
Obě tyto funkce vyžadují ukazatel na inicializovaná data formuláře v paměti Palm Pilota (parametr formular). Funkce pracují pouze s prvky inicializovaného formuláře (který byl inicializován funkcí FrmInitForm()).
UInt16 FrmGetObjectIndex(const FormType *formular, UInt16 objID) Vrátí pořadové číslo prvku v inicializovaném formuláři podle jeho jednoznačné identifikace | |
Vstupní parametry |
|
Vrácená hodnota |
|
POZNÁMKA: V originální dokumentaci není uvedeno, jakou hodnotu vrací funkce FrmGetObjectIndex(), předáme-li jí omylem neplatnou hodnotu jednoznačné identifikace prvku (nebo prvek jiného formuláře).
3.9. Ukazatel na data prvku formuláře
Pro práci s prvky formuláře v dalších kapitolách budeme potřebovat (kromě jejich jednoznačné identifikace a pořadového čísla ve formuláři) ještě ukazatel na strukturu obsahující data prvku.
void *FrmGetObjectPtr(const FormType *formular, UInt16 objIndex) Vrátí ukazatel na strukturu obsahující data prvku | |
Vstupní parametry |
|
Vrácená hodnota |
|
Parametrem funkce FrmGetObjectPtr() je pořadové číslo prvku ve formuláři. V praxi je však vhodnější používat jako parametr spíše jeho jednoznačnou identifikaci (konstanty z hlavičkového souboru). Proto budeme v našem programu často potřebovat funkci, která vrátí ukazatel na strukturu obsahující data prvku v závislosti na jednoznačné identifikaci prvku.
MemPtr AdresaObjektu(FormPtr formular, UInt16 prvek) { UInt16 index = FrmGetObjectIndex(formular, prvek); return FrmGetObjectPtr(formular, index); } |
Protože tuto funkci budeme většinou volat pro prvky v aktivním formuláři, můžeme tuto funkci definovat i následujícím způsobem. Při něm eliminujeme nutnost předávání odkazu na formulář a místo toho používáme funkci FrmGetActiveForm().
MemPtr Objekt(UInt16 prvek) { FormPtr formular = FrmGetActiveForm(); return FrmGetObjectPtr(formular, FrmGetObjectIndex(formular, prvek)); } |
Hodnotu, kterou vrátí tato funkce, musíme sami přetypovat na ukazatel na data příslušného prvku formuláře. Je-li například příslušným prvkem formuláře tlačítko, přetypujeme vrácenou hodnotu na ControlPtr. Použití obou těchto funkcí je v následujícím rámečku s příkladem (funkce CtlSetLabel() změní text v tlačítku).
void NastavUkazatelTextu(FormPtr formular, UInt16 prvekTlacitka, Char* text) { ControlPtr tlacitko = (ControlPtr)AdresaObjektu(formular, prvekTlacitka); CtlSetLabel(tlacitko, text); } nebo CtlSetLabel((ControlPtr)Objekt(prvekTlacitka), text); |
3.10. Pozice prvku formuláře na displeji
Umístění všech prvků formuláře na displeji můžeme zjistit voláním funkce FrmGetObjectPosition(). Tato funkce (a podobně i funkce pro změnu pozice prvku) používá souřadnice relativní k levému hornímu rohu formuláře.
void FrmGetObjectPosition(const FormType *formular, UInt16 objIndex, Coord *x, Coord *y) Zjistí pozici levého horního rohu daného prvku na displeji | |
Vstupní parametry |
|
Výstupní parametry |
|
Pro popis absolutních a relativních souřadnic se podívejte do oddílu 2.37. Protože formulář zabírá na displeji plochu aktivního okna, můžeme (pokud bychom potřebovali) použít pro převod na absolutní souřadnice funkci FrmWindowToDisplayPt().
void FrmSetObjectPosition(FormType *formular, UInt16 objIndex, Coord x, Coord y) Nastaví novou pozici prvku na displeji | |
Vstupní parametry |
|
Funkce FrmSetObjectPosition() neaktualizuje zobrazení na displeji. Tuto funkci můžeme použít před vykreslením formuláře na displeji. Jinak musíme prvek formuláře před voláním této funkce vymazat (například funkcí FrmHideObject() nebo například CtlEraseControl()) a po volání funkce znovu vykreslit (FrmShowObject() nebo například CtlDrawControl()).
V příštím pokračování si zopakujeme, co mají společného a jak jsou v souboru prostředků aplikace definována tlačítka, opakovací tlačítka, políčka k zaškrtnutí, přepínače a tlačítko volby textu.