これは RuntimeRevolution 1.1.1 のヘルプにある文書を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。

Help -> Revolution Documantation -> Development Guide -> Developing with Revolution -> About... Revolution for HyperCard developers


About Revolution for HyperCard developers
HyperCard ユーザーのための Revolution
==============

参照:
--------------
Getting Started Tutorial, dynamicPaths property, HCAddressing property, HCImportStat property, HCStack property


 このトピックは、HyperCard や HyperTalk の経験があり、HyperCard の知識や既存のスタックを、Revolution で活用したいと思っている人に向けて書かれたものである。

 Revolution は HyperCard スタックを直接読むことが出来るので、既存のスタックをコンバートして作り直すことが出来る。そして Revolution の新しい機能を取り込んで、スタックを拡張することが出来る。

 このトピックを充分に理解するためには、HyperCard スタックの作り方と、スクリプトの書き方を知っている必要がある。もしあなたが標準的なレベルの HyperCard 開発者なら、このトピックを理解することが出来るだろう。


Contents:
From HyperCard to Revolution
Revolution Enhancements
The Revolution Development Environment
Transcript and HyperTalk
Importing HyperCard Stacks
Tips and Gotchas


From HyperCard to Revolution
HyperCard から Revolution へ
 HyperCard の経験のある開発者は、Revolution のオブジェクトモデルと開発環境が、HyperCard にとても良く似ていることに気付くだろう。スタックウィンドウは複数のカードを持つことが出来、Objects メニューを使ってそこにオブジェクトを作ることが出来る。プロパティパレットを使ってオブジェクトの外観や動作を変えたり、それらのスクリプトを編集することが出来る。そして Transcript言語で書かれたハンドラは HyperTalk そっくりである。

 Revolution は HyperCard の全オブジェクトタイプをサポートするだけでなく、ボタン、フィールド、イメージ(ペイントしたり、ファイルを表示することが出来る)、ドローグラフィック、QuickTime プレーヤ、そしてスクロールバーを備えている。

 ただし、いくつかのコンセプトの違いが存在する。

Stacks and windows
スタックとウィンドウ
 HyperCard ではウィンドウはスタックであり、各スタックはファイルである。 Revolution でも各ウィンドウはスタックであるが、スタックファイルには複数のスタックを含めることが出来る。これはマルチウィンドウのアプリケーションを、ひとつのファイルで作れることを意味する。これらのスタックはファイルの中に個別の名前を付けて保存される。

 Revolution は、HyperCard では不可能だったウィンドウオプションを提供する。スタックは普通の編集可能なウィンドウにも、パレットにも、モーダルダイアログやモードレスダイアログにもなる。これは、カスタムパレットやダイアログを、外部コマンドなしで簡単に作ることが出来ることを意味する。これらのウィンドウはメインウィンドウと同じファイルに保存することが出来る。パレットにはボタン以外の任意のオブジェクトを含めることが出来る。

 スタックはウィンドウ右下のリサイズボックスやスクリプトからリサイズ可能である。ウィンドウからリサイズボックスを取り除くことも出来るし、幅や高さの最小値や最大値を指定することも出来る。

 ティップス: Geometry Manager を使えば、ユーザーがウィンドウをリサイズした時に、Revolution が自動的にオブジェクトの移動やリサイズをするようにすることも出来る。

