連載[9-3] ボタンやメニューで使いやすいスクリプトを
|
《 親玉スクリプトに子供がたくさん
》
|
|||||||||||||||||||||||
|
、
|
オブジェクトごとにスクリプトを書くのは分かってきましたが、まだ何か足りない気がします。例えば、「あるチェック・ボックスがチェックされている時にあるボタンを押したら」というように、それぞれの部品が連携して処理内容を決めることってありますよね。例えば、ポップアップ・メニューでフォントを選択して、「実行」ボタンを押すとそのフォントで何か処理を行うなど。こういう時はどういったスクリプトを書けばよいのですか。 | ||||||||||||||||||||||
|
」
|
そうそう、個々のユーザー・インタフェース部品のスクリプトを書くのは分かるんですが、全体がどのようにまとまって動作するのかがピンと来ません。 | ||||||||||||||||||||||
|
先生
|
では、FaceSpanの仕組みをもう少し詳しく説明しようか。FaceSpanで扱うデータは「プロジェクト」という。プロジェクトの中には、図2のようにデータが階層構造で管理されている。 | ||||||||||||||||||||||
|
図2 FaceSpanのデータ構造
|
|||||||||||||||||||||||
|
」
|
プロジェクトというのが親玉で、その下にウインドウなどがあるわけですね。 | ||||||||||||||||||||||
|
先生
|
そう、そしてユーザー・インタフェース部品だけでなく、AppleScriptのスクリプトもこのように階層的に管理されるんだ。 | ||||||||||||||||||||||
|
」
|
階層的に管理と言いますと? | ||||||||||||||||||||||
|
先生
|
ごめん、簡単に言おう。実は親玉となる「プロジェクト・スクリプト」というのがあるんだ。 | ||||||||||||||||||||||
![]() |
|||||||||||||||||||||||
|
」
|
何やら複雑ですね。 | ||||||||||||||||||||||
|
先生
|
これはこのプロジェクト全体に関する、もしくはFaceSpanで作成したプロジェクトが起動された時に最初に実行するスクリプトが入っているんだ。そして、今まで見てきたボタンにくっついているスクリプトはすべて、この「プロジェクト・スクリプト」のサブルーチンとしてみなすことができるんだ。 | ||||||||||||||||||||||
|
、
|
そういえば、ボタンのスクリプトは「on」で書き始めますね。これはサブルーチンの書き方ですよ。 | ||||||||||||||||||||||
|
先生
|
そうだね。「ボタンを押した時に実行される」という特別なサブルーチンをぼくらは書いてきたわけだ。 | ||||||||||||||||||||||
|
」
|
その親玉スクリプトは、何やら複雑ですけど。 | ||||||||||||||||||||||
|
先生
|
1行目を見てごらん。
open window "サンプル" |
||||||||||||||||||||||
|
」
|
あっ、これで僕も分かりましたよ。「親玉」の意味が。 | ||||||||||||||||||||||
|
先生
|
これはまさに、「サンプル」というウインドウを開けと威張っているわけだね。 | ||||||||||||||||||||||
|
」
|
その下の「on chosen …」以下は | ||||||||||||||||||||||
|
先生
|
これは、「ファイル」「編集」といったメニューを制御するものだ。 | ||||||||||||||||||||||
|
、
|
結構難しそうなスクリプトですが…。 | ||||||||||||||||||||||
|
先生
|
実は、これは私が書いたんじゃないんだ。 | ||||||||||||||||||||||
|
」
|
といいますと。 | ||||||||||||||||||||||
|
先生
|
FaceSpanは、新しいプロジェクトを作ると、自動的に簡単なメニューを付けて、その制御スクリプトを作ってくれるんだ。アプリケーションとして動かした時に、何もメニューがないと格好悪いからね。「終了」しかない「ファイル」メニューとか、単純なものだけだけど。自分なりのメニューを作るには、それを改良すればいい。 | ||||||||||||||||||||||
|
《 ポップアップの選択如何で処理を変えるには
》
|
|
|
、
|
スクリプトにも親玉がいるということは、さっきの僕の質問の答えも生まれてきそうですね。 |
|
先生
|
そう、いろいろな部品の間でデータをやり取りするには、例えば親玉スクリプトに共通で使える変数を定義する手があるね。 |
![]() |
|
|
先生
|
てな風に、プロジェクト・スクリプトに変数を書いておいて、それを通じてサブルーチン同士でやり取りするわけだ。 |
|
」
|
「property」って書いてありますけど、これは属性を自分で定義しているんですか。 |
|
先生
|
その通りだよ。プロジェクトもオブジェクトだけど、プロジェクトに対して自分で属性を宣言してしまうんだ。このpropertyはウインドウ上のいろいろなオブジェクトのスクリプト中で参照することができるんだ。ここでは、theFontという名前で、初期値を空の文字列に定義している。 |
|
、
|
そうすると、さっきのポップアップ・メニューのスクリプトから,このtheFontが参照できるわけですね。 |
|
先生
|
その通りだ。 |
![]() |
|
|
先生
|
てな具合にselection madeハンドラを書けば、メニューが選択されるとその値がtheFontにsetされる。こんな感じに共通のpropertyを用意しておけば、オブジェクトの間で選択肢やチェックの有無などを受け渡しできるんだ。 |
|
《 前回の流用で、あらっ、立派なアプリケーションが
》
|
|
|
先生
|
よし、ではDTPシリーズの締めくくりとFaceSpanの使い方の復習を兼ねて、こんなアプリケーションを作って見よう。 これは、前回作ったスクリプトを流用して、アプリケーションのように仕立てたものだよ。 |
|
、
|
前回は確か、PreFab PlayerやPhotoMaticといったユーティリティーを使って、画像処理ソフトのAdobe Photoshopを自動化しましたよね。 |
|
先生
|
画像の解像度変換の例を見せたが、今回はFaceSpanを使って、実行時にラジオ・ボタンで解像度を選べるようにしてみた。 |
![]() |
|
|
」
|
でもスクリプトの量が結構増えるんじゃないんですか? |
|
先生
|
いやいや、心配には及ばないよ。FaceSpanはあくまでユーザー・インタフェースを構築するものだからね。スクリプトは前回のものを再利用して、あとはボタンやポップアップ・メニューのスクリプトを数行書いてやる程度だ(図3)、 |
|
図3 ラジオ・ボタンやプッシュ・ボタンに貼り付けたスクリプト
![]() |
|
|
、
|
基本的な仕組みを解説していただけませんか。 |
|
先生
|
まずプロジェクト・スクリプトの1行目を見てほしいんだが。
property resolution : "72" |
|
、
|
これは「resolution」と言う名前の属性の定義ですね。 |
|
先生
|
そう、この値は、3つのラジオ・ボタンがチェックされるたびに変化する。 例えば「144 dpi」をチェックすると、"144"という文字列がセットされるんだね。 |
|
、
|
なるほど、図3を見ると、3つのラジオ・ボタンのスクリプトで、それぞれ違う値をセットしていますね。
|
|
先生
|
ラジオ・ボタンに何か変化があると、それに貼り付けられたスクリプトの「on hilited」ハンドラが自動的に呼び出される。 ラジオ・ボタンはチェックされている時はhilite属性がtrue(真)になるから、それを判断してresolutionをセットするってわけさ。 |
|
」
|
実行ボタンを押すと、Photoshopが動き出すわけですね。 |
|
先生
|
そう、動作は前回と同じだ。Photoshopが指定した数値で解像度変換を始めるよ。 |
![]() |
|
|
先生
|
「実行」ボタンのスクリプトを見てごらん。
on hilited theObj |
|
、
|
このボタンはクリックされると、サブルーチンのdpi_changeを呼び出すと…。dpi_changeの中身はと言うと…、あれっ、前回作ったスクリプトとほとんど同じですね。 |
|
先生
|
そう、前回「PreFab Player」というユーティリティーを使ってPhotoshopを自動化するスクリプトをちょっとだけ直したものだよ。前回は、 type "72" というように数字を直接書いていたけど、今回は、 と、変数を使っているのがミソだ。
|
|
、
|
ラジオ・ボタンによってセットされた値を使っているのですね。 |
|
先生
|
その通り。これで実行時に解像度を選択できるわけさ。 |
|
」
|
先生、「実行」ボタンが2重線で強調されていますが、これはreturnキーで選択できるボタンですね。どうやるんですか? |
|
先生
|
これはボタンの属性の設定で、「デフォルト項目」というのをチェックしておけばいいんだ。 |
|
」
|
「終了」ボタンのスクリプトはどうなっているんですか。 |
|
先生
|
スクリプトはいらないんだ。「自動クローズ」と「キャンセル項目」という属性を設定しておくと、勝手にウインドウを閉じてくれる。このプロジェクト・スクリプトでは、
open window "DPI_Changer" しかないから、それで終了するというわけなんだね。 |
|
《 装飾を施して実行専用形式で保存
》 ・
|
|
|
、
|
アイコンなども貼ってありますね。 |
|
先生
|
これは特別難しくないよ。図1のように、アイコンや四角形、線やピクチャーなどのツールなどがあるから、あとはデザイナーの本業! 見た目も美しいウインドウに仕立ててくれ。 |
|
」
|
あの〜、FaceSpanで作ったもの、え〜と「プロジェクト」ですか、これを実行するにはFaceSpanを起動して、先ほどのように「実行」ボタンをクリックしないとダメなんですか。 |
|
先生
|
いやいや、そんな面倒なことはない。プロジェクトは「実行専用形式」でも保存できる。そうすればFaceSpanがなくても、単独のアプリケーションとして実行できるよ。 |
|
、
|
そうするとまるで、ユーザー・インタフェースを持った立派なアプリケーションですよね。それならプログラミング敬遠派の人にも気軽に使ってもらえそうです。 |
|
先生
|
出来上がった実行専用形式のアプリケーションは、自由に配布していいんだ(FaceSpan自体はもちろんダメ)。 どんどんコピーしてみんなに使ってもらいたまえ。 |
|
」
|
でも、本格的なものを作るとなると結構大変そうですよね。例えばリスト・ボックスに画像ファイルをリストアップして、選択したものをどうこうするとか…。 |
|
先生
|
確かにその通りだが、まあ、あせらないで1歩ずつ勉強して行こう。ここまでサクサクできるようになればプロも顔負けだよ。 |
AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp