HyperCard tribute

ぽけべら〜


 公衆電話に向かい恐ろしいスピードでダイヤルボタンを押している人を良く見かけます。もちろん、ポケットベルなんですが、瞬時の内に字数を数えちゃんと12文字以内に納め、数字データに変換しているのには驚きます。ポケットベルを使い込んでいけば、いずれあのように打てるようになるのでしょうが、慣れるまでは変換に時間がかかりメッセージも単純なものになりがちです。
 そこで、メッセージを数字データに変換するスタックを作ってみました。


ポケベルデータ変換「ぽけべらー」
 ダウンロード(40KB)

 メッセージ入力機能はもちろんのこと、最近のポケットベルについているような自動ダイアル機能、アドレス機能もついています。HyperCardにはダイヤル音が最初から用意されていますので、ダイヤル音については問題ありませんし、アドレス機能は前回のアドレス帳から流用すればいいですので、問題は数字データへの変換システムのみということになります。

使用方法:
1.文字入力ボタンやフィールドへの直接入力を用いてメッセージを打ち込む
2.電話を掛ける相手を選択する
3.受話器をMacのスピーカーに近づけ「お電話します」のボタンを押す

 それでは、スタックのスクリプトから説明を始めます。以下のスクリプトは全てスタックに書き込んでいます。



openStackのスクリプト
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
on openStack
  global starttime
  lock screen
  go to cd "main"
  create menu "設定"
  put "内線,変換表の変更" into menuItem
  put "naisen,henkan" into m_msg
  put menuItem into menu "設定" with menuMsg m_msg
  if cd fld "naisen_data"=1 then
    set the checkMark of menuItem "内線" of menu "設定" to true
  end if
  put the ticks into starttime
  unlock screen with dissolve
