Menu
Menu definujeme bezprostředně před jeho zobrazením na displeji. Podobně jako při definici dialogu začíná definice menu příkazem mINIT (bez parametrů), po které následuje vlastní definice uživatelské nabídky (příkazy mCARD a mPOPUP). Po této definici vyvoláme příkaz MENU, který nabídku zobrazí a nechá uživatele vybrat. Poté vrátí příkaz MENU hodnotu odpovídající vybrané položce nebo nulu, pokud uživatel ukončil zobrazení menu klávesou Esc.
Ošetření klávesy Menu v našem programu je zcela v režii programátora. Aplikace používající uživatelskou nabídku by měla při stisknutí klávesy Menu (funkce GET vrátí kód klávesy KGetMenu%) inicializovat menu, vytvořit jednotlivé karty a zobrazit jej.
mCARD jmeno$, text_1$, klavesa_1%, text_2$, klavesa_2%, ...
Příkazem mCARD definujeme jednu kartu uživatelské nabídky. Prvním parametrem příkazu je jméno karty, které je zobrazeno v liště nahoře, a po něm následují dvojice parametrů: text položky menu a numerická hodnota obsahující klávesovou zkratku k rychlému vyvolání položky menu a další vlastnosti. Počet těchto dvojic parametrů je omezen jedině velikostí displeje.
INCLUDE "Const.oph" PROC menu: LOCAL k%, m% PRINT "Stiskni Menu pro nabídku Esc pro konec" WHILE 1 k%=GET IF k%=KKeyEsc% STOP ELSEIF k%=KGetMenu% mINIT mCARD "Soubor", "Nový", %n, "Otevřít", %o, "Konec", %e mCARD "Možnosti", "O programu", %O m%=MENU PRINT "Volba z menu byla "; m%; " (";CHR$(m%); ")" IF m%=%e : STOP : ENDIF ENDIF ENDWH ENDP
Jak vidíme na uvedeném příkladu, numerická hodnota může být s výhodou uváděna jako znaková konstanta (uvozená znakem procento). Malá písmena uvozují klávesové zkratky tvaru Ctrl+písmeno, kapitálky slouží pro klávesové zkratky Ctrl+Shift+písmeno. Nechceme-li uvádět klávesovou zkratku, musíme u položky nabídky uvést číslo mezi 1 a 32.
Volání MENU pak vrátí písmeno nebo číslo spojené s položkou nabídky - pozor na rozlišení malých a velkých písmen - nebo hodnotu 0 (pokud uživatel ukončil zobrazení nabídky klávesou Esc). Asi nás nepřekvapí, že můžeme chování položek menu v širokém rozsahu modifikovat konstantami, které přičteme k hodnotě klávesové zkratky.
Je-li klávesová zkratka záporná (například -%a), bude od následující položky oddělena tenkou čarou; přičteme-li ke konstantě hodnotu $1000 (KMenuDimmed%) ,tak nebude tuto položku možné zvolit.
Zaškrtávací položky menu
U položky menu může být uveden symbol zaškrtnutí. V takovém případě uživatel očekává, že je možné stav položky měnit. Přičteme-li ke konstantě pro klávesovou zkratku hodnotu $0800 (KMenuCheckBox%), tak se položka menu bude chovat jako nezaškrtnutá a když ji uživatel zvolí, tak se vedle ní na krátkou dobu zobrazí symbol zaškrtnutí. Pokud k této konstantě ještě přičteme hodnotu $2000 (KMenuSymbolOn%), bude položka na počátku zaškrtnutá a uživatel zvolením zaškrtnutí zruší.
Stav přepínačů si náš program musí pamatovat zvlášť: při definici menu jej vhodně nastavit a podle hodnoty, kterou vrací příkaz MENU, jej měnit. Příklad možného ošetření zaškrtávacích položek je v následujícím rámečku. V globálních proměnných jsou uvedeny proměnné, které obsahují uživatelem zvolené nastavení.
INCLUDE "Const.oph" PROC menu: GLOBAL stav_velke%, stav_male% LOCAL k%, m%, k_v%, k_m% PRINT "Stiskni Menu pro nabídku Esc pro konec" WHILE 1 k%=GET IF k%=KKeyEsc% STOP ELSEIF k%=KGetMenu% IF stav_velke% : k_v%=$2000 : ELSE : k_v%=0 : ENDIF IF stav_male% : k_m%=$2000 : ELSE : k_v%=0 : ENDIF mINIT mCARD "Soubor", "Nový", %n, "Otevřít", %o, "Konec", %e mCARD "Možnosti", "Nastavení", -%N, "Velké", %v+$0800+k_v%, "Malé", %m+$0800+k_m% mCARD "Nápověda", "O programu", -%O m%=MENU PRINT "Volba z menu byla "; m%; " (";CHR$(m%); ")" IF m%=%v stav_velke%=NOT stav_velke% ELSEIF m%=%m stav_male%=NOT stav_male% ENDIF IF m%=%e : STOP : ENDIF ENDIF ENDWH ENDP