Backgrounds and groups
バックグラウンドとグループ
 HyperCard ではバックグラウンドレイヤーにオブジェクトを置くことが出来る。そしてバックグラウンド上の各カードでは、カードオブジェクトの後ろにバックグラウンドオブジェクトが見えている。 Revolution にはこのようなバックグラウンドは無く、代わりにオブジェクトのグループを使う。グループは一枚のカードに表示することも、複数のカードで共有することも出来る。

 Revolution では Group メニュー項目(や group コマンド)を使って、選択したオブジェクトを任意のグループに入れることが出来る。グループは HyperCard のバックグラウンドと違い、スタック上の任意のカードの、グループ化されていないオブジェクトの前にも置くことが出来る。つまり共有するオブジェクトは背面に、カードオブジェクトは前面に、という制限から解放されている。

 グループは非常に柔軟性に富んでいる。グループを選択して移動したり、show/hide をコントロールしたり、外周にスクロールバーを配したり、任意のカードに置いたり、任意のカードから取り除いたりすることが出来る。またグループの中にグループを作ることも出来る。

 新しいカードを作った時、そのカードに自動的にグループを置くように設定することが出来る。これは HyperCard で新しいカードを作った時に、そのカードが現在のバックグラウンドに置かれるのと似ている。グループの backgroundBehavior プロパティを操作することで、この動作が可能になる。

 しかし忘れてはならない。グループはバックグラウンドではない。 HyperCard では全てのカードはバックグラウンドの上にある。しかし Revolution のカードはグループと無関係に存在する。そして HyperCard とは逆に、グループはカードの上にある。

 ティップス: HyperCard と同じ動作をするスタックを作るには、スタックウィンドウと同じ大きさのグループをひとつ作って、その backgroundBehavior プロパティを true にする。そしてカードオブジェクトよりも後ろに置くために Object メニューから 'Send to Back' を選択する。この設定によって、HyperCard のバックグラウンドと同じ環境を作ることが出来る。(もちろん、グループの他の機能を利用するために、複数のグループをカード上に置くことも出来る)

Menus and the menu bar
メニューとメニューバー
 HyperCard では、ボタンの 'style' プロパティを 'popup' に設定することによって、ポップアップメニューを作っていた。そしてメニューの中身はボタンの中に置いていた。メニューバーのメニューを変更するには 'create menu' を使い、メニュー項目の選択には 'doMenu' コマンドを用いた。

 Revolution's のメニューハンドリングも良く似ている。 Revolution では(メニューバーのメニューも含めて)全てのメニューがボタンとして実現されている。ボタンメニューの作り方は HyperCard と同じである。ボタンのスタイルを menu に設定して、そのボタンの menuMode プロパティを pulldown menu、popup menu( Revolution では 'option menu' と呼ぶ)、combo box のいずれかにセットする。ボタンメニューはスタック上のどこにも置くことが出来る。

 メニューバーを作るには、まず各メニューのボタンを作り、ボタンの menuMode プロパティを 'pulldown' にする。そしてこれらのメニューをグループにまとめて、スタックウィンドウの上部( Unix と Windows システムでのメニューバーの定位置)に置く。

 スタックの menubar プロパティにこのグループの名前をセットすると、Revolution はこのグループのメニューを Mac OS 標準のメニューバーとして表示し、これらのボタンを隠すために、ウィンドウのサイズを変更する。これは、メニューバーが、各プラットホームに合わせて表示されることを意味する。つまり各プラットフォームのインターフェースに従い、Mac OS と OS X ではスクリーン上部に、Unix と Windows システムではスタックウィンドウ上部にメニューバーが現れる。

 ティップス: Menu Manager を使えば、メニューバーのボタンを自動的に作って配置することが出来る。メニューの外観やメニューアイテムのキーボードショートカットなどは、それぞれのプラットホームに最適化される。


