RealBasic University

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

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

DoRbScript:パート II

前回、私はRbScriptとは何なのか、そしてどのようにRbScriptを使って、プログラムに簡単な動的プラグイン・システムを作成するのかを示しました。

しかし何人かの人は、AppleScriptを使う場合とどのように違うのか疑問に思うかもしれません。今回のプロジェクトであるDoRbScriptを始める前に、AppleScriptとRbScriptの違いを簡単に見ていきましょう。

AppleScriptとRbScriptの比較

AppleScriptとはApple社によって開発された言語で、Appleイベントを通じてプログラムにアクセスするようにデザインされています(AppleイベントはApple社の作成したアプリケーション間の通信システムです。要するに、異なるプログラムがお互いに対話することができる標準規格です) 。AppleScriptは独自の構文を持っていて、その構文はそれぞれのプログラムが独自の動詞や名詞を言語に追加することで拡張することができます。(各プログラムの用語集はDictionaryと呼ばれています。詳しくはまた後ほど。)

AppleScriptはこの拡張性のために柔軟で強力なものになりましたが、同時に、異なるプログラムでは同じコマンドであっても違う振る舞いをするためにややこしくもなりました。例えば、あるプログラムは "third word of the sixth paragraph of the first document"のようなフレーズでよいところが、他のプログラムではエラーになります。一度特定のプログラムのAppleScriptの用法に慣れてしまえば大変便利ですが、そこまで行き着くには相当の努力が必要です。

REALbasicはAppleScriptに正式に対応していて、AppleScriptをプロジェクト・ウィンドウにドラッグすることで、新しいREALbasicコマンドとして追加できます。またRbScriptほどではありませんが、情報を相互にやりとりすることもできます。

AppleScriptの最大の欠点は、REALbasicに追加する唯一の方法がプロジェクト・ファイルへのドラッグということです。つまりプログラムの実行中では新しいスクリプトを追加する方法がありません(理論的には、システムにAppleScriptをコンパイルするよう伝えるOSコールがあるように、OSに生のスクリプトを渡す宣言文を使う代替策もありますが、私はこれを実際にした人がいるのか分かりませんし、何よりも危険で複雑です。)

しかし、コンパイルされたAppleScriptを実行することはできます――それらは小さなアプリケーションで、よく"アプレット"と呼ばれます。それをfolderItem.launchコマンドで実行することができます。よってあなたがプログラムをスクリプト対応にすれば、特定のフォルダーから動的にAppleScriptを追加するスクリプトメニューを作り、ユーザはそのようなスクリプトを自由に追加したり削除したりできるでしょう。それは結局のこと、われわれが前回行ったことにとてもよく似ています。

ほとんどのMacユーザにとって、AppleScriptは標準規格として多くの人がそれに使い慣れているので、AppleScriptによる手法がより理にかなっています。しかしながら、RbScriptはREALbasic言語で記述されているので、AppleScriptを学習する必要なしに、もっと快適にそれを使用することができるでしょう。

またアプリケーションをスクリプト対応にするのは簡単な仕事ではありません。プログラムが何をするかによって、スクリプト対応にするために数十、あるいは数百ものAppleScriptコマンドをサポートすることになります。いくつかのAppleScriptは、REALbasicのAppleイベントの処理方法の制限により、サポートされない可能性があります。仮にRbScriptの方法をとれば、これらの問題については悩む必要がなくなります(もちろんユーザはただあなたのプログラムを拡張するためだけに、RbScriptを学習したいとは思わないかもしれませんが)。

肝心なことは、どちらの方法も他の人があなたのプログラムを外部から変更できる方法であることです。どちらの方法をとるかはあなた次第です。

DoRBScriptプロジェクト

今回作成していくプロジェクトは、AppleScript及びRbScriptの両方を活用するということで一風変わっています。要するに、われわれはRbScriptを実行し結果を返すという、ありきたりのスクリプト対応のプログラムを作成していきます。

これを行うにはいくつかのステップが必要です。

  1. アプリ用にAppleScriptの"dictionary"を作成する
  2. アプリを作成し、渡されたAppleイベントを処理する
  3. プログラムをテストするためにAppleScriptを作成する

