GO BACK

AppleScript Studio教室 その6

「数量を扱うコントロール」



■数量を示すコントロールとは?

 コントロールというのは、だいたいユーザーから何かを入力してもらうために用意するものです。今まで登場したNSTextFieldやNSTextViewは「テキストを入力してもらう」ものでしたし、チェックボックスやラジオボタンは「どれを選ぶかを入力してもらうもの」でした。

 ユーザーからの入力は、以上の「テキスト」「選択項目」の他にもう1つあります。それは「数量」です。もちろん、数字をテキストとして入力してもらうこともできますが、もっと視覚的に「このぐらい」という感じで数量を入力させたい場合もあります。こうした場合に用いられるのが「スライダー」や「ステッパー」というものです。また数量をユーザーに示すのに用いるものとして「プログレスバー」というものもあります。

数量コントロール


 これらは、Interface Builderのパレットでは左から三番目の「Other Cocoa views」というところにまとめてあります。縦横の細長いスライドボタン(4つあります)が「スライダー(NSSlider)」、その下の細長い床屋の看板みたいなの(と、10.2では右となりの時計の文字盤みたいなの)が「プログレスバー(NSProgressIndicator)」、そして右下の上下の三角マークが表示されている小さな部品が「ステッパー(NSStepper)」です。これらの特徴をざっと整理すると以下のようになります。

 これらは、いくつかのアトリビュートを設定して使います。ざっと主なものを整理しておきましょう。

●3つに共通する基本アトリビュート●
Minimum (value) ——最小値。
Maximum (value) ——最大値。
Current value ——現在の値。(NSProgressIndicatorでは表示されない)

●NSSlider独自のアトリビュート●
Continuous ——ドラッグ中もイベントが発生するか。(後で説明)
・MarkerのNumber ——ここに数字を入れると、その数だけマーカー(目盛り)を表示する。
Marker Values Only ——ONにすると、マーカーの位置に強制的に設定されるようになる。

●NSProgressIndicator独自のアトリビュート●
Intermediate ——床屋のぐるぐる看板表示にする。
Display when Stopped ——停止したら非表示にする。(10.2のみ)
BarStyle/SpinningStyle ——バー表示か文字盤表示か。(10.2のみ。うまく動かん)

●NSStepper独自のアトリビュート●
Increment Amount ——値の増減値。
Value wraps ——最小値と最大値をつなげてエンドレスに表示する。
Autorepeats ——押しっぱなしにすると連続して値を増減する。


 とりあえず、Minimum/Maximum/Current Valueの3つは必ず設定する、と考えましょう。後は、より使いやすくするための便利機能みたいなものですから、わからなければまったく触る必要はありません。


■値の表示はノンプログラミング!

 これらは、数量を設定するものではありますが、これ自身に「現在の値」を表示する機能はありません。まぁ、スライダーなどはノブの位置で大体の値はわかりますが、ステッパーなどは現在の値がいくつかまったくわからなくなってしまいます。

 こうした場合、現在の値をテキストフィールドなどに表示させておくのが一般的です。これは、もちろんスクリプトを使って行なうことも可能ですが、Interface Builderの機能を使ってノンプログラミングで行なうことも可能です。——Cocoaでは「接続」といって、部品内にあらかじめ用意されている機能と部品のアクション(イベントですね)を接続することで、「このアクションが起こったらこの機能を実行する」ということを設定できるようになっています。これを利用すれば、ノンプログラミングで値を表示できるのです。例として、NSSliderの値をNSTextFieldに表示させましょう。

  1. Interface Builderで、デザインウィンドウにNSSliderとNSTextFieldを1つずつ配置します。適当にアトリビュートを設定しておいて下さい。
  2. NSSliderから、Ctrlキーを押したままドラッグを開始します。すると、クモの糸みたいに淡い紫の線がNSSliderからマウスポインタまで延びてきます。この状態のまま、NSTextFieldまでマウスを移動し、ドロップ(つまりマウスボタンを離す)して下さい。
  3. Infoウィンドウの表示が「Connections」に自動的に変わり、「Outlets」の「target」が選択されます。ここで、右となりの「Actions」エリアから「takeIntValueFrom:」という項目を選択し、「Connect」ボタンを押して下さい。NSSliderとNSTextFieldが接続されます。

NSSliderを接続する


 これで何が起こったのか?というと、「takeIntValueFrom」という機能を使って、NSSliderからNSTextFieldに値が渡され設定されるようになった、というわけなのです。実際に、Interface Builderの「File」メニューにある「Test Interface」を選んで、インターフェイスのテストをしてみて下さい。スライダーを動かすと、値がテキストフィールドに表示されますよ。