Revolution Enhancements
Revolution による拡張
 HyperCard 開発者が望んでいた多くの機能が Revolution で実現されている。

 * 全てのオブジェクトに直接自由に色を付けられる
 * Windows と Unix に対応したマルチプラットフォーム開発環境
 * リサイズ可能なベクターグラフィック
 * 真のグループ化
 * 実質的に無制限のフィールドテキスト
 * 実質的に無制限のスクリプトサイズ

 全般に、サイズの限界値が大きく、スクリプトの実行が非常に速く、より多くのマルチメディアフォーマットとオブジェクトタイプをサポートし、コマンド、関数、プロパティの種類が非常に多い。

 Revolution は HyperCard 1.x タイプの XCMD をサポートする。これは、ウィンドウを使わない殆どの XCMD と XFCN が、変更なしでそのまま動くことを意味する。しかし多くの HyperCard 開発者は、必要としていた外部命令の機能のほとんどが、既に Revolution に用意されていることに気付くだろう。 Transcript 言語を利用すれば、ファイルのリネーム、移動、削除、ファイル間のリソース移動、フォルダ内容の取得、カーソルの移動、スタックウィンドウの後ろの背景、 URL の取得、ウェブサーバへのデータ送信、そしてインターネットソケットを使ったコミュニケーションが可能である。カラー機能が組み込まれ、パレットやダイアログを作ったり、それをコントロールすることが出来る。そして Transcript 言語は繰り返し処理が速いので、速度のために必要としていた外部命令をハンドラに置き換えることも可能である。

 興味をそそるいくつかの強力な拡張機能を紹介しよう:

Chunk operations
チャンク操作
 HyperTalk の word、item、line チャンクタイプは、Transcript でも全て同じように使うことが出来る。

 チャンク表現にマイナスの値を指定して、文字列の最後からのインデックスを利用することが出来る。例えば word -2 of myString は、最後から数えて2つめの word を指す。

 また、文字列中の各チャンクを、ループを越えて指定することが出来る:

  repeat for each word currentWord in myString
    if currentWord is "George" then beep
  end repeat
 is among は特定のチャンクが文字列中に存在するかを調べるオペレータである:
  if "Fred" is among the items of "Adam,Fred,George"
  then doSomething
 HyperTalk の offset 関数に加えて、Transcript には lineOffset、itemOffset、そして wordOffset という関数がある。これらを使って、指定文字列がどの line や、item や、word に含まれているかを調べることが出来る。

Unix-style regular expressions
Unix スタイルの正規表現
 チャンク表現は更に拡張されている。 Revolution は強力なワイルドカードと正規表現を、filter コマンド、matchChunk 関数、matchText 関数で使うことが出来る。(正規表現とワイルドカードは、検索文字列を指定するためのテキストパターン記述法である)

Direct URL addressing
URL のダイレクトアクセス
 Transcript は URL をコンテナとして扱うため、任意の URL の内容を直接操作することが出来る:
  put URL "http://www.example.com/file.txt" into field "Text"
  put myVar into URL "file:/Disk/Folder/File"
	if URL "ftp://ftp.example.org/myfile/" contains "Help"...
 Revolution は標準ファイル、http( web )、ftp URL タイプをサポートする。また binfile や resfile キーワードを使って、バイナリファイルやリソースフォークを扱うことも出来る。フィールドや変数などのコンテナと同じように、URL にデータを put したり、URL からデータを get することが出来る。

Modifying the message path
メッセージパスの操作
 Revolution は、他のスタックのスクリプトをライブラリとして使うための、HyperTalk の start using コマンドをサポートしている。

 更に insert script コマンドを使って、スタックに限らず任意のオブジェクトをメッセージパスに挿入することが出来る。 inserted script では、back キーワードを使って全てのオブジェクトよりも後ろに、或いは front キーワードを使って全てのオブジェクトよりも前に、任意のオブジェクトを置くことが出来る。メッセージパスの前( front )に挿入されたスクリプトは、メッセージを受け取ったターゲットオブジェクト自身よりも先に実行される。

Custom properties
カスタムプロパティ
 任意のオブジェクトにカスタムプロパティを作ることが出来る。このプロパティにはどんな種類のデータも、実質的に無制限に入れることが出来る。これらは組み込みプロパティと同様に get と set が可能である。
  set the myCustomProperty of card "Intro" to true
  get the hydrant of button ID 1045
  put the puffball of me into myPuffball
 データを格納する時、HyperCard では hide したフィールドがよく使われる。しかしカスタムプロパティを使えば、テキストの入れ物を用意することなく、任意のオブジェクトに直接データを入れることが出来る。またカスタムプロパティはフィールドよりもアクセスが速い。そしてテキストしか扱えないフィールドと違って、カスタムプロパティはバイナリデータを扱うことも出来る。