"aete"リソースを作成する

まず第一のステップは、プログラムが理解するAppleScript用語の"dictionary"を作成することです。通常これは複雑なステップです。しかし、DoRBScriptは比較的単純なプログラムです。それはひとつの処理(RbScriptの処理)だけ行います。よってわれわれの辞書は、ひとつのコマンドだけを必要とします。

プログラムのAppleScript辞書は、"aete"型(小文字であることに注意)の特別なリソースに保存されています。通常、リソースはApple社のResEditのようなプログラムで編集しますが、残念なことにそれはそのままではaeteリソースの編集をサポートしていません(ResEditにaeteリソースを編集できるようにする拡張プログラムがありますが、サポートがなく理想的ではありません)。

あるいは256ドル支払えばResorcerer、何でも(aete編集も)することができるある種のスーパーResEditを手に入れられます。しかしもっと安く済ませたいようならば、フリーのEightyRezをダウンロードしてください。EightyRezはaeteリソース以外の編集はできないので、一般のリソース・エディタではありませんが、aeteリソースに関してはとても使いやすいです。またこれはClassic(Mac OS)版でのみ利用できます。しかし毎日のようにaeteリソースを編集するわけではないので、Resorcererを購入する余裕ができるまでの便利な代替品として利用できます。例ではEightyRezを使用しています。

EightyRezは言うまでもなく"必要最小限"のインターフェースしかありません。それを立ち上げ、ファイルメニューから"New"を選択してください。これで次のようなウィンドウが表示されるでしょう。

これらが何を意味しているのか、私にはさっぱり分かりません。冗談です!

本当のところ、aeteリソースを編集することはとても複雑で、ここで詳細を述べるにはあまりにも荷が重過ぎます。どのようにアプリをスクリプト対応にするかについて、Matt Neuburg氏の本のようないくつかの優れた参考文献があります。REALbasic Developerマガジンでは、このような題材をカバーする定期的なAppleScriptのコラムがあります。

今回われわれが行っていくことは、辞書に動詞を追加することです。それをするために、"Events"を選び、エディット・メニューから"New Event"を選択します。現れたブランク・ウィンドウに次のように書き込みます。

これは、追加しているコマンドが"dorb"のid(4文字)を持ち、"misc"クラスのコマンドに属すことを示しています。コマンドの名前は"DoRBScript"です――これがAppleScriptで使用するコマンドです。

"Description"と"Reply desc"の欄は、ただのコメントです――それはコマンドの働きに影響を与えることはありません。しかし"Reply type"と"Direct param Type"の欄は、TEXTに設定しなければなりません。それはAppleScriptに"DoRBScript"コマンドが変数として文字列を要求し、文字列を返すことを伝えています。そうしなければAppleScriptはコマンドがどのように機能するか分からないので、それはとても重要です。

設定が終了したら、それを保存してください。私は自分のものを"dorbscript (aete 0)"と命名しましたが、あなたが何と名前をつけようと、全く問題にはなりません。

aeteリソースにあるすべては、AppleScriptがプログラムの辞書を呼び出すものだと覚えておいてください。あなたのコンピュータにインストールしてあるプログラムのaeteリソースを見てみてください(編集してはいけません。ただ見るだけです)。例えば、Tex-Editというワープロは、優れたスクリプト機能で定評があります。その内部をEightyRezで覗いてみると、次のようなものがあります。

EightyRezの個々のコマンドは次の様になります。

われわれがScriptエディタを立ち上げ、Tex-Editを見るためにOpen Dictionaryコマンドを使用すると、不思議と見慣れたヘルプファイルがあります。

aeteと辞書の関係が確認できましたか?辞書ウィンドウを読むほうがより簡単ですが、基本情報はaeteリソースを編集していたときと同じです。

私はすでにDoRBScriptプロジェクトで使用される完全なaeteファイルを作成しました。プロジェクトはここからダウンロードすることができます。

次週

スクリプト対応のDoRBScriptアプリケーションを作成します。

News

REALbasic Developerマガジンに興味があるけれど、一年間の定期購読に躊躇していませんでしたか?まあ聞いてみてください。新しいBack Issuesフォームで、バックナンバーが一冊から購入できますよ!