end openStack
 openStackではカスタムメニューの作成と、使用時間の時間計測を始めています。
 HyperCardを開いた時は、カードid1を画面に表示します。これを利用しカードid1には「Wait a minute.」などといったメッセージを書き込んでおきましょう。起動待ちの時間を少しでも気にさせないための演出です。
 5〜8行目でメニューを作成しています。メニューの作成については「小技編」の「カスタムメニューを作成」を読んで下さい。

  • set the checkMark of menuItem "内線" of menu "設定" to true
     9〜11行目では内線設定をしています。フィールド「naisen_data」の値が1であれば、メニュー「設定」の「内線」にチェックマークを付けます。
    「menu "設定"(メニュー「設定」)」
      の
    「menuItem "内線"(メニュー項目「内線」)」
      の
    「the checkMark(チェックマーク)」
      を
    「true(論理値を真)」
      に
    「set 〜 to 〜 (設定する)」



    naisenのスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    
    on naisen
      if the checkMark of menuItem "内線" of menu "設定" is false then
        set the checkMark of menuItem "内線" of menu "設定" to true
        put 1 into cd fld "naisen_data"
      else
        set the checkMark of menuItem "内線" of menu "設定" to false
        put 0 into cd fld "naisen_data"
      end if
    end naisen
    
     naisenハンドラは、メニュー「設定」の「内線」を選んだときに実行されます。「内線」にチェックマークがなければ、チェックマークをつけてフィールド「naisen_data」に1を代入します。逆にチェックマークがあれば、チェックマークを外しフィールド「naisen_data」に0を代入します。



    closeStackのスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    
    on closeStack
      global starttime
      debug sound on
      domenu "Compact Stack"
      set the cursor to busy
      put trunc((the ticks-starttime)/3600*10) into b
      put last char of b into a
      put trunc(b/10) into b
      put "Thank you for playing!  使用時間:"&b&"分"&a*6+random(5)&"秒"
      domenu "Compact Stack"
    end closeStack
    
     サウンドの状態を通常にし、使用時間を表示し、スタック整理を行います。



    カード「main」

     カード「main」には、送信するメッセージを表示するためのフィールド、現在の字数を表示するフィールド、ひらがな・アルファベットを打ち込むための文字入力ボタン、アドレス機能を持つポップアップボタン、ダイヤルをするボタンで構成されています。
     文字入力ボタンを押すとそのボタンの名前が、メッセージ表示フィールド「ms」に追加されるようになっています。その後、ハンドラ「cur」を呼び出して現在のカーソルの位置へとカーソルを移動します。



    文字入力ボタンのスクリプト
     文字入力ボタンとはカード「main」に配置されている、ひらがな・アルファベットの事を意味しています。
     1 
     2 
     3 
     4 
    
    on type
      put the short name of target after cd fld "ms"
      cur
    end type
    
  • put the short name of target after cd fld "ms"
     2行目ではボタンの名前を取り出して、フィールド「ms」に追加代入しています。実際の、ひらがな・アルファベットボタンには type ハンドラを呼び出すスクリプトを書いて下さい。
     ここで使っている target 命令は、最初にメッセージを受け取ったオブジェクトを意味しています。typeハンドラは文字入力ボタンから呼び出されていますので、ここでいう target はクリックされたボタンのことを意味しています。
    「target(最初にメッセージを受け取ったオブジェクト)」
      の
    「the short name(短い名前)」
      を
    「cd fld "ms"(フィールド「ms」)」
      に
    「put 〜 after 〜 (追加代入する)」



    curのスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    
    
    
    10 
    11 
    12 
    13 
    14 
    
    on cur
      put " ̄" into cd fld "nn"
      put 0 into num
      repeat with i=1 to the number of chars of cd fld "ms"
        put " " before cd fld "nn"
        put 1+num into num
        put char i of cd fld "ms" into a
        if a is "が" then put 1+num into num
        else if a is "ぎ" then put 1+num into num
      ・・・・・・・・・
      ・・・・・・・・・
      ・・・・・・・・・
        else if a is "ぺ" then put 1+num into num
        else if a is "ぽ" then put 1+num into num
      end repeat
      put "現在 "&num&" 文字" into cd fld "messageNum"
    end cur
    
     文字が入力される度にこの「cur」ハンドラが実行されます。このハンドラでは、カーソルの移動と字数の計算を行っています。カーソル移動については「小技編」の「スクロール文字入力システム」で説明をしますのでそちらを見て下さい。
     次に字数計算の方ですが、こちらには一つの問題点があります。カーソルの移動についてはフィールドの字数分だけ移動させれば、そこがカーソルの位置ですから簡単なのですが、字数計算はそうはいかないのです。その問題点は、濁音がフィールド「ms」に入力された時に起こります。
     下の図を見て下さい。どちらのフィールドもポケットベルにメッセージとして送る場合の字数は同じ6文字なのですが、フィールド内の字数としては上の例が6文字、下の例が5文字となってしまいます。

     ポケットベルには濁音は用意されておらず、普通の音に「゛」「゜」を付けることで濁音を表示しています。つまり、文字入力ボタンを用いて「が」を入力する場合は「か」「゛」と入力されるため、ポケットベルの字数と同じ2文字と計算されるわけですが、直接フィールドに入力された時は1文字であると計算してしまうのです。そこで濁音が入力されたときの対処として余分に字数を増やす、すなわち「゛」「゜」の分を字数にプラスするようにしているのです。



    mainのスクリプト
     mainハンドラでは以下のことをやっています。
    ■アドレスボタンで選んだ人物のポケットベルデータを取り出す(3〜8行)
    ■「が」「ぱ」「ぁ(小さな、あ)」などの変更が必要な文字を変更する(10〜19行)
    ■接続されるまで待つ(27〜40行)
    ■フリーメッセージへの切り替えのダイヤル、メッセージのダイヤルを行う(42〜48行)
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    
    10 
    11 
    12 
    13 
    
    
    
    14 
    15 
    16 
    17 
    18 
    19 
    
    20 
    21 
    22 
    23 
    24 
    25 
    26 
    27 
    28 
    29 
    30 
    31 
    32 
    33 
    34 
    35 
    36 
    37 
    38 
    39 
    40 
    41 
    42 
    43 
    44 
    45 
    46 
    47 
    48 
    49 
    50 
    
    on main
      set the cursor to busy
      put word 2 of the selectedLine of cd btn "list" into num
      put line num of cd fld "data" into getData
      put item 2 of getData into number
      put number into cd fld "number"
      put item 3 of getData into freeMessage
      put item 4 of getData into cd fld "wait"
      put empty into result
      
      repeat with i=1 to the number of chars of cd fld "ms"
        put char i of cd fld "ms" into a
        if a is "が" then put cd btn "か"&cd btn "゛" after result
        else if a is "ぎ" then put cd btn "き"&cd btn "゛" after result
      ・・・・・・・・・
      ・・・・・・・・・
      ・・・・・・・・・
        else if a is "ぇ" then put cd btn "え" after result
        else if a is "ぉ" then put cd btn "お" after result
        else
          put cd btn a after result
        end if
      end repeat
      
      set the dialingVolume to 1
      if the checkMark of menuItem "内線" of menu "設定" is true then
        dial "0"
        wait 2 second
      end if
      dial number
      hide cd fld "隠し"
      if cd fld "wait" is empty then
        put the ticks into start
        put "入力待ちの状態になったらクリックして下さい"
        wait until the mouseclick is true
        put round((the ticks-start)/60) into cd fld "wait"
        put ","&cd fld "wait" after line num of cd fld "data"
        put "OK!"
      else
        put the ticks into start
        put cd fld "wait" into wait
        repeat until (wait-round((the ticks-start)/60))<0
          put wait-round((the ticks-start)/60) into cd fld "wait"
        end repeat
      end if
      show cd fld "隠し"
      dial freeMessage
      repeat with i=1 to the number of chars of result
        dial char i of result
        wait 3 ticks
      end repeat
      dial "#"
      dial "#"
      answer "受話器をおいて下さい"
    end main
    

    ■アドレスボタンで選んだ人物のポケットベルデータを取り出す(3〜8行)
     まず、アドレスボタンで選んだ行を選び出し、その行のデータ、つまりその人のデータをフィールド「data」から取り出して変数やフィールドに代入しています。
    num(選んだ行ナンバー)
    getData(総データ。名前のデータと以下の3つのデータを持っています)
    number(電話番号)
    freeMessage(フリーメッセージへの変更データ。*2*2など)
    cd fld "wait"(メッセージ入力状態までの待ち時間)

     getData(総データ)には、以下のデータが納められています。順に「名前」「電話番号」「フリーメッセージへの変更データ」「待ち時間」となっています。
    「井上毅彦,052-xxx-xxxx,*2*2,20」



    ■「が」「ぱ」「ぁ(小さな、あ)」などの変更が必要な文字を変更する(10〜19行)
     ポケットベルには「゛」「゜」を使用する文字は2つに分けてデータに変更します。例えば「ざ」は「さ」と「゛」に分けるといった具合です。それともう一つ、小さな音「ゃ」「ぁ」なども用意されていませんので通常の音に変更してからデータに変更します。

  • put cd btn a after result
     16行目では、入力された文字入力ボタンの情報を取り出しています。文字入力ボタンにはそれぞれ変換データを持たせてあり、それを変数resultに追加します。変換データはボタンに持たせていますが、ボタンの名前と変換データは違います(「あ」の変換データは「11」です)ので名前に変換データを持たせることはできません。では、どうやってボタンに変換データを持たせるのでしょうか。
     答えは簡単で、ボタンもコンテナを持っているからです。つまり、ボタンはコンテナの内容を表示させる場所がないだけなのです。これについては「小技編」の「ポップアップメニューの追加・削除」で説明しています。



    ■接続されるまで待つ(27〜40行)
     メッセージ入力状態になるまで待ちます。その人への初めてのメッセージ送信時は、メッセージ入力状態になるまでの待ち時間がわかりませんので、ユーザーに入力してもらうことになりますが、次回以降はその時間を記憶して使用することになります。

  • put the ticks into start
     27行目で現在の時間を変数startに代入します。ここで、ストップウォッチをスタートさせたと考えればよいでしょう。


  • wait until the mouseclick is true
     29行目では、クリックされるまで処理を中断します。
    「the mouseclick(マウスクリック)」
      が
    「true(論理値の値が真。つまりクリックされた時)」
      に
    「until(なるまで)」
    「wait(繰り返す)」


  • put ","&cd fld "wait" after line num of cd fld "data"
     31行目では、待ち時間のデータをフィールド「data」に追加します。コンマとデータを&で結ぶことにより、itemチャンクとしてデータを代入しています。待ち時間が10秒であったとすると「,10」というデータが追加されることになります。


  • repeat until (wait-round((the ticks-start)/60))<0
     36〜38行目で接続までの残り時間をカウントダウンします。



    ■フリーメッセージへの切り替えのダイヤル、メッセージのダイヤルを行う(42〜48行)
     フリーメッセージへの切り替えをダイヤルし、次にメッセージをダイヤルします。メッセージが間違って送られるのを防ぐため、1ダイヤルごとに少しだけ時間を空けています。



    アドレス機能
     スタック「ぽけべらー」は(ポケットベルに関する内容だけですが)アドレス機能も備えています。新規追加機能、削除機能、そしてデータ表示機能の3つです。


    新規追加機能(ボタン「New」のスクリプト)
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    12 
    
    on mouseUp
      ask "名前をいれてください"
      if it is empty then exit mouseup
      put it into a
      ask "電話番号を入れて下さい"
      if it is empty then exit mouseup
      put it into b
      ask "フリーメッセージの時に最初に打つ文字は?"
      put it into c  
      put a&","&b&","&c&return after cd fld "data"
      put a&return after cd btn "list"
    end mouseUp
    
     名前、電話番号、フリーメッセージへの切り替えダイヤルの入力を行い、フィールド「data」に全データ、ボタン「list」に名前を代入します。



    削除機能(ボタン「Delete」のスクリプト)
     1 
     2 
     3 
     4 
     5 
     6 
     7 
    
    on mouseUp
      answer "本当に削除しますか?" with "OK" or "キャンセル"
      if it is "キャンセル" then exit mouseUp
      put word 2 of the selectedLine of cd btn "list" into num
      delete line num of cd fld "data"
      delete line num of cd btn "list"
    end mouseUp
    
     ボタン「list」で選択した人のデータを、ボタン「list」とフィールド「data」から取り除きます。



    データ表示機能(ボタン「list」のスクリプト)
     1 
     2 
     3 
     4 
     5 
     6 
    
    on mouseUp
      put word 2 of the selectedLine of cd btn "list" into num
      put line num of cd fld "data" into getData
      put item 2 of getData into number
      put number into cd fld "number"
    end mouseUp
    
     ボタン「list」で選択した人の電話番号のデータを、フィールド「number」に代入します。フィールド「number」はボタン「お電話します」の上に配置されています。



    変換表の変更
     ポケットベルの変換表というのは、各ポケットベル会社により微妙に異なります。そこで簡易に変換表の値が変えられる機能をつけ加えられるようにしてみます。
     メニュー「設定」の「変換表の変更」を選ぶと、ハンドラ「henkan」を呼び出します。このハンドラでは、フィールド「henkan」、ボタン「変更する」「キャンセル」を表示します。



    henkanのスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
    
    on henkan
      lock screen
      show cd fld "henkan"
      show cd fld "base"
      show cd btn "変更する"
      show cd btn "キャンセル"
      unlock screen with wipe right
    end henkan
    



    変更するのスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    
    on mouseUp
      put 1 into i
      repeat
        set the cursor to busy
        if word i of cd fld "henkan" is empty then exit repeat
        put word i+1 of cd fld "henkan" into cd btn word i of cd fld "henkan"
        put i+2 into i
      end repeat
    end mouseUp
    
     フィールド「henkou」のデータ形式は、以下の通りです。
     あ11 
     い12 
     う13 
     え14 
     お15 
     か21 
     ここでは word チャンクを用いてデータの区切りを調べています。詳しくは「理論編」の「チャンクについて」を見て下さい。


  • set the cursor to busy
     4行目ではカーソルの形状を変更しています。連続して指定することでカーソルがアニメーションします。


  • put word i+1 of cd fld "henkan" into cd btn word i of cd fld "henkan"
     6行目で、それぞれのデータをボタンに代入します。
    「cd fld "henkan"(フィールド「henkan」)」
      の
    「word i+1(i+1番目のword)」
      を
    「cd btn 」
    「word i of cd fld "henkan"(フィールド「henkan」のi番目のword)」
      に
    「put 〜 into 〜 (上書き代入する)」


     スクリプトの流れを一つ一つ見ていくことにします。

     1回目のループでは、i の値は1です。
    「cd fld "henkan"(フィールド「henkan」)」
      の
    「word 1+1(2番目のword「11」)」
      を
    「cd btn 」
    「word 1 of cd fld "henkan"(1番目のword「あ」)」
      に
    「put 〜 into 〜 (上書き代入する)」
    となります。つまり、「11」をボタン「あ」に代入するという事になります。次に、7行目で i の値を2プラスします。
     2回目のループでは、i の値は3です。
    「cd fld "henkan"(フィールド「henkan」)」
      の
    「word 3+1(4番目のword「12」)」
      を
    「cd btn 」
    「word 3 of cd fld "henkan"(3番目のword「い」)」
      に
    「put 〜 into 〜 (上書き代入する)」

     2回目のループでは「12」をボタン「い」に代入するとなるわけです。この繰り返しにより全てのデータをボタンに代入していきます。



     これで「ぽけべらー」の説明は終わりです。ポケットベルの会社により変換データが違うという点、メッセージ送信の品質の問題、カーソル・字数の問題など、いろいろと工夫をしたスタックでした。しかし、かなり実用的なスタックとなったことと思います。