■スライダーで常駐アプリ?


 では、簡単なサンプルを作ってみましょう。またUNIXコマンド君に登場してもらいます。今回は「現在のプロセス状況をリアルタイムに表示する」というアプリを作ってみましょう。これはUNIXコマンドの「ps」というものを利用します。またアプリの方は、一定間隔ごとに実行される「idleイベント」というのを使ってみましょう。

  1. 新規プロジェクトを用意したら、Interface Builderを開いて部品を作成していきましょう。今回は、計3つの部品を作成します。
  2. まずはNSSliderです。これは作成後、以下のようにアトリビュートを設定しておきます。
    1. Minimum:1
    2. Maximum:60
    3. Current value:15
    4. Continuous:ON
    5. AppleScriptの名前:slider1
  3. 次は、NSTextFieldです。これは作成後、AppleScriptの名前として「text1」と設定しておきます。他のアトリビュートはそのままでいいでしょう。
  4. 最後は、NSTextViewです。前回使った、長いテキストを表示するものですね。これは少し大きめに配置しておきます。そして以下のように設定しておきましょう。
    1. フォント:「Font」メニューで等幅フォントに設定しておく。
    2. 外側のNSScrollViewのAppleScript名前:scroll1
    3. 内側のNSTextViewのAppleScript名前:textview1
  5. これで部品の配置は終わりです。最後にNibファイルウィンドウの「Window」を選択し、AppleScriptの名前を「win1」と設定しておきます。
  6. 接続を使って、NSSliderの値をNSTextFieldに表示するようにしておきましょう。NSSliderからNSTextFieldまでCtrlキーを押したままドラッグ&ドロップし、Infoウィンドウの「Connections」にある<target><takeIntValueFrom>を選択してConnectします。
  7. 最後にAppleScriptのイベントを設定します。今回は、Nibファイルウィンドウにある「File's Owner」というアイコンを選択して下さい。そしてInfoウィンドウの「AppleScript」の画面で、イベントの「Application」項目内にある「Idle」というのを探してONにします。(同時に、スクリプトファイルもONにしておきます)

IdleイベントをONに


 これで、Interface Builderでの作業は完了です。今回は、File's OwnerのIdleというイベントを使っています。このFile's Ownerというのは、そのNibファイルの所有者を示すもので、一般のアプリケーションの場合、「NSApplication」というアプリケーション自身を示すものが設定されています。要するにここでは「File's Ownerは、アプリケーション自身のことだ」と考えてください。

 このアプリケーション自身の「idle」イベントは、何もスクリプトが発生していないときに一定間隔で呼び出されるイベントです。ユーザーが操作しなくとも常にスクリプトを実行して何かの処理を行なわせる、いわば「常駐スクリプト」を作るのに用いるものです。

 では、Project Builderに戻り、以下のようにidleハンドラを記述しましょう。これで完成です。


on idle theObject
tell window "win1"
do shell script "ps crx"
set contents of text view "textview1" of scroll view "scroll1" to result
set n to integer value of slider "slider1"
end tell
return n
end idle


 これでOKです。プロジェクトをビルド&実行してみて下さい。現在動作中の(現在のユーザーが起動した)プロセスが、CPUの消費量の大きい順に表示されます。スライダーをドラッグして呼び出し間隔を変更すると、その秒数ごとに表示は更新されるようになります。数秒間隔にすると、リアルタイムにプロセスの並び順が変化して、なんか「コンピュータを使ってるなぁ」という気分がします(笑)。

 また、NSSliderのContinuousをONにしておくと、ドラッグ中もリアルタイムにテキストフィールドの値が変わりますが、OFFにしておくとドラッグ中は値は変わらず、離した時に値が変更されるようになります。Continuousで、ドラッグ中も常にイベントが発生するようになっているのですね。


プロセスを表示する


 ここでは、「ps crx」というものを実行しています。psコマンドはいろいろとオプションがあるのですが、まぁこれは要するに「現在のユーザーで起動されたプロセスをCPU消費量順に出力する」ものだ、と考えて下さい。

 そして、idleの最後に、以下のようにしてNSSliderの値を調べているのがわかります。
	set n to integer value of slider "slider1"
 NSSliderの現在の値は「current value」というアトリビュートで設定しましたが、値は他のコントロールと同じく「integer value」で取り出すことができるんですね。つい、「current valueという属性があるに違いない」なんて考えてしまいますが、そうではありません。コントロールはどんなものでも「integer value」や「string value」で値を取り出すのが基本なのです。

 そうして取り出した値を、最後に「return」というもので返しています。これはidleイベントハンドラ特有のもので、ここでreturnした秒数が経過したら、またidleイベントが呼び出されるようになっているのです。つまり、最後にreturnする値によって、呼び出される間隔が設定できるのですね。

 数量関係のコントロールは、現在の値の表示は接続を使って簡単に行なえますし、現在の値を得るのもinteger valueで簡単にできます。非常に使いやすいコントロールといえます。また「クリックした時に独自に処理を付け足したい」という場合には、「action」というイベントが用意されており、これを使って処理を組み込めます。acitonは、今まで使ったclickedとほとんど同じものと考えていいでしょう。ですから、使い方に悩むことはないと思います。



GO NEXT


GO HOME