それは一冊か二冊試し読みしたり、遅れて定期購読を始めたために見逃したコラムを購入するのには、とても便利な方法です。バックナンバーを注文するには、ただ次のリンクをたどるだけです。http://www.rbdeveloper.com/backissues.

Letters

今週はTansu Onturkさんからいくつかの質問を頂きました。彼は次のように書いています。

Marc Zeedarさんへ

私はグラフィック・デザイナーで、簡単で役に立つRBのプログラムを書くことにも興味があります。私はプログラマーではありませんが、あなたの書いたチュートリアルのレッスンや例題は、読めば理解できます。私はRealBasic Universityのウェブサイトで、RBについてのチュートリアルを読んでいます。そこで、あなたのチュートリアルが私のようなプログラムのバックグラウンドがない人にとって、どれくらい役に立つのかぜひ言わせてください。私は本当に、この情報を作成してくれていることについて、あなたに感謝を述べたいと思っているのです。

私はあなたにいくつか質問があるので、このemailを書いています。まず始めは、私はいまダウンロード・マネジャー・プログラムを書いている(実際はただ書こうと努力しているだけです)のですが、行き詰っています。ListBox内で起こる新しい項目の追加、あるいは削除や修正(項目内のテキストの修正を意味します)のような変化を、どのようにプログラムに伝えて、それからその変化に応じてFileSaveを利用できるようにはどうすればよいのでしょうか?実際私は、CreateBinaryメソッド(これはSaveDialogウィンドウを開き、SaveをクリックするときにRBのFileTypeウィンドウで私が定義したファイルを作成します)を使うことでその項目とともにListBoxを保存することができます。しかし、私はそれに上書きすることができませんでした。そこで、私の二つ目の質問は、(あなたの予想するように)私があるファイルを作成するとき、それに何回も上書できるようにするにはどうしたらよいでしょうか?(作成したファイルに上書きするときに、毎回SaveDialogウィンドウを確認したくないということです)

三番目の質問は、私にはゲーム・エンジンを書くプロジェクトもあります(もちろん、ダウンロード・マネジャーを仕上げたらですが)。そこで、RBでゲーム・エンジンを書くことも可能でしょうか?それを書くために、あなたのチュートリアルのようなもの、あるいはそれと似たようなものを見つけることは可能でしょうか?

そして最後に、あなたが忙しくないときにお手伝いをお願い(ときどきemailで質問をしたり)できるでしょうか?

最終的に、たくさんの質問をすることになってしまったことをお許しください。私はただ好奇心旺盛なのです。だからもしあなたが質問のすべてに答えてくれるならば、私はうれしい限りです。いろいろとありがとうございます。

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

PS:私のプログラムは1つのメイン・ウィンドウと、新しいテキストの追加、テキストの削除等のようなことが行われるListBoxからなります。そしてもちろんそれは3つのコラム(名前、身分、時間)に分かれています。何が行われているのか理解するために、私のプロジェクトの全コードを確認する必要があるならば、それをあなたに送ります。

とてもたくさんの質問ですね!しかしグラフィック・デザイナーの仲間として、プログラミングのような新しい仕事を学習することは、どれほど骨の折れることか良く知っています。これらの質問の内のいくつかを答えさせてもらって、何が分かるのか見てみましょう。

私がもし、正確にあなたの第一番目の問題を理解しているならば、あなたは鍵となる次の二つの問題を抱えています。

  1. listBox内のイベントを検知する(そうして"file save"ボタンを選択可/不可にすることができます)
  2. Save As dialogを毎回表示しないで、存在するバイナリ・ファイルに上書きする

このどちらもとても簡単なものです。しかし前者は、あなたの全コードを見ないことには説明するのはなかなか困難です。けれども私はここでは例題を説明して、そこからあなたのコードにいかに修正を加えればそれと同じに機能するかを学び取れるでしょう。

では、ListBoxを置いて、ListBoxに何が起こるかに応じて"file save"ボタンの状態を変更(選択可または不可)しましょう。私の例題は実際には何も保存しませんが、fileSaveButtonに切り替えます。

