HyperCard tribute

アドレス帳


 簡単シリーズも終わり、ここからは少し難度が上昇します。しかし、難しくなるのではなくややこしくなることに注目して下さい。一つ一つ理解していけば難しくはありません。

 ここではアドレス帳を作ります。アドレス帳としての機能はもちろんの事、「New」ボタンを押すことでの新規データカード作成、表示画面・編集画面の分離により誤ってデータを消す危険を減らすなどの機能を持たせてあります。
アドレス帳「Address」
 ダウンロード(7KB)

 基本となる構成は以下の4枚のカードです。
タイトル画面

選択画面  

表示画面  

編集画面見本

 選択画面で人物リストの中から選択すると表示画面へ移動します。表示画面には、編集ボタンと削除ボタンがあり、編集ボタンを押すと編集画面へ、削除ボタンを押すと選択していた人のデータを削除します。削除時にはダイアログを出して、本当に削除をするのか確認をします。



スタックのスクリプト

 私が作成するスタックには、基本形として以下のスクリプトを使用しています。openStackハンドラでは、スタックの使用時間をはかるため、現在の時間を納め、通常画面へと移動します。
 closeStackでは使用時間の表示、サウンド機能のオン、スタックの整理を行います。この他にメニューを作成したときなどは、メニューをリセットしておくなども忘れてはなりません。
 1 
 2 
 3 
 4 
 5 
 6 
 7 

 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
on openStack
  global starttime
  lock screen
  put the ticks into starttime
  go to cd "address list"
  unlock screen with dissolve
end openStack

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 useing!  使用時間:"&b&"分"&a*6+random(5)&"秒"
  domenu "Compact Stack"
end closeStack


選択画面構成

(1)ボタン「New」
(2)フィールド「name」
(3)ボタン「Find」
(4)ボタン「A(ボタン番号1)」
(5)ボタン「A(ボタン番号2)」


フィールド「name」のスクリプト
 カード「選択画面」にある人物リスト、それがフィールド「name」です。人物名をクリックするとカード「表示画面」にデータを表示します。
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
on mouseup
  global clickNum,c_name
  lock screen
  put word 2 of the selectedLine of cd fld "name" into clickNum
  put the selectedText of cd fld "name" into c_name
  go to cd c_name
  put cd fld "name"&"("&cd fld "hurigana"&")"&return&return after data
  if cd fld "add"<>empty then put cd fld "add"&return after data
  if cd fld "home"<>empty then put "Home  "&cd fld "home"&return after data
  if cd fld "mobile"<>empty then put "Mobile  "&cd fld "mobile"&return after data
  put return after data
  if cd fld "e-mail"<>empty then put "E-mail  "&cd fld "e-mail"&return after data
  if cd fld "URL"<>empty then put "URL  "&cd fld "URL"&return after data
  if cd fld "birth"<>empty then put "Birth  "&cd fld "birth"&return after data
  if cd fld "blood"<>empty then put "blood  "&cd fld "blood"&return after data
  go to cd "view"
  put data into cd fld "hyouji"
  unlock screen with dissolve
