RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/074/
INDEXに戻る

DoRbScript:パート IV

今回は、DoRbScriptの動作テストを行います。RbScriptに送信してその応答を示すAppleScriptを書くことによって、それが動作するかを確認します。

DoRbScriptアプリケーションの作成

AppleScriptを書き始める前に、それと対話するためのプログラムが必要です。REALbasic IDEの内部ではAppleScript対応であるかはテストすることができません――そこでDoRbScriptをスタンドアローン・アプリケーションとしてコンパイルする必要があります。

それをする前に、DoRbScriptに特定の四文字からなるCreator型を与えなければなりません。そのCreatorコードによって、AppleScriptはどのアプリケーションと対話するかを判断します。同じCreator型(すなわち"????"の初期設定)を複数のプログラムが持つと、AppleScriptは正しいプログラムと対話できない可能性があります。プログラムを作成するときは、(他のプログラムが同文字の組み合わせを使用しない様に)Appleに各自のCreatorコードを登録しましょう。(これがIDE内部でアプリと対話できない別の理由です。つまり我々は、我々のプログラムではなくて、IDEと対話するのです。)

REALbasic内でDoRbScript.rbプロジェクトを開いてください。そしてFileメニューの"Build Settings"コマンドを選択してください。Mac OS XまたはClassicに対応のどちらでも問題ありませんが、アプリに正しいCreator型を与える必要があります。私はAppleに"DoRb"(大小文字は重要です)を登録したので、それは安心して使用することができます(これ以外のプログラムに使われることはありません)。

Creator型を設定したら、コンパイルの準備は整いました。"Build Settings"設定を保存するためにOKをクリックしてください。そして、Fileメニューから"Build Application"を選択します。ClassicかMac OS X(または両方)の実行形式ができるでしょう。

では、プログラムを実行(ダブルクリック)してください。ただそこにあるだけで、何も動いていないように見えるでしょう。それでいいのです。それでは、AppleScriptを書き始めましょう!

AppleScript対応をテストする

AppleScriptを書くには、Script Editor(OSをインストールしたときに含まれているはずです――見つからない場合は検索してください)を立ち上げる必要があります。以前にScript Editorを使ったことがなくても、心配は要りません。それは、AppleScriptを実行するためのRunコマンドのあるシンプルなテキスト・エディタです。REALbasicのCode Editorとよく似ています:

それではテストのため、簡単なAppleScriptを書き、プログラムが動作するか確認しましょう。Script Editorに次を入力してください。

 tell application "DoRBScript (Mac OS X)" 
copy |DoRBScript|("print str(5 + 3)") to theThing
end tell

display dialog "The result is " & theThing

重要事項:私の用いたアプリケーションの名前に注目してください。あなたがこの前にコンパイルしたアプリの名前がこれと違うとき、あなたの用いた名前と合わせるために、引用符で囲まれた部分の名前を変更する必要があります。

このコードを入力したら、"Simple Script"(または他の名前)としてスクリプトを保存し、それを実行("Run"ボタンをクリック)しましょう。下に表示されているようなダイアログがすぐに確認できるでしょう。

やりました!動いてます!これはDoRBScriptプログラムとの対話が成功し、処理をして結果を返すRbScriptコマンドをうまく渡したことを示しています。

(もし動作しない場合、AppleScriptかDoRBScriptにエラーがないか調べる必要があります。それは込み入った話になるので、私はここではその話には立ち入りません。完成済みのプロジェクトをダウンロードして、間違えがどこにあるのか、あなたのものと見比べてみるとよいかもしれません。)

このAppleScriptは何をしているのでしょうか?

まず始めに、"tell"でコマンドを囲ったことに気がつくでしょう。tell命令文は、AppleScriptと特定アプリケーションとの対話形式です。例えば、Finder(スクリプト対応のアプリ)はDoRBScriptコマンドを理解できません。しかし、AppleScriptにそのコマンドを具体的に"DoRBScript (Mac OS X)"に送るよう伝えることで、コマンドを理解するプログラムによってそのコマンドが翻訳されます。

tell文中では、DoRBScriptコマンドの結果をtheThingと呼ばれる変数に送るために、"copy to"コマンドを使用します。

DoRBScriptコマンド自体が、もっとも面白いものです。我々がaeteリソースを設定するとき、DoRBScriptコマンドはテキスト・パラメータを受け取り、テキスト値を返すように設定したことを覚えていますか?そうです。ここではそれを単なるテキスト・パラメータとして渡しているだけです。

"print str(5 + 3)"

これはとても簡単なRbScriptです。我々の結果は、printコマンドで渡されたものだけなので、このように単純なスクリプトと一緒にprint命令を含めなければ結果を確認できません!我々の計算問題では数値を扱い、その結果はテキストでなければならないので、強制的に5+3の計算結果をstr()関数で文字列に変換します。その結果は"print"されます――それはAppleScriptに返されたものです(theThingに保存されています)。