Inheritance of text appearance
テキスト属性の継承
 カード、グループ、スタックの、textFont、textSize、textStyle プロパティを設定することが出来る。これらはカラープロパティと似た動作をする。あるオブジェクトのテキストプロパティやカラープロパティが未設定である時、フォント、サイズ、スタイル、そしてカラープロパティは、メッセージパスの次の層にあるオブジェクトから継承される。

 例えばスタックの textFont を Verdana に設定すると、そのスタックの全てのオブジェクトは自動的に Verdana になる。( textFont を個別に設定されたオブジェクトを除く)

Binary data and nulls
バイナリデータとヌル
 Transcript では、ヌルキャラクタや ASCII ゼロを含むバイナリファイルを読み書きすることが出来る。( HyperTalk のデータ構造にはヌルキャラクタを含むことが出来ないので、HyperTalk はヌルキャラクタを扱うことが出来ない)

 バイナリファイルを読み書き出来、変数内のバイナリデータを操作出来るということは、ファイルフォーマットさえ分かっていれば、任意のタイプのファイルを作ることが出来るということである。例えば生のデータを直接書き込んで、MP3 ファイルを作ることも可能である。また HyperCard では外部命令を必要としていたような、シリアルポートを使ったバイナリデータの読み書きも出来る。

Associative arrays
連想配列
 Transcript は配列変数(複数の値を入れることが出来る変数)をサポートする。配列変数の部分や要素は、数字や文字列を使って指定することが出来る。

 ティップス: この新しい用語を更に調べるために、Transcript Dictionary を参照しなさい。


The Revolution Development Environment
Revolution の開発環境
 Revolution の開発環境は HyperCard に良く似ている。メッセージボックス( Revolution では複数行を扱うことも出来る)があり、オブジェクトを操作するためのツールパレットがある。

 ポインタ(矢印)ツールを使ってどの種類のオブジェクトも選択することが出来、また違う種類のオブジェクトを混在して扱うことが出来る。そのため、例えばボタンとフィールドを一緒に移動することが出来る。

 選択されているオブジェクトのプロパティにアクセスするには、Object メニューから 'Object Properties' を実行する。プロパティパレットの上部には、基本プロパティ(全てのオブジェクトに共通)、オブジェクトのスクリプト、オブジェクトのカスタムプロパティ、そしてそのオブジェクトタイプに特有のプロパティを選択するタブが並んでいる。いくつかのオブジェクトタイプでは、オブジェクト固有のタブが2つある。

 スクリプトエディタはプロパティパレットの左から2番目のタブを使ってアクセス出来る。 Revolution のスクリプトエディタはスタイル付きテキストを扱えるので、カラーやフォントを使ってハンドラの一部を強調したり、未完成のコードに印を付ける事が出来る。スクリプトを検索するには Script メニューの 'Find and Replace' を使う。

 HyperCard と同じように、書いたハンドラをその場でテストしたり、開発環境上でそのままスタックを使うことが出来る。コンパイルしたり、別のランタイム環境を呼び出す手間はない。Revolution のメニューやパレットのない「クリーンな」環境でスタックをテストしたい場合は、Development メニューの 'Suspend Revolution UI' を実行する。スタンドアローンアプリケーションを作る準備が出来たら、File メニューから 'Build Distribution' ダイアログボックスを出す。ここで Revolution のサポートするプラットフォーム用のスタンドアローンアプリケーションを作ることが出来る。

 メニュー、パレット、ダイアログボックスなどの開発環境は、全て Revolution で作られている。これは単に Revolution エンジンのパワーを誇示しているのではなく、必要ならばこれらを調べ、カスタマイズすることも出来ることを意味する。


