メインスタックとサブスタック
メインスタックは New Mainstack で作ります。複数のメインスタックを作ることも出来ますが、一連のスタックをビルドして実際に「アプリケーション」となるのは、複数のメインスタックの中のひとつだけです。他のメインスタックは .rev ファイルのまま data フォルダに収められます。
サブスタックは New Substack で作ります。一見すると独立したスタックのように見えますし、またそのように扱えますが、ファイルとしては独立しておらず、メインスタック内に含まれます。
これを「スタック」と考えると結構混乱します。 むしろ SuperCard で言うところの「ウィンドウ」と考えるのが適当でしょう。 view メニューの Application Overview でもウィンドウのようなアイコンで表示されますね。 go stack、go window 、open stack、open window のいずれでもアクティブに出来ます。
−−
サブスタックはメインスタック内にあるので、メッセージ継承ルートが確立しています。サブスタックのメッセージは自動的に(あるいは pass すれば)メインスタックにも流れます。しかしメインスタックのメッセージはサブスタックには流れません。
一方でメインスタック同志は全く独立したスタックであるため、start using や insert script 、或いは go stack や send コマンド等を使って、何らかの連携を取らなくてはなりません。メインスタックのメッセージは using しているスタックにも流れます。
−−
send コマンドはメインスタックへもサブスタックへも to stack <stackName> で送れます。特にパスを指定する必要はありません。もちろんスタック内の個々のオブジェクトへも to btn <btnName> of stack <stackName> のようにして送ることが出来ます。開いていないカードやそのオブジェクトにも to btn <btnName> of card <cdName> of stack <stackName> のようにして送れます。
send で実行した結果を得たい時は、return を含む文を実行させます。返値は the result に入ります。
呼び出し側:
send "return myCalc( 5, 4 )" to stack "calcStack"
put the result into cd fld "resultFld"
受け取り側:
function myCalc n1, n2
return n1 * n2
end myCalc
また value 関数を使って、他のオブジェクトの関数を利用することも出来ます。
呼び出し側:
put value( "myCalc( 5, 4 )", stack "calcStack" ) into cd fld "resultFld"
或いは、on で始まるハンドラからでも return で値を返すことも出来ます。
呼び出し側:
send "doCalc 5,4" to stack "calcStack"
put the result into cd fld "resultFld"
受け取り側:
on doCalc n1, n2
return n1 * n2
end doCalc
−−
ビルド後はメインスタック同志が data フォルダという存在によって「ゆるく」繋がっていますが、編集中(ランタイム動作時)は「メモリに読み込まれているか否か」だけでその関係が決まります。
例えばあるスタックを編集中に他のスタックを開くと、それは無関係のスタックが2つ開いているだけです。ところがここで save を実行すると、両方のスタックが Overview ウィンドウに追加され、立派に「スタック群」として機能するようになります。一旦 Overview に追加されると、スタックを閉じてもこの関係が継続します。
つまり Overview に表示されているスタックは全て「ひとつのアプリケーションのソース」と見なされているわけです。古くは THINK C から、CodeWarrior や FutureBasic などにも見られる、「プロジェクトファイル」と同じ働きをしている訳ですね。
仮にウィンドウを閉じたとしても、それは単にウィンドウを閉じただけで、メモリ上には依然としてスタックが存在します。これを知らないと編集中にトラブルを起こしてパニックになります。
Overview からスタックを取り除きたい場合は File メニューの Close and Remove from Memory を使うか、Overview ウィンドウの Purge ボタンを使います。Close メニューやクローズボックスは単にウィンドウを閉じるだけです。
スタックプロパティの Free Window Resources on Closing や Free Stack Memory on Closing にチェックを入れておくと、ウィンドウやスタックを閉じた時にメモリ上から消すことが出来ます。(ただし Overview ウィンドウが出たままだとリストが更新されません。これも混乱を招く元ですね)
* ここで述べていることは恐らく正確ではありません。実際に Revolution が複数のスタックをどう連携させているかは、Tip of the Week! 1 と、stackFiles プロパティの項を参照して下さい。 *
−−
ビルド時にサブスタックを別ファイルに書き出すオプション( stack タブの Move substacks into individual files ラジオボタン)もあります。アプリケーションは実行中に自身を書き換えることは出来ませんが、こうして別ファイルにしておくと、実行中のデータをサブスタックに保存することが出来ます。
このようにして作ったファイルは data フォルダ内の xx.rev_components フォルダに収められます。拡張子 .rev は付きませんが、中身はただのスタックのようです。ファイルは別になっても「サブスタック」という身分は変わりませんから、メッセージ継承ルートは維持されます。
.rev_components フォルダ内のスタックは再利用可能な一種のコンポーネントと考えることが出来ますね。ウィンドウを持ち、データを保存出来、xTalk でプログラミング出来る「スタックのような」コンポーネント。便利なコンポーネントをたくさん蓄積出来れば、これは大きな財産になりそうです。
−−
Application Overview を使ってサブスタックを追加/削除するには、まず右上のディスクロージャ(三角アイコン)でウィンドウを拡大してから、左側のリストで(スタックではなく)「スタックファイル」を選択します。するとそのスタックファイル内のスタックが右側にリストアップされるので、ここで追加や削除が出来ます。
つまり Overview で何かしらのオブジェクトを追加/削除するには、その「オーナーを」左側のリストで選択するわけです。ボタンならカード、カードならスタック、スタックならスタックファイルがそのオブジェクトのオーナーです。
2002.09.03
2003.01.22
UDI