RealBasic University

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

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

DoRbScript:パート I

今週のプロジェクトは、次のNaveenさんからの一風変わった質問から生まれました。

こんにちは

私はrealbasicとapplescriptについての質問があります。私はapplescriptからrbファイル(実行ファイル)を実行して、rbファイルはスクリプトに対して論理値だけを渡して終了させたいのです。これと反対のこと(realbasicからapplescriptを実行して、返された値を受け取る)はできます。rbscriptを使って、これと同じことはできるでしょうか。私はrbscriptをどのように作成して、それをどうやって使ったらよいか分かりません。

これについて、何か提案はないものでしょうか?

どうぞよろしくお願いいたします。

それでは

Naveen.

REALbasicはAppleScriptよりも強力なプログラミング環境を持っているので、ほとんどの人はあなたのしようとしていることと反対のことをしようと思います。よって、たいていはREALbasicを基本アプリケーションとして、AppleScriptはその補助ツールとして使用します。あまり見かけない例ですが、あなたのやりたいことはそれと反対です。

耳寄りな話は、それが可能だということです。ただそれはあなたの思っている以上に複雑になるかもしれません。まずこれに取り掛かるには、スクリプトで記述できるREALbasicのプログラムを作成することでしょう。AppleScriptのAppleイベント経由で、それをあるコマンドで送れば、あなたのプログラムは相応の反応をして、望む値を返してくれます。

さらによい方法は、あなたの提案するようにRBScriptを使うことです。そのスクリプトをプログラムに渡すことで、それをコンパイルして実行し、AppleScriptに結果を返してくれます。では、これはどうすれば可能でしょうか?

まあ、これはそれほど難しくありません。実際、私はこれをするためにわずか数分のうちにプログラムを書きました!それをDoRBScriptと命名して、次のプロジェクトにします。これをすることで、RbScriptの学習と併せて、スクリプトで記述可能なアプリケーションをどのように作成するかを学習しましょう。

RbScriptとは何か?

DoRBScriptを始める前に、RbScriptについて見ていきましょう。あなたのうちの何人かは、RbScriptとは何だろうか疑問に思っているかもしれません――それはREALbasicのあまり宣伝されていない機能です。

RbScriptはREALbasic構文のコードです。おそらく、あなた方はすでにREALbasicが理解できるコードをどのように記述するのか慣れ親しんでいるので、それは扱いやすいでしょう。しかし、通常のREALbasicコードとRbScriptとの主な違いは、RbScriptはアプリケーションの実行中に処理したり実行したりできるという点です。

普通、REALbasicでコードを記述すると、そのコードはコンパイルされてマシン語に変換され、ハードディスクにコンパイル済みのアプリケーションとして保存されます。一度マシン語に変換されれば、それはもうすでにREALbasic構文のフォーマットではなくなっているので、簡単には手を加えることはできません。

しかし、もしあなたがユーザ(あるいはあなた自身)のために大急ぎでプログラムに修正を加えたいとしたら、どうしたらよいでしょうか?例えば、こんにちの多くのプログラムでは、プログラムの可能性を広げるために"プラグイン"を使用します。プラグインは、メインのプログラムとは独立して追加したり、または削除したりできる小さな部品です。全く新しいバージョンのプログラムをリリースするよりは、小さなプラグインを修正するほうが簡単なので、プログラマーはそれが気に入っています。プログラムに必要な機能だけを追加することができるので、ユーザはプラグインが気に入っています。プラグインはサード・パーティによって書かれることもあるし、ユーザ自身が書くこともあります。

REALbasicのプログラマーにとって、プラグイン・システムはREALbasicで書かれたプラグインを扱えるべきでしょう。それがRbScriptのベストな使用方法のうちのひとつです。RbScriptはただのコードです――あなたがコードを実行するようにプログラムを設定すれば、ちょうどプラグインを追加するように、ユーザはそのコードを変更したり、新しいコードを追加したりなどすることができます。

RbScriptでコードを記述することは、通常のRBプログラミングとは少し違っています。普通RBでは、コードはあらゆる場所に置かれていて、アプリケーションのインターフェースと密接に関連付けられています(すなわち、pushButtonのコードは、pushButtonの中に入っています)。また、あるREALbasicの機能はRbScriptでは利用することができません。

RbScriptでは、すべてのコードは1つのスクリプトで記述されています。メソッドやそのようなものを作成することはできますが、それ独自のメソッド・ボックスの中には存在しません。同じことがカスタムクラスについても言えます。つまりRbScriptは、カスタムクラスのオブジェクトのプロジェクト・ウィンドウにアクセスすることができません。また、コードはどんなインターフェースのオブジェクトからも独立しています――例えば、あなたはpushButtonを持つウィンドウを作ることはできません。これらの違いは、REALbasicのやり方に慣れてしまったら紛らわしいものかもしれません。