Transcript and HyperTalk
Transcript と HyperTalk
 Revolution のスクリプト言語は Transcript と呼ばれている。 HyperTalk は Transcript の先祖のひとつであり、HyperTalk のスクリプトは容易に Transcript に変換することが出来る。

 HyperTalk と同じように、ひとつのオブジェクトのスクリプトには、そのオブジェクトに送られて来るメッセージに対応するいくつかのハンドラを置くことが出来る。 HyperTalk のメッセージのほとんどは(新しいものも含めて)全てサポートされている。例えばボタンスクリプトに
  on mouseUp
    beep
  end mouseUp
 と書けば、想像通りの反応をする。

 HyperCard と同じように、メッセージはまずターゲットのオブジェクトに送られ、メッセージパスに沿って、そのオブジェクトを含むオブジェクトへと送られていく。例えばボタンをクリックするとまずボタンに mouseUp メッセージが送られ、それからそのボタンのあるカードに送られ、そしてそのカードのあるスタックに送られる。

 ティップス: Revolution では組み込みコマンドと関数はメッセージパスを通らず、直接 Revolution へ送られる。これは、メッセージパスの中にハンドラを入れても、組み込みコマンドや関数をオーバーライドすることが出来ないことを意味する。(ハンドラは、あなたが作ったコマンドや関数を処理するものである) しかしこれによって Transcript の実行速度は HyperTalk などより5−100倍も速くなった。この桁外れのスピードによって、Revolution は HyperCard では不可能だった様々な重い処理をこなすことが出来るようになった。

 オブジェクトは、名前、番号、ID で参照することが出来る。 HyperCard と同じくオブジェクトの ID は変更出来ない。(例外として、Revolution ではスタック ID は変更可能である。 HyperCard ではスタックは ID を持たない) ひとつのスタック内には、同じ ID のオブジェクトは複数存在しない。

 Transcript は HyperTalk の制御構造を全てサポートしている。( if/then/else/end if, repeat, pass, send, exit, return ) 更に2つの新しい制御構造がある:

 * switch:複数の状態をチェックすることが出来る、if に似た条件分岐。
 * try/catch/throw:実行文とエラー処理ルーチンを持つ制御構造。

 Transcript 1.0 には HyperTalk 2.4 のおよそ3倍のコマンド、プロパティ、関数があり、その他にいくつかの互換機能が検討中である。完全な言語情報は Revolution documentation の Transcript Dictionary にある。


Importing HyperCard Stacks
HyperCard スタックを取り込む
 Revolution は HyperCard スタックを直接読み込むことが出来る。基本的な操作はシンプルである:

1. HyperCard 上で Compact Stack (スタック整理)を実行する。

2. Revoluton を起動して、File メニューの 'Open Stack' を選び、スタックを選択する。(またはスクリプトから go コマンドを使っても良い) すると Revolution はスタックを開き、自動的にそれを Revolution ファイルフォーマットに変換する。バックグラウンドはグループに変換され、そのバックグラウンド上にあったカードの上に置かれる。

 ほとんどの場合、あなたのスタックは Revolution 上でうまく動くだろう。しかし以下のような問題が起きるかも知れない:

* Revolution は、AddColor XCMD で色付けした HyperCard スタックのカラー情報を読むことが出来ない。カラー化されたスタックは Revolution のカラープロパティを使って色を着け直す必要がある。

* サウンド、アイコン、カーソルリソースは変換されて取り込まれるが、リソース自体は全て捨てられる。もし Revolution にない他のリソース( XCMD や XFCN など)が必要なら、ResEdit などのリソースツールを使ってスタックに取り込まなければならない。

* 開発環境の違いから、HyperTalk コマンドのうち、メニューバーを変更するものや、パレットを show/hide するものは Revolution では機能しない。(メッセージボックスの show/hide を除く)