これはlistBox1CellActionイベントに次のコードを入力することで機能します。

   if column = 1 then 
// ユーザがコラムを編集したら、ボタンのアップデート
fileSaveButton.enabled = true
label.text = "File not saved yet."
end if

私の例題では、二番目のコラム(コラム1)は袋字編集可能に設定されています。それを編集するためにユーザがセルの内側をクリックすると、変更が加えられたと仮定してfile saveボタンが選択可能になります。

"仮定して"という言葉は――ユーザが実際にデータを変更したかをわざわざ確認したくないからだということに注意してください。とはいえ、どこかにデータを保存して、現在の値と以前の値の比較をすることもできます。値が異なっていれば、ユーザが何か変更を加えたことが分かり、fileSaveButtonの状態に設定することができるでしょう。

また実際のプログラムでは、おそらくあなたはここでメソッドを呼び出し、直接ボタンを修正したくないでしょう。なぜならば、メニュー項目の"保存"のフラグ設定や、ウィンドウのクローズボックスを"変更あり"に設定する(Mac OS Xの場合)ようないくつかのことを処理したいからです。

詳細

Mac OS Xでは、赤いクローズボックス(実際は丸で、四角(ボックス)ではありませんが;-)は現在のドキュメントに修正が加えられて、まだ保存されていないときに、その中に点が示されます。

これはとても使いやすい機能ですが、REALbasicからそれに直接アクセスすることはできません。渡されたウィンドウのクローズボタンに、変更あり(未保存)の印を付けるSetWindowModifiedをはじめ、便利な数多くのMac OS Xシステムコールを含むフリーのCarbon Declare Libraryをダウンロードする必要があります。

この例題のプログラムはここからダウンロードできます。

あなたの次の質問、存在するファイルに上書きすることについては、とても簡単です。ただ保存システムをひとつではなく2つに分割するだけです。始めのメソッドは"save as"メソッドです。それはfolderIdemをSave Asダイアログから設定します。2番目のメソッドはそのfolderItemを用いて、そのファイルへ保存します。

これらの例では、theFile as folderItemのウィンドウ属性を持つことに注意してください。

SaveAsメソッドは次のようになります:

   dim f as folderItem 

f = getSaveFolderItem("", "The File Name")
if f <> nil then
theFile = f
save(theFile)
end if

ユーザがSaveAsルーチンでキャンセルを選択したら、theFileは決して設定されないことに注意してください。それはこのルーチンを実際の"Save As"コマンドとして使用するときには重要なことです。なぜなら、仮にユーザが心変わりしてキャンセルした場合、あなたは現在のドキュメントのfolderItemをnilに設定したくないでしょう。だから、その応答を一時変数fに設定して、ユーザが新しいファイルを選択したことが確かな場合にのみ、theFile属性を設定します。

Saveメソッド(パラメータとしてf as folderItemを持つ)は次のようになります:

   if f <> nil then 

//ファイルに保存するものをここに置く

end if

さて、古いファイルに上書きすることについてまだ疑問があるようなら、それについてはもう心配する必要はありません。データはメモリーに保存されている(ListBoxにロードされているか、どこかに保存されている)と思われるので、あなたがしなければならないことは、通常行う方法でディスク上にそのファイルを最初から再び作り直す(.CreateTextFileあるいは.CreateBinaryFileメソッドを使用して)だけです。それで古いファイルに上書きして、現在のデータを保存するでしょう。

ゲーム・エンジンの質問に関しては、Googleでrealbasic "game engine"(引用符は重要です)と検索して、数百のヒット件数がありました。REALbasicで作成されたいくつかのゲーム・エンジンや、REALbasicでゲームが作成できるようになるその他のゲーム・エンジンがあります。あなたも自分で検索をしてみて、特に自分のプロジェクトに似ているものがあるか見てみるのが良いと思います。

それから、これからも質問は自由に書いて送ってください。ただ私はとても忙しいので、すぐに返信は期待しないでください。私はときどきお便りを公表しないで質問に答えることもありますが、普通そのようにするのは好きではありません。あなたからのお便りと私からの答えを公表すれば多くの人に役立ちますが、個人的な返信はあなたにしか役に立ちません。


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

INDEXに戻る