HyperCard tribute

ポップアップメニューの追加・削除


 ポップアップメニューの内容を追加する方法です。ポップアップの内容はボタンの設定画面の内容ボタンからしかできないようですが、実はスクリプト上からでも可能です。その理由は、ポップアップメニューのデータをテキストとしてボタンが持っているからです。

 ポップアップというのはHyperCard2.2から追加された機能です。それ以前のHyperCardでポップアップを作るには、クリックして選択されたメニューを表示するためのボタン(フィールドでも可能)と、ポップアップメニューを表示するフィールドが必要でした。しかし、HyperCard2.2ではボタンだけでできるようになりました。それは、ボタンもフィールドと同じコンテナとして扱われるようになったからです。

 コンテナとはデータを納める場所の事です。コンテナには以下の種類があります。
1. フィールド
2. ボタン
3. メニュー
4. 変数(ローカル変数、グローバル変数、it)
5. メッセージボックス
 すなわち、フィールドはコンテナの内容を表示する場所を持っているために、コンテナの内容を見ることができるのです。そして、ボタンはその場所をもっていないために通常は見ることができない。しか、しデータを持つことは可能なのです。

 ボタンのコンテナへのへのアプローチの方法はフィールドへのそれと同じです。
 それではいくつかの実験をしてみようと思います。普通にボタンを作成し名前を「実験」にしてみて下さい。
 以下のスクリプトをメッセージボックスから打ち込んでみて下さい。


  • put cd btn "実験"
     メッセージボックスには何も表示されないはずです。コンテナには何も入ってないのですから当然です。


  • put "コンテナの実験です" into cd btn "実験"
     これで "コンテナの実験です" というデータがボタン「実験」のコンテナに代入されました。ボタン「実験」の設定画面を出して、内容ボタンをクリックしてみて下さい。コンテナの内容を見ることができます。


    次はポップアップメニューへの追加をしてみます。

  • put return&"改行を忘れずに!" after cd btn "実験"
     追加するメニューにもあるように、改行を忘れないようにしなければなりません。現在のカーソルは最後の行である "コンテナの実験です" の後ろにあります。そのため追加するためには先にreturnコードを入れ次の行にカーソルを移してからにしなければならないのです。
     追加ですから after に変えるのも忘れてはなりません。intoにすれば上書き代入されてしまいますし、beforeにすれば前に挿入されてしまいます。


     次は指定した行への代入です。これも他と同じく、別に変わったことはしていません。フィールドなどで用いた方法がそのまま使うことができます。

  • put "行を指定してみよう" into line 2 of cd btn "実験"
     ボタン「実験」のコンテナ2行目に代入します。
    「行を指定してみよう」
      を
    「cd btn "実験"」
      の
    「line 2(2行目)」
      に
    「put 〜 into 〜 (上書き代入する)」
     ボタン「実験」の設定画面を出して内容ボタンをクリックし内容を確認してみて下さい。2行目が書き変わっているはずです。



     それでは、optionキーを押しながらクリックしたときに、askのダイアログで追加するポップアップメニューを聞き追加するスクリプトを作ってみます。
     ポップアップ形式のボタン「選択」を作り、以下のスクリプトを打ち込んで下さい。
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
    
    on mouseUp
      put the selectedText of cd btn "選択" into text
      if the optionkey is down then
        ask "追加するポップアップメニュー"
        if it is empty then exit mouseUp
        put return&it after me
      end if
    end mouseUp
    

     3行目では、オプションキーが押されているかどうかを調べます。optionキーがdownであればthen節の中の処理が実行されます。4行目で、askを用いて追加するポップアップメニューを聞き、それを6行目で追加します。



     スクリプトを追加して、ポップアップメニューを削除するようにしてみます。
     追加には option キーを使いましたので、削除には shift キーを使ってみます。shiftキーを押しながらクリックしたら、選択していた行を削除します。
     8行目以降が追加されたスクリプトです。
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
    10 
    11 
    12 
    13 
    14 
    
    on mouseUp
      put the selectedText of cd btn "選択" into text
      if the optionkey is down then
        ask "追加"
        if it is empty then exit mouseUp
        put return&it after me
      end if
      if the shiftkey is down then
        answer text&"を削除します。"&return&"よろしいですか?" with "YES" or "NO"
        if it is "NO" then exit mouseUp
        put word 2 of the selectedLine of cd btn "選択" into number
        delete line number of cd btn "選択"
      end if
    end mouseUp
    

  • put word 2 of the selectedLine of cd btn "選択" into number
     ボタン「選択」で選択されている行が何行目であるかを調べます。
     selectedLineで取り出されるデータは、「line 4 of card button 1」という様な形式です。このデータからは「カードボタン番号1の4行目が選択されている」ということがわかります。すなわち、必要なのは2つ目のwordの位置のデータです。
    「cd btn "選択"」
      の
    「selectedLine(選択されたライン)」
      の
    「word 2(2つ目のワード)」
      を
    「変数 number」
      に
    「put 〜 into 〜 (上書き代入する)」
     この1行は以下のように2行に分けて書くこともできます。

     put the selectedLine of cd btn "選択" into a
     put word 2 of a into number

     上のように分けて書けばわかりやすくなることと思います。すなわち、このように1文で連ねて書くことも可能であるという事です。


  • delete line number of cd btn "選択"
     delete命令を使えばデータを完全に消去することができます。
     ここでemptyを代入したとすると、1行空白の行ができてしまいます。emptyは空っぽなのですが、コンテナの2行目には値が入る余地が残されています。この余地を消し去るためにdelete命令を用いるのです。
    「cd btn "選択"」
      の
    「line number(number行目)」
      を
    「delete 〜(消去する)」


     アドレス帳などの人名を選択する時に、ポップアップメニューを用いれば大変わかりやすいユーザーインターフェースとなります。広いスペースを取ることができる場合はリスト形式のフィールドを用い、広いスペースを取ることができない場合はポップアップを用いるという風に分ければよいでしょう。