* 特にメニューバーの扱いは大きく異なるため、メニューバーを扱うほとんどのスクリプトは書き直す必要があるだろう。

 もし既存のスタックにこれらの問題があるのなら、スクリプトエラーを避けるために、問題を起こす部分(例えばカラー命令、外部命令のコール、メニューバーの操作など)をコメントアウトして、再度 Compact Stack (スタック整理)を実行してから Revolution で読み込みなさい。スタックの移行が成功したら、それからこれらのハンドラを Revolution に合わせて書き直す。

 HyperCard スタックを取り込む時、Revolution は HCStack プロパティを true にセットする。開いているスタックがオリジナルの HyperCard スタックかどうかを調べたい時は、このプロパティをチェックしなさい。

 取り込んだスタックの HCAddressing プロパティが自動的に true にセットされる。これによって Revolution は、ボタンを参照する時にカードボタンを、フィールドを参照する時にグループ化されたフィールドを参照するようになる。 dynamicPaths プロパティも true にセットされる。これによって、HyperCard のダイナミックパス動作が可能になる。


Tips and Gotchas
ティップスと解決策
 Revolution は HyperCard と高度な互換性を持っており、あなたの知識のほとんどがそのまま使えるだろう。しかし Revolution にはいくらかの非互換な部分が存在しており、また同じ結果を得るのに別の方法を提供することもある。ここでは最も一般的な解決策と便利なティップスを紹介する:

Custom properties instead of hidden fields
隠したフィールドを使うのではなく、カスタムプロパティを利用する
 時に、ユーザーに見せたくないデータ(例えばカードの更新日など)を保存したいことがある。 HyperCard ではこのように、hide したフィールドにデータを格納するのが一般的である:
  on closeCard -- HyperTalk サンプル
    put the seconds into field "Hidden Date"
  end closeCard
 Revolution では代わりにカスタムプロパティを使うことが出来る。カスタムプロパティにはどんなデータも入れることが出来、スタックと一緒に保存され、任意のオブジェクトに関連付けることが出来、組み込みプロパティと全く同じようにスクリプトから扱うことが出来る。
  on closeCard -- Transcript サンプル
    set the lastAccessDate of this card to the seconds
  end closeCard
Overriding built-in commands and functions
組み込みコマンドと関数のオーバーライド
 HyperCard では、コマンドと関数がメッセージパスを通るため、同名のハンドラを使ってオーバーライドすることが出来た。

 Revolution では、組み込みコマンドと関数はメッセージパスを通らず直接実行されるので、同名のハンドラを使ってオーバーライドすることは出来ない。

Explicit save
終了時の保存
 HyperCard は自動的にスタックの変更をセーブする。 Revolution では、ユーザーが作業を終了する時に変更を保存するという、より一般的な方法を提供する。( HyperCard の自動保存と同じ効果を得るには、closeCard ハンドラを使って、カード移動時にカレントスタックを保存するようにする)

Inserting handlers in the Home stack
ホームスタックのスクリプト
 HyperCard の Home スタックは全てのオブジェクトのメッセージパスに含まれるので、開発時に必要なスクリプトをホームスタックに置く開発者が多い。 Revolution で同じことをするには、Plugins フォルダにスタックを置いて、それが Revolution の start up 時に自動的に読まれるよう、Development メニューの Plugins Editor から設定する。必要ならプラグインスタックをいくつも作って、それらが読み込まれる時に、ウィンドウを表示するか、どのメッセージを受け取るか、をコントロールすることが出来る。

Everything in memory
全てはメモリの中
 Revolution でスタックファイルを開くと、スタック内の全てはメモリに読み込まれ、purge するまで留まり続ける。( destroyStack プロパティを使えば、スタックを閉じる時に自動的にメモリから削除することも出来る) 予めメモリに読み込むことで、より速いアクセスを実現している。 Revolution はカード移動時にディスクにアクセスすることはない。

 これは、用意されたメモリ以上のスタックを扱えないことを意味する。もしスタックに大きなデータを入れる場合は、複数のスタックファイルに分けるか、ピクチャーや、ビデオやサウンドデータを、別ファイルから参照するようにしなさい。(ファイルを参照するコントロールは、そのコントロールのあるカードが開かれた時だけメモリに読み込まれる)

