GO BACK

AppleScript Studio教室 その3

「フィールドの入力とダイアログの表示」



■数字を使って計算する

 では、前回作成したNSButtonとNSTextFieldを使って、もう少し他のものも作ってみましょう。まずは「数字」です。前回、「string value」というものを使って、NSTextFieldからテキストの値を取り出しました。今度は数字を取り出して操作してみましょう。例として、よくあるパターンですが「入力した数字の合計を表示する」といったスクリプトを考えてみましょう。

on clicked theObject
set num to integer value of text field "text1" of window "win1"
set total to 0
repeat with i from 1 to num
set total to total + i
end repeat
display dialog "合計は、" & total
end clicked


 先ほど作成したclickedハンドラを上記のように書き換え、ビルド&実行してみましょう。そして、現れたウィンドウでフィールドに数字(整数)を書き込み、ボタンをクリックしてみます。すると1からその数字までを合計した結果が画面に表示されます。

合計を計算する


 ここで使っているのは、「integer value」というものです。これは前回使ったstring valueと同様のもので、コントロールから整数の値を取り出すのに用います。

 AppleScriptでは、テキスト入力された値を元に計算をするようなときは、そのまま値を計算で使うことができました。が、その場合は常に「数にとして扱えないテキストが入力される心配」がありました。この例でも、NSTextFieldに数字以外のものが入力されたらどうなるか?といったことを(通常ならば)考えないといけません。

 そこでCocoaでは、「テキストとして値を取り出す」「整数として値を取り出す」「実数として値を取り出す」・・というように、さまざまな種類の値を取り出すための属性をコントロール自身にもたせてしまったのです。このinteger valueを使えば、「数字以外の値が書き込まれた場合の処理」など考える必要はありません(その場合には値は0として扱われます)。

 同様のものとしては、実数の値を取り出す「double value」というものもあります。「string value」「integer value」「double value」——この3つを覚えておけば、とりあえずテキスト入力は完璧でしょう。


■display dialogでニョロっと出す

 ここまで、主にdisplay dialogを利用した簡単なスクリプトを作りましたが、このdisplay dialog、従来とちょっと違うことに気づいたでしょうか? 普通、AppleScriptで使っていたdisplay dialogのダイアログは、もっとちっちゃくて貧相な感じのものでしたよね? それが、システムアラートのようなちゃんとしたダイアログになってます。AppleScript Studioでは、display dialogもちょっとだけ変わっているんです。

 変わっているのは表示だけではありません。機能的にも、より「Cocoaっぽい」表示ができるようになっています。例えば、ダイアログシートの表示などもそも1つでしょう。——「シート」というのは、Mac OS Xからサポートになった新しいパネル(アラートやダイアログなど)の表示方式です。ほら、ウィンドウのタイトルバーから「にょろっ」と出てくる、あれですよ。

 この「シート」としてdisplay dialogを表示する方法は実に簡単です。先ほどのリストで、最後のdisplay dialogの行を以下のように修正してみて下さい。

display dialog "合計は、" & total attached to window "win1"

 たったこれだけで、ダイアログがシートとして画面に表示されるようになります。

シートとして表示する


 このように、末尾に「attached to window ○○」という形で、シートとして表示するウィンドウを指定すると、そのウィンドウからにょろっと出てくるようになるのです。

 この他、従来もあったbuttonsやiconといったオプションを併用すれば、かなり柔軟なアラート表示ができるようになります。このへんで、よーくdisplay dialog命令を復習しておきましょう。


