next up previous contents
: モーフに画像を付ける : ユーザインターフェース : Playerクラスにメソッドを追加する   目次

RCMorphクラスのビューワにタイルを追加する

モーフにタイルを追加するために、RCMorphクラスのクラスメソッドにadditionsToViewerCategoriesを定義する。このメソッドの書式は決まっており、以下のように書く。
additionsToViewerCategories
    ^ カテゴリ別のタイル定義の配列

    "ただし、"
    "カテゴリ別タイル定義:#(#カテゴリ名 タイル定義の配列)"
    "タイル定義(コマンド):#(#command #メソッド名 'コメント'
                               以下引数を使うかどうかで変える)"
    "タイル定義(スロット):#(#slot #アクセスするプロパティ名
                               'コメント' 以下タイルごとに変える)"
つまり、additionsToViewerCategoriesは「カテゴリ名とタイル定義の配列のセット」を1要素とする配列を返すメソッドである。Smalltalkにおける配列は
    #(要素1 要素2 ... 要素n)
のように書かれ、1要素は1オブジェクトである。したがって配列の中に配列とそれ以外のオブジェクトも混在できる。

タイル定義の最後の方の要素は、使いたいタイルの種類によって書き方が異なる。例えば、引数をとりメソッドを実行させるタイプのタイルを作りたいならば、タイル定義の第一要素を#command、第四要素を引数の型(#Number, #ScriptNameなどを指定できる)にする。変数Xの表示を行いたいならば、第一要素を#slot、第四要素以下に「#変数の型 #readOnly #Player #getX #Player #setX」(getX、setXはPlayerクラスに定義する)と続ける必要がある。

扱うべきメソッドが多いため、ビューワを開いた時に一度に沢山のタイルが表示されないよう、モータ、バッチ、レスクロIOの3つのカテゴリを新たに作った。実際の定義の一部を以下に示す。

additionsToViewerCategories
    ^ #(#(#モータ
          #(#(#command #forwardRoll: 'rotate mortors forward' #Number)
            (中略)
            #(#command #緊急停止 'haltです')
           )
         )
        #(#バッチ
          #(#(#command #コンバート実行: 
              '書込先番号を確認してからコンバートしてください' #ScriptName)
            (中略)
            #(#slot #selectedBatNum '現在選択中のコンバート先'
              #Number #readOnly #Player #getSelectedBatNum
              #Player #setSelectedBatNum:)
           )
         )
        #(#レスクロIO
          #(#(#command #AD入力: 
              '引数のポート番号からAD入力します(16回平均をとる)' #Number)
            (中略)
            #(#slot #receivedData '補足説明はありません'
              #Number #readOnly #Player #getReceivedData
              #Player #setReceivedData:)
           )
         )
       )



Deguchi Lab. 平成20年3月5日