end mouseup

  • put word 2 of the selectedLine of cd fld "name" into clickNum
     4行目で、クリックされた行ナンバーを取り出します。ちなみに、clickNumはグローバル変数宣言をしています。
    「cd fld "name"(フィールド「name」)」
      の
    「the selectedLine(選択された行データ。例:line 3 of card field 1)」
      の
    「word 2(2番目のword。上の例では3が取り出されます)」
      を
    「変数clickNum」
      に
    「put 〜 into 〜 (上書き代入する)」


  • put the selectedText of cd fld "name" into c_name
     5行目では選択された名前を取り出し変数c_nameに入れています。このc_nameもグローバル変数です。


  • go to cd c_name
     6行目でカード c_nameに移動します。このようにカード名の指定には変数を利用することもできます。


  • put cd fld "name"&"("&cd fld "hurigana"&")"&return&return after data
     7行目から15行目までで、表示するデータを変数に追加代入します。名前以外のデータの場合は、データが入っていない可能性がありますので、データの入っていない行は飛ばして、データの入っている行のみ取り出します。


  • put data into cd fld "hyouji"
     16行目で表示画面に移動し、7〜15行で作成した変数dataをフィールド「hyouji」に代入します。



    ボタン「New」のスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    12 
    13 
    14 
    15 
    16 
    17 
    18 
    
    on mouseUp
      ask "名前を入れてください"
      if it is empty then exit mouseUp
      put it into name
      ask "ふりがなを「ひらがな」で入れてください"
      if it is empty then exit mouseUp
      lock screen
      put it into hurigana
      put hurigana&"、"&name&return after cd fld "name"
      go to cd "mihon"
      domenu "コピーカード"
      domenu "ペースト カード"
      set the name of this card to hurigana&"、"&name
      set the cantDelete of cd hurigana&"、"&name to false
      put name into cd fld "name"
      put hurigana into cd fld "hurigana"
      unlock screen with dissolve
    end mouseUp
    

     新規追加者の名前とふりがなをダイアログで入力してもらいそのデータをそれぞれ変数に入れます。次にメニュー「コピーカード」「ペースト カード」を実行して新規カードを作り、カードの名前を「ふりがな」&「名前」に設定します。最後にカード削除を可能にして、名前とふりがなをフィールドに代入します。


  • domenu "コピーカード"
  • domenu "ペースト カード"
     10行目で、見本のデータカードに移動しコピー・ペーストをして新規のデータカードを作成する。domenu命令を用いることで、スクリプトからメニュー項目の実行をさせることができます。メニュー項目を指定するときは、メニューに登録されている項目名をしっかりと打ち込まないと実行させることができません。例えば、半角スペースやピリオドなどは見落としやすいですから気を付けて下さい。


  • set the name of this card to hurigana&"、"&name
     13行目では新規カードの名前を設定しています。
    「this card(このカード)」
      の
    「the name(名前)」
      を
    「hurigana&"、"&name(「ふりがな,なまえ」)」
      に
    「set 〜 to 〜 (設定する)」


  • set the cantDelete of cd hurigana&"、"&name to false
     13行目では新規カードの名前を設定しています。
    「cd hurigana&"、"&name(カード「ふりがな,名前」)」
      の
    「the cantDelete(削除不可)」
      を
    「false(論理値の値が偽。つまりカード削除可となります)」
      に
    「set 〜 to 〜 (設定する)」




    フィールド「name」のフォント拡大縮小
      縮小ボタン「A(ボタン番号1)」
      拡大ボタン「A(ボタン番号2)」


    拡大のスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    
    on mouseUp
      set the enabled of cd btn 1 to true
      put the textsize of cd fld "name" into a
      if a=9 then set the textsize of cd fld "name" to 12
      else if a=12 then set the textsize of cd fld "name" to 14
      else if a=14 then
        set the textsize of cd fld "name" to 18
        set the enabled of me to false
        put empty into msg
      end if
    end mouseUp
    

    縮小のスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    
    on mouseUp
      set the enabled of cd btn 2 to true
      put the textsize of cd fld "name" into a
      if a=18 then set the textsize of cd fld "name" to 14
      else if a=14 then set the textsize of cd fld "name" to 12
      else if a=12 then
        set the textsize of cd fld "name" to 9
        put empty into msg
        set the enabled of me to false
      end if
    end mouseUp
    
     縮小・拡大ともボタンを使っているので、名前は縮小拡大ともに「A」です。そのため、ボタンの指定にはボタン番号を用いています。


  • set the enabled of me to false
     9行目ではボタンを使用不可にしています。使用不可にすることで、ボタンの文字はグレーになり視覚的にも押せないことがわかるからです。
     この拡大縮小ボタンは、ボタンでなくとも、フィールドや透明ボタンを用いても同じ役割をさせることができました。しかし、ボタンの使用不可、すなわち文字をグレーにする処理をさせるためにボタンをあえて使用したのです。少しでもユーザーに与える印象を良くするために、こちらの方法を選んだわけです。それだけ、ユーザーインターフェースが大事であるということです。



    ボタン「Find」のスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
    
    on mouseUp
      ask "検索するキーワードを入れてください"
      if it is empty then exit mouseup
      put "find string ""e&it"e into msg
      hide msg
      returnkey
      if the result is not empty then answer "検索キーワードは見つかりませんでした"
    end mouseUp
    
     2行目で、検索するキーワードを入力してもらい、find string "???"という形式にしてメッセージボックスに入れます。その後、6行目でリターンキーを打ち込むことで、メッセージボックスに書き込まれたスクリプトを実行します。
     もし、検索した結果何も見つけられなければ、ダイアログを表示してその旨を表示します。


  • put "find string ""e&it"e into msg
     4行目で、メッセージボックスにfind命令を書き込みます。スクリプトに直接find命令を書き込んでも良いのですが、そうした場合ある問題が現れることになります。それは、連続検索機能です。
     通常の検索は、キーワードを見つければ結果を表示し、その結果が望むものでなければ次を検索します。しかし、スクリプトに書き込んだ場合は一度その行を実行すればそれで検索は終わってしまいますし、検索した結果何も見つけられない場合は放ったらかしになります。その様な理由から、メッセージボックスに命令を書き込むのです。これにより、リターンキーを押す度に検索をさせることができるようになります。


  • if the result is not empty then answer "検索キーワードは見つかりませんでした"
     検索した結果、何も見つからなければHyperCardはエラーを返します。その結果はresultに入りますので、resultが空っぽでない場合(=エラーが出た場合)「検索キーワードは見つかりませんでした」とダイアログで表示します。
     検索した結果、何も見つからなかった時、放ったらかしにするのはインターフェースとしては最低です。ユーザーは結果が見つからなかったのか、コンピュータが間違ったのかわからないからです。そして、このような事を考えさせた時点で、自分とコンピュータの間に壁を感じてしまうのです。



    表示画面構成
    
    
    (6)ボタン「List」(選択画面へ移動します)
    (7)フィールド「hyouji」
    (8)ボタン「Edit」
    (9)ボタン「Delete)」


    ボタン「Edit」のスクリプト
     1 
     2 
     3 
     4 
     5 
    
    on mouseUp
      global c_name
      visual effect dissolve
      go to cd c_name
    end mouseUp
    
     選択画面で選択した人物名のカードへ移動します。



    ボタン「Delete」のスクリプト
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    
    on mouseUp
      global clickNum,c_name
      answer "本当に削除しますか?" with "OK" or "キャンセル"
      if it is "キャンセル" then exit mouseUp
      lock screen
      go to cd c_name
      domenu "カード削除"
      go to cd "address list"
      delete line clickNum of cd fld "name"
      unlock screen with dissolve
    end mouseUp
    
     誤って削除するのを防ぐために3行目で確認をしてから削除をします。ボタンを押したからといってすぐに削除するのは危険です。「人間は間違うものである」と考え常にユーザーの立場にたってスタックを作成しなければなりません。

  • domenu "カード削除"
     7行目で、削除する人のデータカードを削除します。domenuという命令を用いれば、メニューに登録してある項目を実行させることができます。


  • delete line clickNum of cd fld "name"
     9行目で、削除する人のデータをアドレスリストから削除します。delete文を用いていますので、変数clickNumの行を削除しその下にある行を上に詰めます。emptyを代入すると、空白行ができしまいますので注意が必要です。



     確かにスクリプトの量は今までのスタックと比べると段違いに多くなりました。しかし、一つ一つ理解していけば難しくありません。難しく感じるのは他人が作ったスタックだからであって、このスタックが難しいのではないはずです。
     体裁など気にせずに自分でどんどんスタックを作ってみて下さい。これらのスタックは人に見せるために効率のよいスクリプトを書くように心がけていますが、そうでないならばそんなことを気にする必要はないからです。自分でスタックを作れば大きな勉強になりますから是非作ってみましょう。