Premium

Získejte všechny články
jen za 89 Kč/měsíc

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

Dnes se již dostaneme k popisu uživatelského rozhraní. Povíme si, jak jsou organizovány prvky formuláře a společné funkce pro manipulaci s prvky formuláře.

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
PopisJednoznačná
identifikace
0Nadpis - TITLEnemá
1Text - LABEL AUTOID 9000
(přiřazeno automaticky)
2Tlačítko 1 - BUTTON ID Tlacitko1 ... Tlacitko1
3Tlačí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
  • formular - ukazatel na strukturu inicializovaného formuláře
  • objIndex - pořadové číslo prvku ve formuláři
Vrácená hodnota
  • frmInvalidObjectId - pokud takový prvek neexistuje
  • jinak vrací jednoznačnou identifikaci prvku

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
  • formular - ukazatel na strukturu inicializovaného formuláře
  • objID - jednoznačná identifikace prvku
Vrácená hodnota
  • pořadové číslo prvku (pořadová čísla začínají od nuly)

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
  • formular - ukazatel na strukturu inicializovaného formuláře
  • objIndex - pořadové číslo prvku ve formuláři
Vrácená hodnota
  • NULL - pokud daný prvek neexistuje
  • ukazatel na strukturu obsahující data prvku

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
  • formular - ukazatel na strukturu inicializovaného formuláře
  • objIndex - pořadové číslo prvku ve formuláři
Výstupní parametry
  • x - relativní souřadnice x levého horního rohu prvku
  • y - relativní souřadnice y levého horního rohu prvku

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
  • formular - ukazatel na strukturu inicializovaného formuláře
  • objIndex - pořadové číslo prvku ve formuláři
  • x - relativní souřadnice x levého horního rohu prvku
  • y - relativní souřadnice y levého horního rohu prvku

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.

  • Nejčtenější

Spotem s Trojanem na horách operátor popudil Poláky. Nerozuměli nadsázce

21. dubna 2024  8:01

Po dvojici Vojtěch Kotek a Lukáš Pavlásek, k níž později přibyl Jakub Kohák, vsadil T-Mobile ve...

Je to už spíš foťák s mobilem a opravdu se povedl. Test Xiaomi 14 Ultra

21. dubna 2024

Prémiový smartphone Xiaomi 14 Ultra působí mezi současnou nabídkou mobilů jako unikát. Jaký jiný...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Toto zařízení mělo nahradit mobily. V recenzích se mu vysmáli

23. dubna 2024

Novinka s názvem Humane AI Pin se zdála být převratným zařízením. V mnoha ohledech měla nahradit...

Operátoři zahušťují pokrytí Česka signálem 5G. Máte ho doma? Podívejte se

20. dubna 2024

Premium V červenci to budou již čtyři roky, co byla v Česku spuštěna první komerční 5G síť. Zatímco v...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Pošlete sportovní fotku a vyhrajte smartphone nebo dres Patrika Schicka

8. dubna 2024,  aktualizováno  18.4 13:04

Zachyťte na fotografii sportovní moment a vyhrajte úplnou novinku, smartphone vivo V40 SE s bohatou...

Vodafone měl výpadek, někteří zákazníci se nemohli dovolat

25. dubna 2024  10:03,  aktualizováno  10:15

Síť mobilního operátora Vodafone postihl ráno výpadek. Týkal se části zákazníků, kteří se nemohli...

Toto mohl být nevídaný smartphone. Myšlenku však nakonec poslali k vodě

25. dubna 2024

S takovým smartphonem bychom už nikdy nemuseli řešit, že se zpomaluje, nemá dostatek paměti či je...

Samsung má povedenou stylovku. Zkusí to s ní na trhu, kde se mu nedaří

24. dubna 2024

Samsung po velmi dlouhé době oprášil modelovou řadu Galaxy C a představil stylový smartphone se...

Toto zařízení mělo nahradit mobily. V recenzích se mu vysmáli

23. dubna 2024

Novinka s názvem Humane AI Pin se zdála být převratným zařízením. V mnoha ohledech měla nahradit...

Slož puzzle a vyhraj jedinečné dárky od značky BEBELO
Slož puzzle a vyhraj jedinečné dárky od značky BEBELO

Každý den po celý tento týden můžete vyhrávat jedinečné dárky od značky BEBELO.

Manželé Babišovi se rozcházejí, přejí si zachovat rodinnou harmonii

Podnikatel, předseda ANO a bývalý premiér Andrej Babiš (69) s manželkou Monikou (49) v pátek oznámili, že se...

Bývalý fitness trenér Kavalír zrušil asistovanou sebevraždu, manželka je těhotná

Bývalý fitness trenér Jan Kavalír (33) trpí osmým rokem amyotrofickou laterální sklerózou. 19. dubna tohoto roku měl ve...

Herečka Hunter Schaferová potvrdila románek se španělskou zpěvačkou

Americká herečka Hunter Schaferová potvrdila domněnky mnoha jejích fanoušků. A to sice, že před pěti lety opravdu...

Největší mýty o zubní hygieně, kvůli kterým si můžete zničit chrup

Možná si myslíte, že se v péči o zuby orientujete dost dobře, přesto v této oblasti stále ještě existuje spousta...

Tenistka Markéta Vondroušová se po necelých dvou letech manželství rozvádí

Sedmá hráčka světa a aktuální vítězka nejprestižnějšího turnaje světa Wimbledonu, tenistka Markéta Vondroušová (24), se...