vieweditattachhistorytopchangessearchhelp

第08回


■SqueakではじめるSmalltalk入門   第8回


 本連載では、名前はよく耳にしていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、簡易ペイントスクリプトに、描いた絵を保存する機能拡張を施します。

"01" | pen |
"02" pen _ Pen new.
"03" pen defaultNib: 3.
"04" pen color: Color red.
"05" [Sensor shiftPressed] whileFalse: [
"06"    | position |
"07"    position _ Sensor peekPosition.
"08"    Sensor redButtonPressed
"09"       ifTrue: [pen goto: position]
"10"       ifFalse: [pen place: position]]


 このスクリプトは5行目でshiftキーが押されていることを関知すると、ループをやめて終了します。描いた絵を保存するためには、この後に任意の矩形領域を切り取り、それを画像ファイルとして保存するコードを追加すればよさそうです。手始めに、画面の矩形領域を基本図形GUIウィジェトである「モーフ」として取り出すコードを書いて、その動作を確認してみましょう。

Form fromUser asMorph openInHand


 このメッセージ式をdo it(cmd+D)すると、マウスポインタの形が変わって任意の矩形領域をマウスのドラッグにより指定することを促されます。ドロー系アプリケーションなどでお馴染みの方法、つまり、左上から右下にかけてドラッグすることで矩形領域を指定します。この操作が終わると同時に、指定した矩形領域に含まれるビットマップ画像はモーフとして切り出されるはずです。

 Formは、ビットマップ画像を表わすオブジェクトが属するクラスで、fromUserメッセージを送ると、画面の任意の矩形領域のビットマップ画像をインスタンスとして返します。asMorphメッセージは、レシーバと等価、あるいは類似のモーフを生じさせ、それにopenInHandメッセージを送ることで画面に呼び出すと同時に、マウスで“つかんだ”状態にすることができます。

 ここで注意したいのは、asMorphメッセージは、Formではなく、Form fromUserの結果、つまりFormのインスタンスに送られる、ということです。同様に、openInHandは、FormでもFormのインスタンスでもなく、FormのインスタンスにasMorphを送った結果の返値、すなわち、Formのインスタンスと等価な画像モーフに対して送られます。余談ですが、asMorphはFormのインスタンスだけでなく、文字列などにも送ることができます。この場合、等価な文字列モーフ(StringMorph)のインスタンスが作られます。

'This is a pen.' asMorph openInHand


 話を戻します。10行目の最後に、式の区切りを意味するピリオドを追加し、先の式(Form fromUser ...)を11行目として続けます。すべての行をあらためて選択してからdo it(cmd+D)をしてみましょう。絵を描いた後、shiftを押すと同時に矩形領域の選択が促され、それに従うと指定した矩形領域に含まれる絵を切り取ったモーフを手にすることができるはずです。

 モーフではなく、指定した矩形領域に含まれる絵をファイルとして保存するにはasMoprh、openInHandの代わりに次のメッセージ「writeJPEGfileNamed:'image.jpg'」をFormのインスタンスに送ります。パラメータで指定したファイル名でビットマップ画像をJPEGファイルとして保存することが可能です。

Form fromUser writeJPEGfileNamed: 'image.jpg'


 任意のファイル名で保存したければ、標準入力欄(fill in the blank)を使います。

FillInTheBlank request: 'Filename?'   "=> (入力した文字列) "


 描く前の画面のクリア、描き終わった後の画面のリストアの処理を加え、出来上がったスクリプトはこんなかんじになります。

| pen form |
pen _ Pen new.
pen defaultNib: 3.
pen color: Color red.
Display fillWhite.                     "画面のクリア"
[Sensor shiftPressed] whileFalse: [
   | position |
   position _ Sensor peekPosition.
   Sensor redButtonPressed
      ifTrue: [pen goto: position]
      ifFalse: [pen place: position]].
form _ Form fromUser.                  "描画のformへの束縛"
Display restore.                       "画面のリストア"
form writeJPEGfileNamed: (FillInTheBlank request: 'Filename?')


 次回から、システムブラウザ(GUI)を使ったクラスやメソッドの定義のしかたを解説します。

このページを編集 (3700 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 1141 times.