■ダイアログを閉じた後の処理

 さて、display dialogでシート表示をした場合、ちょっと注意しておかないといけないことがあります。それは「閉じた後の処理」についてです。

 今までのdisplay dialogでは、ダイアログを閉じた後の処理というのは単にdisplay dialogの後に必要な命令を記述すればよかったのでした。ところがシート表示の場合、事情が変わってきます。attached toでシートとして表示した場合には、display dialogで表示するダイアログは「モーダル」にならないのです。

 モーダルというのは「そこで処理を停止するタイプ」のこと。要するに、表示している間、ずっとスクリプトが待っていて、閉じたら続きを実行するというタイプですね。それに対し、表示しても処理を止めないタイプを「モーダレス」といいます。つまり画面にダイアログを表示すると、そのダイアログはそのままほっといて、どんどん先へと処理を進めてしまうわけですね。

 シート表示したダイアログは、モーダレスになるのです。ということは、display dialogの後に何か命令を書いておくと、ウィンドウにシートを表示したら、さっさと続きの命令を実行してしまうため、「閉じた後の処理」にはならなくなってしまいます。「表示している間も背後でせっせこ実行する」ことになっちゃうんですね。

 では、「シートを閉じたら何か処理する」という場合はどうするか。これは、従来と考え方を変えないといけません。「ダイアログを閉じたイベント」というのを利用して、別のイベントハンドラの形で処理を用意しておくのです。これは、取り付けた(attached toした)ウィンドウにある「dialog ended」というイベントとして用意されています。

 では、先ほどのプロジェクトで、MainMenu.nibを開き、Interface Builderでウィンドウを選択してください。Nibファイルウィンドウの「Instances」タブにある「Window」が、ウィンドウを示す部品となります。そして、InfoウィンドウをAppleScriptの設定に切り替え、「dialog ended」チェックとスクリプトファイルのチェックをONにします。

dialog endedイベントをONに


 これで、Project Builderに戻ると、スクリプトファイルに「on dialog ended theObject with reply withReply」というイベントハンドラが追加されます。後は、ここに以下のようにスクリプトを追加すれば完了です。

on dialog ended theObject with reply withReply
set ans to button returned of withReply
set ans to "あなたは「" & ans & "」を選んだ。"
set contents of text field "text1" of window "win1" to ans
end dialog ended


 修正が終ったら、ビルド&実行してみましょう。そしてボタンをクリックし、ダイアログシートを表示します。それからボタンをクリックしてシートを閉じると、フィールドに選んだボタン名が出力されます。

選択したボタンを表示する


 ここで使ったdialog endedイベントハンドラは、そのウィンドウにattached toされたダイアログが閉じた際に呼び出されるものです。これには「theObject」というものの後に「withReply」というパラメータが用意されています。これは、ダイアログを閉じた際のresultが渡されると考えて下さい。

 display dialogは、resultの値として閉じたダイアログの状態に関する値を渡すようになっていました。この「rsultで渡される値」が、withReplyで返されるものだ、と考えるとよいでしょう。display dialogでは、「button returned of result」や「text returned of result」でダイアログに入力したテキストやクリックしたボタンを得ることができました。まったく同じ感覚で、withReplyの値を利用できるわけですね。


■theObjectパラメータとは?

 そうなると、「もう一方のtheObjectってパラメータは何だ?」とという疑問が湧いてきます。考えてみれば、その前に使ったclickedイベントハンドラも、「on clicked theObject」というようにtheObjectパラメータがついてきました。どうやら、このtheObjectというのは「イベントハンドラすべてに共通するパラメータ」らしく思えます。

 実をいえば、これは「イベントが発生したコントロール」を示すものなのです。——つい勘違いしてしまうのですが、AppleScript Studioでは、イベントハンドラは1つのコントロールの1つのイベントごとに独立したものが割り当てられるわけではありません。どのコントロールで使っても、同じイベントはすべて同じイベントハンドラを呼び出します。つまり、ボタンだろうがチェックボックスだろうが何だろうが、クリックしたらすべて「clicked」イベントが呼び出されるのです。従って、イベントハンドラ内で「どのコントロールでイベントが発生したのか」を調べ、それによって処理を分けるようなことをしなくてはいけません。

 そのために用いられるのが、このtheObjectなのです。theObjectはイベントが発生したオブジェクトを示すものですから、この属性などを調べることでどのコントロールか特定できます。例えば、InfoウィンドウのAppleScriptで名前として設定したものは「name」というプロパティで得られます。

 これを利用し、「if name of theObject is ○○ then・・」というようにしてコントロールごとに異なる処理を呼び出すようにすれば、1つのイベントハンドラでいくつものコントロールのイベント処理を組み込むことができる、というわけです。

 このtheObjectは、イベントハンドラのもっとも基本となるパラメータですから、どういうものか、どういう使い方ができるか、その基礎は頭に入れておきたいですね。

 

GO NEXT


GO HOME