Dates, times, and the start of the eon
日付、時間、そして時間の始まり
 MacOS (と HyperCard )では "時間の始まり" を 1904年1月1日の真夜中としている。 seconds 関数はここからカウントされている。 Revolution はクロスプラットホームであるため、Mac OS 特有の日付ではなく、1970年1月1日GMT の真夜中を時間の始まりとして用いる。 seconds 関数を使っているスタックはこの影響を受ける。

 Transcript の ticks 関数はシステム起動時からの時間ではなく、time と同じ日付からの時間をカウントする。

 date 関数と time 関数は、デフォルトで U.S. フォーマットにコンバートされる。( system キーワードを使えば、日付と時間をユーザー設定に従ったフォーマットにすることも出来る)

Language parsing
言語の文法
 Transcript は HyperTalk よりも厳密な文法チェックを行う:
 * 'the' を厳密に調べる。
 * 関数名とプロパティ名は変数名として使えない。
 * 文字列は厳密にクォートで囲われなければならない。( explicitVariables プロパティを true にすると、スクリプトを閉じる時にチェックするようになる)
 * do コマンドの文字列のクォート、value コマンドの括弧は、厳密にチェックされる。

Object references
オブジェクトの参照
 Revolution はボタンやフィールドを参照するのに card や background などのレイヤー名を使わない。つまり Revolution では、カード上のオブジェクトも、グループ内のオブジェクトも、'button myButton' や 'field ID 22' と書いて指定する。

Paint and graphics
Paint と graphics
 ラインやボックスのようなものを扱うには、ペイントよりも、graphic オブジェクトの方が簡単で効率的である。 (ペイントツールの)ラインツールを使うのではなく、スクリプトから、或いは Object メニューの 'New Control' を使って新しい graphics を作り、style プロパティでその形を指定することが出来る。

 graphic オブジェクトは移動やリサイズや変更が容易で、スクリプトからも、プロパティパレットからもオブジェクトのプロパティを設定することが出来る。より複雑な絵(写真など)を扱うには、image オブジェクトを利用する。

Using send instead of idle handlers
idle ハンドラの代わりに send を利用する
 時に、周期的にコマンドを実行したいことがある。 HyperCard では idle ハンドラや mouseWithin ハンドラを使うのが一般的である。

 Revolution は idle も mouseWithin もサポートしているが、send コマンドを使って指定時間後にメッセージを送るのがより効果的である。つまり実行したいコマンドをハンドラに置き、そのハンドラの最後に、そのハンドラを実行するディレイ付きの send コマンドを置く。このサンプルは、1秒おきに beep を鳴らすものである:
  on annoyUser -- "send in" を使った Transcript サンプル
    beep
    send "annoyUser" to me in 1 second
  end annoyUser
 このアプローチは非常に有効である。 idle ハンドラでは毎回時間を調べて、そのスクリプトの実行を続けるかを決めなければならないが、Revolution ではそれが不要である。そして実行タイミングを非常にコントロールしやすい。

Using mouseMove instead of polling the mouse position
マウス座標を調べる代わりに、mouseMove を使う
 マウスの位置を監視する必要がある時、HyperCard では repeat ループ(や idle や mouseWithin ハンドラ)を使ってマウス座標をチェックするのが普通である:
  on mouseUp -- HyperTalk サンプル
    repeat while the mouseLoc is within the rect of me
      put the mouseLoc into field "Mouse Position"
    end repeat
  end mouseUp
 Revolution でも idle メッセージや mouseWithin メッセージなどの構造はサポートされる。しかしこの方法では、マウスが移動していない時でさえ Revolution はずっとマウス座標を調べ続けなければならない。もっと効率の良い方法は、オブジェクトのスクリプトに mouseMove ハンドラを置いて、マウスがそのオブジェクトの中にあるあいだマウス座標を調べるようにすることである。
  on mouseMove -- 同じことをする Transcript
    put the mouseLoc into field "Mouse Position"
  end mouseMove