スクリプトの最終行は、結果を示すダイアログを表示します。

しかし一行だけのRbScriptでは有用ではありません。さらに使いやすくするには、どうすればよいでしょうか?

AppleScriptの試作品

DoRBScriptへ送信するRbScriptを作成するには、2つの方法があります。簡単な方法は、次のようにそれをScript Editorで書くことです。

ご覧のように、文字列変数のrbに、1行ずつスクリプトを追加していきます。結果的に、rbは全てのスクリプトを保持しています。上記の"return"は、リターン記号を表すAppleScript用語だということに気をつけてください。(REALbasicプログラムでchr(13)を使うよりは易しいでしょう)

上記のスクリプトは画像なので、テキストとしてコピーすることはできません。次に生コードを示します(私のソースコードの表示システムがRBコードに設定されているので、これはAppleScriptとしては正しく表示されないことに注意しましょう)。

 -- Build the script 
set rb to "dim i, n as integer" & return
set rb to rb & "for i = 1 to 1000" & return
set rb to rb & "n = n + i" & return
set rb to rb & "next" & return
set rb to rb & "print str(n)" & return

-- Execute the script
tell application "DoRBScript (Mac OS X)"
copy |DoRBScript|(rb) to theThing
end tell

display dialog "The result is " & theThing

すべて正確に入力し終えたら、Runを押すと次のような結果が表示されるでしょう。

お分かりのように、これはさらに複雑な例題です。要するに変数を確保して(dim文)、for-nextループを使用しました。大変すばらしい!RbScriptはかなりの能力があり、それを試すためには面白い方法です。AppleScriptの能力を拡張するための簡単な方法として、DoRBScriptを使用することができます。

さらにRbScriptを強力に(すなわち、より長く、より複雑に)するために、AppleScriptにテキスト・ファイルからスクリプトを読み込ませることができます。それは長々と"set rb to rb &..."命令文を連ねるよりは、もっと楽でしょう。しかし、それは宿題としておきますので自分で考えてみて下さい。(AppleScriptについてさらに知りたい場合は、O'Reilly社から優れたチュートリアルであるAppleScript in a Nutshellが出版されています。)

今週のチュートリアルの完全なREALbasicプロジェクト(AppleScriptとその他のリソースを含む)を手に入れたい場合は、ここからダウンロードしてください。

次週

新刊本Learning REALbasic Through Applicationsをレビューします。〔rbu-jは、rbu076のOOP Universityになります〕

Letters

今週はValerieさんから、ソーティングについての質問を頂きました。

こんにちは!

私はRBの初心者で、いままであなたのコラムにはたくさん助けていただきました。私はまだすべてに目を通したわけではないので、質問の答えはもしかしたらコラムのどこかにあるかもしれません。けれども、とりあえず質問します。

私はlistboxの2列目のコラムをソートしようとしています。私はlistbox.column(1).headingIndex=0と、.sortと、columnSortDirectionを試しましたが、どれも機能しないようです。

よろしくお願いします!
Valerie

Valerieさん、あなたがどのバージョンのREALbasicを使っているのか書いてありませんよ。バージョン4.5では、少し変更が加えられました。あなたは.headingIndex属性を使おうとしていますが、今後はpressHeaderメソッドを使用しましょう。

 listBox1.pressHeader(1) 

私はデモ用に簡単なプロジェクトを作成しました。

2列目のコラムでソートする方法は2つあります。最初は、ユーザが2列目のヘッダーをクリックすると、自動的にソートされます。もう一度クリックすると、逆順にソートします:

けれども、あなたはプログラム的に(コードを用いて)それをソートしたいようですね。それも簡単にできますよ。次は"2列目のコラムでのソート"ボタンのコードです:

 listBox1.pressHeader(1) 

しかし、さらに手を加えることができます。ソートの方向を制御したい場合はどうでしょう?それは、listBox1.columnSortDirection属性で設定できます。私は、ソートの方向を逆順にする"toggle sort dir"ボタンをプロジェクトに追加しました。ここにそのコードを示します:

   if listBox1.columnSortDirection(1) = 1 then 
listBox1.columnSortDirection(1) = -1
else
listBox1.columnSortDirection(1) = 1
end if

// トグル後は、自動的に再ソートされるので
// ユーザは何が起こったのか確認できます
sortButton.push

listBox1.columnSortDirection属性は、現在どの列をソートしているかを伝えるパラメータが必要なことに注意しましょう。この場合、それはコラム1(2列目)です。

これで疑問点が明らかになったことと思います。私のデモ・プロジェクトはここからダウンロードできます。


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る