by Bird
「on open」ハンドラは、ファイル/フォルダのアイコンをスクリプトアプリケーションのアイコンにドロップすることで呼び出されます。これは皆さん、よくご存じですよね?それではスクリプト中から「on open」ハンドラを呼び出すことができることは知っていますか? 例えば、
on open ItemList
tell application "Finder"
repeat with OneItem in ItemList
set label index of every item of OneItem to 1
end repeat
end tell
end openという、ドロップされたフォルダ内のすべてのファイル/フォルダにラベルを付ける(ラベル番号を1にする)スクリプトを考えてみましょう。これをダブルクリックでも起動できるようにするにはどうすればよいでしょうか?・・・答えは簡単! スクリプトに次の2行を追加するだけです。
choose folder
open result as listまたは、「open (choose folder) as list」と1行で書いても同じことですね。注意すべきことは、「on open」ハンドラのパラメタはリストでならなければならないということです。
一般的には、「on run」ハンドラ、「on open」ハンドラ双方から、サブルーチンを呼び出すという方法をとることが多いようですが、上記の方法の方が簡潔でしょ?(まあ、好みの問題と言ってしまえばそれまでですけど...。)
さてさて、「on run」ハンドラから「on open」ハンドラを呼び出すことができるなら、「on open」ハンドラの中から自分自身を呼び出す再帰的な処理もできるはずです。先のスクリプトをフォルダ内のフォルダの項目も処理できるように改造してみましょう。
on open ItemList
tell application "Finder"
repeat with OneItem in ItemList
set label index of every item of OneItem to 1
set FolderList to every folder of OneItem
tell me to open FolderList--自分自身を呼び出す
end repeat
end tell
end open・・・てな具合ですね。何のことはない、サブルーチンの中から自分自身を呼び出すのとそっくりです([Tips---フォルダに含まれる全てのファイルを処理する]を参照)。えっ、このようにサブルーチンを使わずに「on open」ハンドラ自身を呼び出すことのメリットはあるのかだって? う〜ん、要するに好みの問題ですよ、好みの(^ ^;
以上のことから、当然、他のコマンドハンドラ(「on run」「on idle」「on quit」「on print」)も同様も呼び出すことができることは容易に推測されるところでしょう。
しかし、同じスクリプト中からこれらのコマンドハンドラを呼び出す意味はあまりないように思われます。しかし、他のスクリプトから命令を送る場合にはその限りではありません。むしろ、その方が本来のコマンドハンドラの呼び出し方(?)と言えるかも知れません。(Bird)