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

Dnes si dokončíme popis několika funkcí, které použijeme při zpracování příkazů na kartě Editace.

4.27 Aktivní objekt formuláře a určení typu objektu

V každém formuláři může být jeden objekt aktivní. Aktivní objekt je ten, který právě zpracovává znaky zadávané uživatelem na plošce Graffiti (nebo pomocí klávesnice). V současné verzi operačního systému PalmOS mohou být aktivní objekty pouze políčka; v budoucích verzích může být typů aktivních objektů víc.

Je-li políčko aktivní, je na něm zobrazen blikající kursor. Kursor označuje místo, kam bude zapsán další znak, který zadáme pomocí Graffiti nebo klávesnice. Po zobrazení formuláře funkcí FrmDrawForm() nemusí být aktivní žádné políčko; kursor není vidět a znaky zadávané Graffiti nebo klávesnicí jsou ignorovány.

UInt16 FrmGetFocus(const FormType *formulář)

Zjistí, na kterém políčku se nachází kursor.

Vstupní parametry
  • formulář - ukazatel na strukturu obsahující data formuláře
Vrácená hodnota
  • noFocus - pokud ve formuláři není žádný aktivní objekt
  • index prvku formuláře, který je aktivní

Funkce FrmGetFocus() vrátí index prvku formuláře, na kterém se nachází kursor. Jednoznačnou identifikaci prvku formuláře získáme pomocí funkce FrmGetObjectId(). Pokud není žádný prvek formuláře aktivní, vrátí funkce FrmGetFocus() hodnotu noFocus.

void FrmSetFocus(FormType *formulář, UInt16 index)

Nastaví aktivní objekt (políčko) ve formuláři.

Vstupní parametry
  • formulář - ukazatel na strukturu obsahující data formuláře
  • index - index prvku formuláře, který si přejeme aktivovat, nebo konstanta noFocus, pokud si přejeme kursor skrýt

Jediné prvky formuláře, které můžeme funkcí FrmSetFocus() zatím aktivovat, jsou políčka. Políčka, na kterých může být kursor, mohou být buď samostatnou součástí formuláře, nebo mohou být uspořádána v tabulce. Pro příklad tabulky, která obsahuje políčka, se podívejte například do vestavěné aplikace ToDo; programování tabulek bude popsáno až v šesté kapitole.

Je-li aktivní prvek formuláře políčko, které je součástí tabulky, vrátí funkce FrmGetFocus() index tabulky, nikoliv index políčka. Tabulky budeme probírat v šesté kapitole; teď si jenom řekneme, že abychom zjistili, na kterém řádku tabulky je aktivní políčko, musíme použít speciální funkce manažera tabulek PalmOS.

Pro odlišení aktivního samostatného políčka od aktivního políčka v tabulce musíme použít funkci FrmGetObjectType(). Funkce FrmGetObjectType() určí typ prvku formuláře, jehož index jí předáme. Pokud chceme tedy použít funkci FrmGetFocus() k určení prvku formuláře, na kterém je kursor, musíme ověřit, že index aktivního prvku formuláře odpovídá políčku.

FormObjectKind FrmGetObjectType(const FormType *formulář, UInt16 index)

Určí typ objektu formmuláře (políčko, tlačítko a podobně).

Vstupní parametry
  • formulář - ukazatel na strukturu obsahující data formuláře
  • index - index prvku formuláře, jehož typ zjišťujeme
Vrácená hodnota

Označuje typ objektu. Některé hodnoty jsou

  • frmFieldObj - políčko pro úpravu textu
  • frmControlObj - tlačítko nebo přepínač
  • frmListObj - seznam
  • frmTableObj - tabulka
  • frmBitmapObj - obrázek
  • frmLabelObj - text
  • frmTitleObj - nadpis formuláře
  • frmPopupObj - tlačítko výběru ze seznamu
  • frmGraffitiStateObj - ukazatel stavu graffiti
  • frmGadgetObj - uživatelem definovaný objekt
  • frmScrollbarObj - posuvník

Chceme-li zjistit, zda je některé z políček formuláře aktivní, musíme nejprve získat index aktivního prvku formuláře. Poté musíme ověřit, zda se jedná o políčko, nebo o tabulku. V příštích verzích PalmOS mohou být i jiné druhy aktivních prvků. Proto doporučuji napsat jednoduchou obalující funkci jako v následujícím rámečku:

static FieldPtr ZjistiEditovanePole()
{
	FormPtr formular = FrmGetActiveForm();
	UInt16 zaostreni = FrmGetFocus(formular);
	FormObjectKind typObjektu;

	if(zaostreni == noFocus)
	{
		return NULL;
	}

	typObjektu = FrmGetObjectType(formular, zaostreni);

	if(typObjektu == frmFieldObj)
	{
		return FrmGetObjectPtr(formular, zaostreni);
	}
	else
	{
		return NULL;
	}
}

Funkce ZjistiEditovanePole() vrátí ukazatel na data aktivního políčka, nebo NULL, pokud není žádné políčko aktivní. V příští kapitole doplníme tuto funkci o práci s políčky v tabulkách.


Příště si doplníme funkce pro zobrazení klávesnice a nápovědy ke Graffiti a vytvoříme funkci pro obsluhu událostí uživatelské nabídky.