どこでもプログラムを止める方法についてです。
一般的には、メインのrunハンドラ(記述されていない暗黙のrunハンドラ内)でreturnコマンドを実行すると、実行を終了します。スクリプトエディタ上で実行した場合には、基本的にそういう動作です(「ハンドラの実行後に終了しない」にチェックを入れてアプレット書き出しした「Stay Open Applet」ではアプレットは終了しませんが、実行中の処理自体は止まります)。runハンドラからサブルーチン(ハンドラ)を呼び出している場合には、returnコマンドを実行するとrunハンドラ側に戻ってくるだけです。
# Cocoaの機能を使ってタイマーオブジェクト(NSTimer)を作成して定期的に処理呼び出しするように宣言するとか、ノーティフィケーション宣言してメモリ上にオブジェクトを作ってイベントを受信するとか、そういうScriptを実行した場合にはメモリ上にオブジェクトが常駐しているかぎり実行は止まりません(この場合、スクリプトエディタを終了させるとオブジェクトも消えて動作が完全停止)
以前に、AppleScriptの実行を止めるためにさまざまな方法で、「止めるためのアクション」を検出する方法について紹介したことがあります。
ただ、ユーザーの停止要求を受け付けても、その場ですぐに止められるかどうかは別問題です。止めるためにループで条件を検出(キー入力や特定フォルダ内のファイル/フォルダの存在確認)などを行い、止めるために全力を尽くしていました。
どこでも好きなタイミングで、メインループのような場所でもなく、呼び出されたサブルーチン内などで好きに止めたい、という場合の方法をまとめてみました。
簡単にいえば、エラーを起こして止めることになるわけですが、ダイアログでCancelボタンを押したのと同じ(害のない)エラーコードを指定します。
AppleScript名:abort script |
repeat 10 times display dialog "TEST" buttons {"OK"} default button 1 error number -128 –> error "ユーザによってキャンセルされました。" number -128 from «script» to item end repeat |
AppleScript名:abort script 2 |
on run display dialog "run" sub1() of me end run on sub1() display dialog "sub1" sub2() of me end sub1 on sub2() display dialog "sub2" error number -128 –ここで止まる –> error "ユーザによってキャンセルされました。" number -128 from «script» to item end sub2 |