Window layers
ウィンドウレイヤー
 ほとんどのアプリケーションでは、アクティブなウィンドウがカレントドキュメントを持っており、メニューはそのウィンドウに対して作用する。 Revolution はスタックをパレットやダイアログとしてオープンすることが出来るので、必ずしもそうなるとは限らないし、最前面のスタックがアクティブウィンドウでないこともある。 topStack 関数と defaultStack プロパティを使えば、どのスタックがアクティブウィンドウであるかをコントロールすることが出来る。

Pathnames
パスネーム
 HyperCard では、Mac OS の慣例に従って、ファイルのパスネームをコロンで区切る。ファイルのパスはこのようになる:
	Hard Disk:Folder:File
 Revolution ではクロスプラットホームで容易にファイルパスを扱えるように、コロンの代わりにスラッシュを用いた Unix スタイルのパスネームを全てのプラットホーム上で使う。 Revolution スタイルのファイルパスはこのようになる:
	/Hard Disk/Folder/File

 Revolution はパスネーム上のスラッシュをコロンに変換するので、'And/Or' と言うファイルは、Revolution のパスネーム上では 'And:Or' となる。

 カレントフォルダが入っているフォルダは、'../' という相対パスで指定することが出来る。例えばカレントフォルダが 'Folder 1' ならば、同じ階層にある 'Folder 2' は '../Folder 2/' と書くことが出来る。

 URL をコンテナとして扱って、get や put のようなコマンドを用いることが出来る。例えばファイルの内容を読み込んでフィールドに表示する時、HyperTalk ではこのようなスクリプトを書いた:
  open file "Disk:Folder:File"
  read from file "Disk:Folder:File"
  put it into field "File Contents"
  close file "Disk:Folder:File"
 Revolutionでも(パスネーム中のコロンをスラッシュに変えれば)同じことが出来る。しかしこのスクリプトは下のような簡単な文に置き換えることが出来る:
  put URL "file:/Disk/Folder/File" into field "File Contents"
Visual effect quoting
ビジュアルエフェクトのクォート
 Transcript の visual effect では、クォートで囲ったエフェクト名は使えない。 visual effect "barn door" というスクリプトは HyperCard 上で正しく働くが、Revolution ではエラーになる。

The marked/mark property
marked/mark プロパティ
 HyperTalk では 'marked' プロパティと呼ばれる印をカードに付けて、そのカードを処理対象に含むかどうかの目印にすることが出来る。 Transcript ではこれを mark プロパティと呼ぶ。

Closing fields
フィールドのクローズ
 Enter キーを押しても、カレントフィールドは閉じられない。 Enter でフィールドを閉じるようにするには、そのフィールドのメッセージパスにあるオブジェクトに enterInField ハンドラを置かなければならない:
  on enterInField
    select empty -- フィールドを閉じる
  end enterInField
Shared text fields
テキストを共有するフィールド
 Revolution では、sharedText プロパティが false であるフィールドは、共有テキストを保持しない。代わりにカスタムプロパティを利用すると良い。(訳注: HyperCard では、sharedText プロパティを false にしても、共有テキストそのものはフィールドデータとして保持されている)

Window appearance properties
ウィンドウの外観を決めるプロパティ
 HyperCard では 'show titlebar' と 'hide titlebar' を使ってウィンドウのタイトルバーをコントロールすることが出来た。 Revolution ではスタックの decorations プロパティを使って、タイトルバー(や、ズームボックス、シェードボックスなど)をコントロールすることが出来る。

Cursors and icons
カーソルとアイコン
 リソースは Mac OS だけの機能であるため、クロスプラットホーム対応の Revolution では、カーソルとアイコンの表示に image を使う。カーソルやアイコン用の image を作るか、それを入れたサブスタックを作ってメインスタックに入れなさい。

Stack location property
スタックの座標プロパティ
 Revolution ではスタックの座標は、左上ではなく中心座標である。


邦訳/文責:UDI
2003.01.01
2003.04.08

inserted by FC2 system