第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「4.ボタンを使う その1」

6−4 ボタンを使う その1

さて、ペンを使った画面タップの次は、ボタンによるイベントですね。
で、実は、これは、既に、NS Basicについての第6回で紹介してありますので、内容的には重複してしまいます。
ただ、Ver.1.09から、メニューボタンの「06」が「17」に変更となりましたし、初心者向けの講座ですから、ここで改めて説明します。

Palmデバイスのボタンには、本体にくっついている「ハードキー」と、Graffitiエリアに印刷されている「ソフトキー」の2種類がありますが、NS Basic上ではどちらも1種類のイベントとして認識します。ここでは、それらを総称して「ボタン類」と言う事にします。
さて、チェックの方法は、タップイベントと同じように、GetEventType()を使い、それが「NsbKeyorButton」であれば、ボタン類が押されたことになります。
    If GetEventType()=NsbKeyorButton Then
        (処理)
    End if
そして、どのボタンが押されたのか、という状態を返すのが「GetKey()」関数です。
GetKey()関数は、最後に押されたボタン類の文字もしくは文字コードを返し、Graffitiエリアなどに文字を入力した場合その文字を、ボタン類を押した時はそのボタンのコードを返します。
例えば、
    Dim strX as String

    If GetEventType()=NsbKeyorButton Then
        strX=GetKey()
        (処理)
    End if
のようにキーを取得します。
さて、文字を返す場合、文字変数を用意してそこに代入すれば良いのですが、ボタンの場合は「これ」という文字がありませんので、コードを取得しなければいけませんね。
なので、数値変数を用意して、次のようにします。
    Dim intX as Integer

    If GetEventType()=NsbKeyorButton Then
        intX=Asc(GetKey())
        (処理)
    End if
Asc(X)は、文字Xの文字コードを返す関数で、これを使えば文字コードおよびボタンコードを取得することができます。
ボタン類の文字コードは次のようになっています。

    

上段の数字が文字のコード、下段のカッコ内の数字は16進数表記です。

ところで、機種によっては、この図とはGraffitiエリアの印刷が違っていますね。
例えば、PalmOSの日本語版が載っているデバイスでは「変換」「確定」といった漢字変換の機能が印刷されているはずです。
しかし、NS Basicでは、基本的に「変換」「確定」といったキーを区別することができません。残念ながら。

さて、16進数という言葉をひっぱり出してきましたので、ここで、ちょっと説明しておきます。
通常、数は0〜9の10種類の記号を使って数えますね。これが、10進数です。0,1,2,3,・・・,8,9と10種類の記号を使って順に数え、記号を使い切ってしまったら、桁を上げて、10,11,12,・・・と続けます。 一方、16進数は、比較的多くコンピュータで使われる数で、先ほどの定義でいけば、16種類の記号を使う数の数え方です。
0,1,2,3,・・・,8,9,A,B,C,D,E,F,10,11,12,・・・と言うように、A〜Fの6つの記号を追加して16種類の記号としています。

    10進数 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,・・・
16進数 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F,10,11,・・・

これらは、コンピュータ的に便利な数字なのですが、通常の生活では使うことはないでしょう。そもその、いくつなのか感覚的に分かりませんし、そのようなものが混在していたら「10」と書かれていた場合に、何進数か分からないので困ってしまいます。
そこで、16進数の場合、通常「&H10」もしくは「10H」というように「&H」もしくは「H」を付けて表現します。

NS Basic上でも16進数を取り扱うことができ、&Hを付けて表現しますが、ここで詳しく説明したのは訳があります。
16進数といっても、単純に数の数え方なので、10Hとあったら、10進数で16のことだなぁ、とか、12は16進数で0CHだなぁ、となり、これらは基本的に数値であるはずなのですが、 NS Basic上では多少動作が異なります。
NS Basicの正規ハンドブックのサンプルでは、
    Dim theKey as String
    If GetEventType()=NsbKeyorButton Then
        theKey = GetKey()
        If theKey=&H5 Then
         ・・・(以下略)
というように、文字変数theKey と 数値であるはずの &H5と比較されています。
実は、NS Basicでは、数値の先頭に&Hをつけた16進数を「文字」として取り扱う、という特殊な仕様になっているようです。
単純な例ですが、
    If 5=&H5 Then
は条件として成立するように見えますが、数値と文字を比較しているよ!とエラー警告が出ます。
ちょっと、おかしな話ですね。&H5は、10進数で「5」を表す数字であるのに、「文字」として認識しています。
しかし、このNS Basicの特殊な仕様のおかげで、GetKey()による文字取得が楽にできます。
例えば、
    Dim strX as String

    If GetEventType()=NsbKeyorButton Then
        strX=GetKey()
        Select Case strKey
            Case &H1
                (処理)
            Case &H2
                (処理)
            Case "A"
                (処理)
            Case "B"
                (処理)
        End Select
    End if
というような、一見間違いのようなコードが通りますので、プログラム的にとてもスッキリします。
ここは、ちょっと特殊ですが、NS Basicで&Hがついた数値は「文字」であると覚えておきましょう。



前へ     目次へ     次へ

第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「4.ボタンを使う その1」