データをRbScriptへ入出力する方法にもまた違いがあります。RbScriptはインターフェースを持たないということを覚えておいてください。しかし、スクリプトと実行中のプログラムとの間で、情報をやりとりする必要が出てくるでしょう。それは、inputprintという2つの新しいRbScriptイベントで解決することができます。

スクリプトで、プログラムから情報を取り出す必要が出たときには、printコマンドを使用します。それは実行中のプログラムが処理できるRbScriptオブジェクトのprintイベントを呼び出します。

スクリプトへデータを取り入れるためには、RbScriptオブジェクトのinputイベントを実行するinputコマンドを使用します。inputコマンドはどのような種類のデータを取り入れたいのかをinputイベントに伝えるために使われる文字列パラメータがあります。

inputprintコマンドは、実行中のプログラムとRbScriptの間を取り持つメッセージ・システムとして機能します。

ここに2つの数を加えるとても簡単なRbScriptの例を紹介します。スクリプトは数がいくつだか分からないことに注意してください。つまりそれは実行中のプログラムから手に入れます。そして実行中のプログラムはユーザ、データファイル、あるいはその他のものからそれらの数を入手します。スクリプトはデータ入力に関して気にしません。

 dim a, b as integer 

a = val(input("First number:"))
b = val(input("Second number:"))

print str(a) + " + " + str(b) + " = " + str(a + b)

printinputの両方ともデータフォーマットとして文字列(string)を使用するので、その結果を使用するためにはテキスト、あるいは数値に変換(val()str()関数)しなければなりません。

例として、上記のRbScriptを取り上げ、それを簡単なREALbasicプロジェクト(ここからダウンロード)の中に置きます。次はその実行中の様子です。

REALbasicのプログラムは、ただeditFieldにあるデータをスクリプトに渡して、そのスクリプトの応答を結果のstaticTextに入力します。

例えば、ここにinputイベントのコードがあります。

   select case prompt 
case "First number:"
return nField(0).text
case "Second number:"
return nField(1).text
end select

これは、どちらの数が要求されているか(1番目または2番目)に基づいて、適切なeditFieldテキストを返します。お分かりのように、これはこの構文解析ルーチンの変更によるだけで、あらゆる種類の情報要求に対処することができるでしょう。

printイベントは、resultと呼ばれるstaticTextへ結果をただ出力するだけです。

 result.text = msg 

われわれは、別のスクリプトに処理を置くことによって、データに起こることを完全に分けてしまったことに注意してください。このプログラムを拡張したい場合は、テキストファイルからRbScriptを読み込むことができます。ここでそれぞれのテキストファイル(スクリプト)は、データに対して異なる処理(足し算、掛け算、割り算など)をすることができるでしょう。

実際にそれを行ってみましょう。私は足し算、割り算、掛け算、そして引き算のスクリプトのフォルダーを作成しました。私はそれからこれらのスクリプトを読み出すpopupMenuを追加したので、ユーザはポップアップからどのスクリプトを実行するのか選択することができます。

ここにpopupMenu1Openイベントがあります。

   dim f as folderItem 
dim i as integer

f = getFolderItem("").child("scripts")
if f <> nil then
for i = 1 to f.count
// "icon"や".DS_Store"が読み込まれないように
// 可視属性をチェックします
if f.item(i).visible then
if loadFile(f.item(i)) then
// filenameをメニューに追加
me.addRow f.item(i).name
end if
end if // visible
next // i

// デフォルトとしてそれを始めのスクリプトに設定する
me.listIndex = 0
else
beep
msgBox "Couldn't find a scripts folder!"
end if

まず始めに、これはスクリプト・フォルダーを探し出します。それからそのフォルダーの中のファイルをそれぞれ確認し、それをテキストファイル(スクリプト)として読み出そうとします。成功(それがテキストファイル)すれば、ファイルの名前をpopupMenu1に追加します。

loadFileルーチンは、渡されたファイルを単にテキストファイルとして読み出します:

   dim in as textInputStream 

in = f.openAsTextFile
if in = nil then
return false
end if

// スクリプトを保存
scripts.append in.readAll
in.close
return true

ここで一番重要なことは、文字列の配列であるscriptsと呼ばれるウィンドウ属性を手に入れたということです。このルーチンは、ファイルから読み出されたテキストのすべてを、配列の新しい項目へ追加します(カギはscripts.append in.readAllの行です)。読み込んだものを前もって配列に入れておく利点は、その方がよりシンプルになるからです。

例えば、ユーザがポップアップから異なるスクリプトを選択するとき、次を実行します(これはpopupMenu1Changeイベントです)。

   if me.listIndex > -1 then 
// ユーザ変更スクリプト:rbScript1へそれをロードする
rbScript1.Source = scripts(me.listIndex)
end if

