15.3. Grafické uživatelske rozhraní

15.3.1. Konstra programu zpracování události
15.3.2. Výběr události
15.3.3. Jak zjistit který prvek událost vyvolal
15.3.4. Label

Abstrakt

Popis obsluhy událostí. Volně podle „Quartus Forth Manual“, Sleepless Night Wiki a dalších zdrojů.

Odkazy

Smyčka obsluhy událostí (Event Loop).  je částí programu která vybírá (přijímá) události od PalmOs, a dále je zpracovává. Všechny programy musí mít tuto smyčku, aby jste se mohli přepnout do jiné aplikace. Nepotřebujete-li obsluhovat žádné události, můžete použít jednoduchou „prázdnou“ smyčku.

Příklad 15.2. Prázdná smyčka obsluhy událostí

: default-event-loop ( -- )
  begin
    ekey drop
  again ;
	  

Varování

Aby se program choval standardně, musí mít obsluhu událostí, jinak by nešel ani ukončit.

Příklad 15.3. Prázdná smyčka obsluhy událostí

: default-event-loop ( -- )
  begin
    ekey drop
  again ;
      

Slovo ekey čeká na událost až 500ms. Chceme-li rychlejší smyčku můžeme použít slovo (ekey).

Příklad 15.4. Rychlejší *FIXME:smyčka/cyklus obsuhy událostí

: faster-event-loop ( -- )
    begin
        10. (ekey)      ( → ekey) \ wait max of 100ms
        do-my-thing     ( ekey → ekey )
        drop            ( ekey → )
    again ;
      

Úsporná smyčka s „nekonečným“ čekáním. 

: event-loop ( -- )
  begin
    -1. (ekey)
\   dispatch-event
    drop
  again ;
	

Hodnota -1. slova (ekey) přepne procesor do „doze mode“. Z hlediska našeho programu tento nedostane řízení, dokud nenastane nějaká událost. Rovněž není nikdy vrácena událost nilEvent.

V programu psaném v QuartusForth se nemusíte zajímat o obsluhu většiny událostí, Forth to udělá za vás, kdykoliv použijete KEY nebo EKEY. Automaticky jsou obsluhovány události

Události které nebyli obslouženy automaticky jsou vráceny na zásobník, kde je můžeme přečíst a obsloužit.

Základ obsluhy událostí vypadá takto

begin ekey drop again

Takováto obsluha ignoruje všechny události. Ve skutečnosti nejsou všechny události ignorovány ale řada z nich je obsloužena standardně.

Příklad 15.5. Ukázka kódu který reaguje na dotek pera

\ eh
needs events
: go ( -- )
  begin ekey
    dup penDownEvent = if
      ." Pen Down detected" cr
    else dup penUpEvent = if
      ." Pen Up detected" cr
      then
    then  drop
  again ;
      

Zajímavé je, jakým způsobem je ošetřena událost appStopEvent. Quartus Forth vám dává plnou kontrolu nad tím co se bude dít při ukončení programu. Když Quartus Forth obdrží appStopEvent, vygeneruje výjimku -257 THROW. Za normálních (běžných) okolností je tato výjimka ošetřena standardní obsluhou výjimek a program jednoduše skončí voláním příkazu (bye). Nicméně můžete tuto vájimku odchytit a zařídit si třeba úklid použitých prostředků před voláním (bye)

Příklad 15.6. Ukázka obsluhy

-257 constant byeThrow
: go ( -- )
  MainForm
  ." Go ahead, start another app." cr
  begin
    ['] key catch
    byeThrow = if
      ." Exiting in 5 seconds!"
      500. SysTaskDelay
      (bye)
    then  drop
  again ;
      

Tabulka 15.1. Seznam událostí (returned by EKEY) [1:3:7]

čísloudálostpopis
0nilEventžádná událost, nenastala žádná událost
1penDownEvent 
2penUpEvent 
3penMoveEvent 
4keyDownEvent 
5winEnterEvent 
6winExitEvent 
7ctlEnterEvent 
8ctlExitEvent 
9ctlSelectEvent 
10ctlRepeatEvent 
11lstEnterEventtato událost v QF nenastane
12lstSelectEvent 
13lstExitEvent 
14popSelectEvent 
15fldEnterEvent 
16fldHeightChangedEvent 
17fldChangedEvent 
18tblEnterEvent 
19tblSelectEvent 
20daySelectEvent 
21menuEvent 
22appStopEvent 
23frmLoadEvent 
24frmOpenEvent 
25frmGotoEvent 
26frmUpdateEvent 
27frmSaveEvent 
28frmCloseEvent 
29frmTitleEnterEvent 
30frmTitleSelectEvent 
31tblExitEvent 
32sclEnterEventtato událost v QF nenastane
33sclExitEvent 
34sclRepeatEventtato událost v QF nenastane
32767firstUserEvent