第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「7.ちょっと忘れもの。イベントチェックのお話」

6−7 ちょっと忘れもの。イベントチェックのお話

前回、イベントに関する項目で、少々忘れ物をしたようですので、ここに追加しておきます。

フォームに記述する特別なイベント類、ボタン類や画面のタップなどから発生するイベントは、基本的に Sub〜End Subで終わってしまう単発の処理でした。
そもそも、イベントが発生したら、処理を行う、というイベントドリブン型の宿命ですが、その一方で、処理を終了せずに、処理を続けていたい場合があります。
これはハンドブックにも載っている単純な例ですが「時計」などはその良い例です。

単に連続して処理を続けたかったら「Do 〜 Loop」を使って繰り返していれば良いのですが、ご承知の通り、これだけではリセットするか電池が切れるまで終わらない危険なアプリになりますね。そこで、NS Basicでは「いま、イベントが起きましたよ」と通知してくれるSysEventAvailable()という関数を使います。

SysEventAvailable()は、前回登場したSetEventHandledに似ていますが、今回のは関数ですので、戻り値があります。SetEventHandledはコマンドですね。
(ま、どっちも長ったらしい言葉なので、NS Basic中級者でもハンドブックを見ながら入力する場合が多いようです。)
さて、SyeEventAvailable()は、単純明快な関数です。その戻り値が 1の時、「イベントが起きています」というお知らせで、無い時は 0です。

では、早速順番に見ていきましょう。
まず、終わらないループですが、次の場合はどうでしょうか?
  [After]
  
      Do
            Beep
        Loop
FormのAfterにこんな処理をいれたら、Afterはいつまでも終わらず、延々とBeep音が鳴りつづけるプログラムになってしまいますね。
当然、ループ中はイベント処理を行いませんから、こういう場合にSyeEventAvailable()を使うわけです。
  [After]
  
      Do until SysEventAvailable()=1
            Beep
        Loop
という条件にすれば、何らかのイベントが発生した時点でループを抜けることが出来ます。
したがって、SysEventAvailable()の機能を正確に表現するならば「イベントが起きています」というより「未処理のイベントがあります」という関数になります。

さて、一度、このルーチンから抜けてしまったら、イベントを処理してプログラムは見かけ上停止状態になります。
「時計」のように更に連続してAfterに戻らないといけませんが、そこで活躍するのが、何度か登場している Redrawコマンドです。
  [After]
  
        Do until SysEventAvailable()=1
            Beep
        Loop

  [events]
    
        If GetEventType()=NebKeyOrButton Then
            If GetKey()=&H11 Then
             Stop
            End If
        End if
    
        SysEventHandled
        Redraw

こうすれば、ズーッとBeep音が鳴っているアプリでも「ホーム」をタップするとちゃんとランチャーに戻ることが出来ます。
(ソフトキーのホームのキーコードは17(11H)でしたね。)
それ以外のイベントの場合、SysEventHandledでOSからの処理を無視させて、Redrawをすることで、再びAfterに戻っていきます。

ちょっとおさらい、ということで単純な時計プログラムを掲載しておきます。
NS Basicには、時刻を"00:00"という形でそのまま返すような関数がありませんが、それほど難しいコマンド類はありませんので特に解説は要らないと思います。
と言ういうことで、次回のネタに合わせて、急遽、イベントの補足をお送りしました。


Sub Form1004_after()

    Do Until SysEventAvailable()=1 
        Lbl1005.Label=Format(Hour(Now()),"00")+":"+Format(Minute(Now()),"00")+":"+Format(Second(Now()),"00")
    Loop

End Sub

Sub Form1004_events()


    If GetEventType()=nsbKeyOrButton Then
        If GetKey()=&h11 Then
            Stop
        End If
    End If
    
    SetEventHandled 
    Redraw
    
End Sub


前へ     目次へ

第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「7.ちょっと忘れもの。イベントチェックのお話」