ここでわれわれが行っていることは、保存されたスクリプト(scripts配列の中)のテキストをrbScript1オブジェクトへ渡しています。これは、rbScript1がどのコードを実行するのかについてを変更します。scripts配列のインデックスがpopupMenu1listIndexと一致するので、インデックスとしてちょうどme.listIndexを使うことができます。

このアプローチの不便なところは、スクリプトフォルダーの内容が、プログラムが立ち上げられたときだけにしか読み込まれないということです。すなわち、よりよいアプローチは、プログラムの実行中にユーザが新しいスクリプトを追加した場合に備えて、プログラムが最前面に動かされたときはつねにpopupMenuを更新するようにすることでしょう。

いったんスクリプトが読み出されれば、ユーザはポップアップメニューからスクリプトを選択でき、ユーザが"Go"ボタンをクリックすると適切なスクリプトが実行されます。

とてもすばらしいですね!これらのスクリプトができることには、いかなる限界も本当にありません。つまりもっと複雑な計算を実行でき、しかもメインのプログラムに全く手を加える必要もありません!しかし、メイン・プログラムはインプットとして2つだけの数しか許可せず、短いテキストの出力のみが仮定されているので、より手の込んだスクリプトをサポートするためにはそれを修正する必要があるでしょう。しかし基本的な原理は同じものです。

このスクリプト・フォルダーを含む、2番目の例題の完全なREALbasicのプロジェクトを手に入れたい場合は、ここからダウンロードしてください。

次週

アプリケーションをどのようにしてスクリプト対応にするかについて学習します!

News

先週、REAL Software社から大ニュースがありました。REALbasicの次期バージョンはMacintoshに加えて、Microsoft Windowsでも動作するようです!

これは、こんにちのMac REALbasicユーザが、Windowsアプリを作成できるのと同じくらい簡単なように、WindowsユーザがMacintoshのアプリケーションを作成できるということを意味します。私はいつかはこうなることを期待していましたが、これが来年の早い時期に起ころうとは驚きです。〔訳注:この記事は2002年10月に発表されたものです〕

Macintoshユーザ(だと思われる)のあなたには、これがどんなことを意味するのか疑問でしょう?

第一に、それはREALbasicがより強力な製品になることを意味します。REAL Software社はMacintoshから完全に足を洗うわけではありません。これは、本当の意味でのクロス・プラットフォーム開発手段となることによって、ただREALbasicの影響力を拡大するだけのことです。それはREAL Softwareの売上げを著しく伸ばすことにつながるでしょう。それはREALbasicを使用するすべてのユーザにとって耳寄りなお知らせです。

私はまた、これはMacintoshにとってもよいことだと信じています。つまりMac OS Xには興味があるけれど、Mac OS XだけのCocoaに投資する気になれないWindows開発者たちは、慣れ親しんだWindows環境で使用でき、Windows、Mac OS、Mac OS Xのアプリケーションを作成することができるのです。これはMacのプログラムがより普及することを意味します。こんにちのWindowsだけに対応のプログラムは、ゆくゆくはクロス・プラットフォームになるでしょう。

ますます多くのMac開発者たちは、プラットフォームの壁に悩むことがなくなるでしょう。この動きは、REALbasic UniversityREALbasic Developerマガジンの読者たちを含むすべての人にとって福音となるでしょう。

REALbasicのWindowsバージョンがどのように動作するのか関心がありますか?REAL Software社はウェブサイトでFAQを掲載していますが、次にいくつかの主な質問についての答えを掲載します。

プロジェクト・ファイルはクロス・プラットフォーム。 プロジェクトをMacまたはWindowsで作成した場合、それを別のプラットフォームに移動して、そこで作業を続けることができます。まさに最高!

プラットフォーム特有の機能をサポート。 Macでは、数多くのJaguarだけの機能が、そしてWindowsでは、Active Xがサポートされるでしょう。それぞれのプラットフォームに作成されたアプリは、部分的にプラットフォームをサポートしていてるだけの不完全なものではなく、そのプラットフォームに完全対応のアプリになるでしょう。

リリース予定は2003年の第一四半期。 REAL Software社から個人的に聞いた話によると、REALbasic 5はMac版が始めに出荷され、そのすぐ後にWindows版が出荷されるようです。将来のバージョンでは、両方のプラットフォーム版が同時に出荷される予定です。

これはREALbasicを使用しているすべてのユーザにとってわくわくするようなお知らせです。あなたがMacのアプリケーションを作るだけで満足しているならば、これはなんの影響もないかもしれません。しかし多くの人々――プログラミングを教えたい学校関係者を含む――にとって、これはREALbasicのユーザが増大し、REALbasicがより実用的なツールとなることを意味します。

Letters

今回はお便りはありません。


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

INDEXに戻る