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

Dnes 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.

4.28 Zobrazení klávesnice a nápovědy ke Graffiti

Popsali jsme si funkce, které použijeme při obsluze schránky v menu na kartě Editace. Obvykle bývají tyto příkazy pro práci se schránkou na kartě Editace oddělené od dvou dalších příkazů: zobrazení klávesnice a nápověda ke Graffiti.

void SysGraffitiReferenceDialog(ReferenceType typ)

Zobrazí nápovědu ke Graffiti.

Vstupní parametry
  • typ - jaká nápověda bude zobrazena. Tento parametr musí mít hodnotu referenceDefault.

Funkce SysGraffitiReferenceDialog() zobrazí na displeji nápovědu ke Graffiti. Nemůžeme však zvolit, která stránka nápovědy bude zobrazena. Jediná možná hodnota parametru, kterým funkci předáváme, je referenceDefault: zobrazení první stránky nápovědy ke Graffiti.

void SysKeyboardDialog(KeyboardType typ)

Zobrazí na displeji klávesnici pro editaci textu v políčku.

Vstupní parametry
  • typ - jaká klávesnice bude zobrazena:
    • kbdAlpha - klávesníce QWERTY
    • kbdNumbersAndPunc - číselná klávesnice
    • kbdAccent - klávesnice s národními znaky
    • kbdDefault - standardní klávesnice (s číslicemi pro políčka, ve kterých musíme zadat číslo, jinak s písmenky)

Zavoláme-li funkci SysKeyboardDialog(), zobrazí se na displeji formulář klávesnice. Ve spodní části formuláře jsou uspořádána tlačítka odpovídající jednotlivým znakům, nad nimi je políčko, do kterého znaky vpisujeme. Do políčka je zkopírován obsah aktivního políčka. Při opuštění formuláře klávesnice je text políčka zkopírován zpět do původního formuláře.

4.29 Funkce pro obsluhu příkazů na kartě Editace

Teď už umíme napsat funkci, která obsluhuje všechny příkazy na kartě Editace. Pokud je v našem programu více než jeden formulář, na kterém jsou políčka, je výhodné použít stejné identifikátory příkazů menu pro stejné akce (například PolozkaMenuKopiruj pro příkazy "Kopíruj"). Příklad je zvýrazněn v rámečku:

MENU ID MenuVstupniho
BEGIN
  PULLDOWN "Program"
  BEGIN
    MENUITEM "O Programu" ID PolozkaMenuOProgramu "O"
  END
  PULLDOWN "Editace"
  BEGIN
    MENUITEM "Zpet" ID PolozkaMenuZpet "U"
    MENUITEM "Vyrizni" ID PolozkaMenuVyrizni "X"
    MENUITEM "Kopiruj" ID PolozkaMenuKopiruj "C"
    MENUITEM "Vloz" ID PolozkaMenuVloz "P"
    MENUITEM "Vyber vse" ID PolozkaMenuVyberVse "S"
    MENUITEM SEPARATOR
    MENUITEM "Klavesnice" ID PolozkaMenuKlavesnice "K"
    MENUITEM "Graffiti" ID PolozkaMenuGraffiti "G"
  END
END

MENU ID MenuVystupniho
BEGIN
  PULLDOWN "Program"
  BEGIN
    MENUITEM "O Programu" ID PolozkaMenuOProgramu "O"
  END
  PULLDOWN "Editace"
  BEGIN
    MENUITEM "Kopiruj" ID PolozkaMenuKopiruj "C"
    MENUITEM "Vyber vse" ID PolozkaMenuVyberVse "S"
  END
END

Pokud jsou takto v každém menu naší aplikace definovány stejné identifikátory pro stejné příkazy, můžeme seskupit obsluhu těchto příkazů do jedné funkce. Ve funkci, která bude obsluhovat příkazy menu na kartě editace musíme:

  • Pro příkazy pracující se schránkou (Zpět, Kopíruj, Vyřízni, Vlož) zavoláme příslušnou systémovou funkci (například FldUndo() a podobně), které předáme ukazatel na data aktivního políčka.
  • Pro příkaz Vyber vše zavoláme funkci FldSetSelection() tak, aby označila všechen text v políčku.
  • Zobrazení klávesnice zajistíme funkcí SysKeyboardDialog(kbdDefault).
  • Abychom zobrazili nápovědu ke Graffiti zavoláme funkci SysGraffitiReferenceDialog(referenceDefault).
Boolean FunkceMenuKartyEditace(UInt16 prvekMenu)
{
	FieldPtr policko;

	switch(prvekMenu)
	{
		case PolozkaMenuZpet:
		case PolozkaMenuKopiruj:
		case PolozkaMenuVyrizni:
		case PolozkaMenuVloz:
		case PolozkaMenuVyberVse:

			policko = ZjistiEditovanePole();
			
			if (!policko)
			{
				return false;
			}

			if(prvekMenu == PolozkaMenuZpet)
			{
				FldUndo(policko);
			}
			else if(prvekMenu == PolozkaMenuVyrizni)
			{
				FldCut(policko);
			}
			else if(prvekMenu == PolozkaMenuKopiruj)
			{
				FldCopy(policko);
			}
			else if(prvekMenu == PolozkaMenuVloz)
			{
				FldPaste(policko);
			}
			else if(prvekMenu == PolozkaMenuVyberVse)
			{
				FldSetSelection(policko, 0, FldGetTextLength(policko));
			}

			return true;

		case PolozkaMenuKlavesnice:
			SysKeyboardDialog(kbdDefault);
			return true;

		case PolozkaMenuGraffiti:
			SysGraffitiReferenceDialog(referenceDefault);
			return true;

		default:
			return false;
	}
}

Důležitou součástí naší funkce FunkceMenuKartyEditace() je zjištění, které políčko je aktivní. Pokud není aktivní žádné políčko (funkce ZjistiEditovanePole(), kterou jsme si popisovali v minulém díle vrátí hodnotu NULL) tak logicky nejsou příkazy schránky podporovány.


Příště si do naší aplikace zařadíme kompletní obsluhu menu a drobným domácím úkolem ukončíme čtvrtou kapitolu.