Edition」の初級から中級のチュートリアルです。このチュートリアルは、中学・高校生からプログラミングが始めての方達を対象にして、Mac&Winのアプリを同時に作ります。ウインドウ・スタックス、スタンドアロンこの章の概略メインスタックとサブスタックの関係から出て来る問題点と解決法について。カスタム・プロパティの作り方と引き出し方。開発プロジェクトの書類をスタンドアロンにする。一度オブジェクト・ハイアラキーについて具体例。スタック・ウインドウのタイトルバーのデコレーション。切り抜きウインドウを作ってみる。メインスタックは書き換えができません今までこのチュートリアルは、ほとんどメインスタックばかり使ってやってきました。メインスタックとサブスタックは、幾つかの重要な違いがあります。第一には、開発しているプロジェクトをスタンドアロンのアプリケーションにした後、メインスタックを書き換えて保存する事ができません。スタンドアロンにしたメインスタックは、開発の最後に作った事柄から書き換えることができません。OSではLiveCode.app(WindowsではLiveCode.exe)を開かずに、単独でプログラムが動かせる状態にすることです。スタンドアロンは、他のプログラムの補助なしでも独自で動く、配布可能なプログラムと言う意味です。ここまで聞くと、大変な事のように感じるかもしれません。短所はいつも長所に切り替わるように、メインスタックを変更して保存はできませんが、サブスタックは変更の保存が可能ですから、それを有利に活用できるプロジェクトの作りを、始めから考えると言うのが、私からのアドバイスです。人によっては、メインスタックをスプラッシュ・ウインドウにすると言うやり方を取る人もいます。スプラッシュ・ウインドウというのは、プログラムが環境設定などのインフォメーションを取り込んでいる間見せておくウインドウで、開発用のLiveCodeアプリで言えば、始めに出る緑のウインドウの事です(下図)。アプリケーションによっては、それも適切かもしれません。すべてに適用できる方法でもありません。他の方法では、メインスタックの変更専用の機能を持たせた、サブスタックを用意すると言うやり方もあります。環境設定)のウインドウにして、ユーザーがメニューから引き出させように作ることもできます。スタンドアロンでは、メインスタックの全ての情報が凍結されるので、メインスタックを開くウインドウの位置もサイズも、開発した時の最後のロケーションに固定されています。これはこれで良い場合もありますが、アプリケーションによっては、前回の使用で最後に閉じた位置やサイズで、メインスタックを開けるのが親切なこともあります。プログラムが閉じられた時の位置とサイズをサブスタックに記録して、その位置にウインドウが開かれるスクリプトを書いてみます。カスタム・プロパティをサブスタックに作るメインスタックを作って名前(name)は「myMain」、ファイル「myMain.livecode」を保存してください。myMain」をセレクトしてサブスタック(substack)を作ります。サブスタック(substack)の名前(name)は「mySub」としてください。したテストなので、どちらもスタックのタイトルは付けません。preferences)にも使うのでなければ、ユーザーは開けて見る事はないので、カードには何もコントロールは必要ありません。property)を作って、そこにプログラムが終了した時のメインスタックのロケーション(location)を記録して保存し、次にスタンドアロンが開かれる寸前(preOpenStack)にそれを読み込んで、その位置にメインスタックを開くと言う方法を取ります。Properties」を開いてください。メインスタックのカスタム・プロパティと間違えないようにしてください。サブスタックでないとスタンドアロンで保存できません。Properties)を開いたら、右上の十字印(下図赤丸)をクリックすると、新しく作るカスタム・プロパティの名前をつけるウインドウが現れます。「cDefaultRect」とタイプして「OK」します。カスタム・プロパティの名前はグローバルで「g」を始めに付けたように、始めに「c」を付けるのが、スクリプトを読む時判断しやすいようにと言う、LiveCodeデベロッパーの一般的な命名法です。これはプログラミング上のルールではありません。「cDefaultRect」と名前を付けたカスタム・プロパティには、何かのアクシデントに備えて、基本となる現在のスタック「myMain」のレクト(rectangle)を記録しておきます。スタック「myMain」のレクト(rect)に設定しなさい。メッセージ・ボックスから送ると、現在のスタック「myMain」のレクト(rect)がカスタム・プロパティにセットされます。Properties」に戻らないと、セットした値は見えません。オブジェクト名」を付けなければいけません。上の図では「100,160,500,560」となっていますが、スタック「myMain」のロケーションによって必ずしもそうなりません。カスタム・プロパティの値は、手動でも修正できます。1つアプリケーションが閉じられる時のレクタングルを記録する、カスタム・プロパティ「cMyMainRect」の名前を作ります。十字印(下図赤丸)をクリックして「cMyMainRect」をタイプして「OK」をしてください。Contents)を入れる必要はありません。アプリケーションが閉じられる時に、メインスタックのレクタングルを記録させるスクリプトから書き込まれます。メインスタック「myMain」のサイズが、ユーザーによって変えられると想定して、ボタン「Quit」をメインスタック「myMain」のカードに作ります。ボタンはジオメトリー・マネージャーで下の図のように、ウインドウ・サイズに合わせて移動するようにします。設定し終わったらウインドウ・サイズを変えて試してください。ボタン「Quit」にプログラムを終了させるスクリプトを書き込みます。マウスアップここで一旦スタックを「Fileメニュー」から「save」してください。メインスタック「myMain」のサイズ、ロケーションを変えて、サブスタック「mySub」に作ったカスタム・プロパティ「cMyMainRect」に、メッセージ・ボックスから今のレクタングル(rectangle)を書き込んでみます。スタック「myMain」のレクト(rect)に設定しなさい。カスタム・プロパティの名前に「the」を付けて送りましたか。サブスタック「mySub」のインスペクターを開いて「cMyMainRect」に書き込まれているか確認してください(下図)。カスタム・プロパティに書き込んだレクト(rect)から、デフォルトの位置にセットできるか試してみます。サブスタック「mySub」のカスタム・プロパティ「cDefaultRect」に設定しなさい。ここまでの内容で、スタック「myMain」のスクリプト・エディターに書き込みます。スクリプトは、プログラムを閉じる時に(closeStack)、メインスタックのウインドウのサイズと位置を、サブスタックのカスタム・プロパティに保存します。次に開く時に(preOpenStack)、そのサイズと位置が、開かれるメインスタックになる内容です。スタンドアロンでそのスクリプトを書いておかない場合は、常に開かれるウインドウの位置とサイズは同じです。Script」で引き出せます。サブスタック「mySub」のカスタム・プロパティ「cMyMainRect」に設定しなさい。スタック「myMain」のレクト(rect)に設定しなさい。サブスタック「mySub」を保存しなさい。クローズスタック日本語部分を除く上の緑のスクリプトを、スタック「myMain」に書き込んでください。メッセージ「preOpenStack」は、スタック・ウインドウがまだ見えていない時に実行されるスクリプトのハンドラーで、その後メッセージ・ハンドラー「openStack」が実行されます。「openStack」は今は使っていません。メッセージ「closeStack」は、スタック・ウインドウが閉じられる直前に、必要な整理を実行するスクリプトのハンドラーです。スクリプトに間違いがないか確認して、スタンドアロンにする前にメッセージ・ボックスから、もう一度メインスタックをデフォルトの設定に戻します。スタックを「Fileメニュー」から「save」してください。プロジェクトの書類をスタンドアロンにするここで試しにスタンドアロンに作ってみます。スタンドアロンは開発の早い段階から、時々作って試しておくというのも、完全に作り上げたスタンドアロンで起きる、思わぬトラブルを避けるLiveCode開発のコツです。Settings...」を選びます。folder」をデスクトップにしました(下図赤枠)。data」とすると、サブスタックをまとめて入れるフォルダーが作られます。Windowsの場合、サブスタックの書類とアプリケーション・プログラムのアイコンが同じフォルダーに同列に現れるので、複数のサブスタックを「data」と言うフォルダーに1つにまとめます。フォルダー名は「data」でなくても良いです。for:」だけのセッティングをしました。Only)」でも良いかと思います。Icon)は、空白にしているとデフォルトでLiveCodeのアイコンになります。Windowsはデフォルトのままで良いです。Linuxは作らないので、チェックを外します。succesefully.」が出て、デスクトップに「myMain」と言うフォルダーが作られ、中に「MacOSX」と「Windows」のフォルダーがあります。myMain.app」のアプリケーション・アイコンが1つだけフォルダーにありますが、Windowsは「myMain.exe」と「data」フォルダーと「Externals」フォルダーが一緒に入っています。「Externals」は使っていないので、フォルダーは空ですから必要ありません。「data」フォルダーにはサブスタックの書類「mySub.rev」が入っています。「myMain.exe」と「data」フォルダーは常に一体にして同じフォルダーに入れていないと、アプリケーションは正しく働きません。OSでは「myMain.app」、Windowsなら「myMain.exe」をダブル・クリックでアプリを開いてスタック・ウインドウのサイズや位置を変えて試してください。働かない場合は、スタック「myMain」に書いたスクリプトに間違いがあるかもしれません。アクシデントに対処するそれではもう一度、開発環境のLiveCodeから作った書類「myMain.livecode」を開けます。スタンドアロンが正しく働いていたら、次は何かのアクシデントに備えてカスタム・プロパティ「cDefaultRect」を作ったスクリプトを追加します。この場合考えられるアクシデントは、スクリーンの外にスタック・ウインドウが出たまま、戻せないような事が考えられます。人によっては普段ディスプレイを2台つないでいても、場合によって1台と言う事もありますから、それに対処することにしましょう。それともうひとつ単純に、デフォルトに戻すというボタンもカード上に作る事にします。始めにボタンを作ってメインスタックの左上に置きました。レイベルは日本語で「デフォルトのウインドウに」としました。ついでなのでボタン「Quit」も日本語で「終了」としました。中に入れるのは、上で書いているスクリプトの1行と同じです。mouseUpデフォルトのウインドウの位置を修正したかったら、サブスタック『mySub』のインスペクターで直せます。私は「40,110,440,510」にしました。ディスプレイの外に出た場合のスクリプトは、まずユーザーが使っている現在のスクリーンレクト(screenRects)を調べます。2台のディスプレイにつないでいると、スクリーンレクト(screenRects)は2行のレクタングルを返してきます。「s」を付けて複数形にするのを忘れないでください。「the」を付けろとか、「s」を付けろとか、まあ英語でできているのでこの辺りは厳格です。screenRects始めの1行目がメインのディスプレイ、2行目はサブのディスプレイです。screenRects」の1行目のアイテム3よりも大きければ、明らかにディスプレイの外にスタック・ウインドウがある事になります。スクリプトにする時は、完全にスタック・ウインドウが見えなくなっているよりも、少し余裕をもっていた方が良いので、100ピクセルだけディスプレイサイズからマイナスにしました。ディスプレイのサイズをゲットして「it」に入れなさい。スタック「mySub」のカスタム・プロパティ「cDefaultRect」に設定しなさい。終わり少なくとも私のテストではうまくいきました。property)は、サブスタック(substack)だけに作れるとは限りません。すべてのオブジェクトに作って、どこからでも引き出す事ができます。サブスタックは、メインスタックの支配下にあります第一に、メインスタックは書き換えを保存できないと書きました。第二に書かなければいけないのは、メインスタックのスクリプト・エディターに書いてある内容は、すべてのサブスタックにも適用されると言う事です。メインスタックのスクリプト・エディターに書き込む内容は、幾つもサブスタックを作った場合、メインスタックと、どのスタックに適用するのか明確に把握している必要があります。「preOpenStack」「openStack」に書いたスクリプトをメインスタックだけを意識して書いていると、他のサブスタックを開いた時そのステートメントが実行されて、アレレという事になってしまいます。簡単なテストをしてみましょう。メインスタック「myMain」とサブスタック「mySub」を、新しく作ってください。Fileメニューから「Save」して、今度はファイル名を「myMain2.livecode」にします。Me」を作ります(下図)。mouseUp単純なスタックを開けたり閉じたりのスクリプトです。問題なく開けたり閉じたりできると思います。メインスタックのスクリプト・エディターに書き込んだスクリプトが、すべてのサブスタックに影響します。以下をメインスタックのスクリプト・エディターに書き込んでください。openStackメインスタックにある「openStack」はすべてのサブスタックがオープンされる時にも適用されて、サブスタックが開けられると天地左右は400x400になります。サブスタックをメインの支配下から逃す場合によっては、メインスタックとサブスタックの関係は便利に使う事ができますが、時にはちょっと使いにくかったりもします。メインスタックだけの「openStack」にする方法は、メインスタックのカード1に「openStack」のスクリプトを書く事もできます。Script」で開けます。mouseUpこれでメインスタックが開かれる時はいつも「400X400」になります。実際にはメインスタックのロケーション等も考えて、もっと細かな配慮をしたスクリプトが必要です。サブスタックをクリエイトするスクリプトでサブスタックを作るには2段階必要です。サブスタック「mySub2」を作ってみます。始めにまずメインスタック「mySub2」を作ります。スタック「mySub2」を創りなさい。上の図アプリケーション・ブラウザー内赤線の「mySub2」を見てください。トップにある「myMain」と同列にあります。これを次のスクリプトで「myMain」のサブスタックにします。言うより、スタック「mySub2」のメインスタックを「myMain」にと言う表現になるのですが。スタック「mySub2」のメインスタックを「myMain」に設定しなさい。これで、スタック「mySub2」はメインスタック「myMain」のサブスタックになります。ひとつサブスタックを作ります。"myMain"上で「サブスタックは、メインスタックの支配下にあります」と書きました。オブジェクト・ハイアラキー」と言って、9章でグループ・オーナーの説明をする時にも使いました。階層の上位のオブジェクトのプロパティによって、下位のオブジェクトのカラーやフォントが決められます。ここでメインスタックのバックグラウンド・カラー(backgroundColor)で実験してみましょう。Patterns」でBackground(バックグラウンド)でカラー設定を選んで、何でも好きな色を「OK」してください(下図)。「OK」をした瞬間にすべてのスタックのバックグラウンド・カラー(backgroundColor)が同じ色に変わります。メインスタックのフォーグラウンド・カラー(foregroundColor)の色を設定していたら、すべてのスタックにある文字、テキスト・フィールドもボタンのレイベルも同じ色になります。サブスタックを選んでバックグラウンド(backgroundColor)を変えてみると、そのサブスタックだけのカラーが変わります。hierarchy)のオーナー(owner)のプロパティ(property)は、スタック内のカードにも、カード上にあるすべてのコントロールにも及びます。上にも書いているように、これも使い方しだいで便利にも不便にもなる事で、重要なのはLiveCodeのこういうクセを予め知っておく事です。hierarchy)が適用される訳ではなく、ウインドウ・タイトル・バーの形式を決めるデコレーション(decoration)は、スタックそれぞれで決める事ができます。OSのタイトル・バーのデコレーション、右の列がWindowsのデコレーションです。スタックの必要に応じて変えられます。スクリプトでは下のようになります。クオートの中に入れるコントロールのリストは、図の赤枠を見てください。OSではコントロール・リストの「menu」は、タイトル・バーには見えません。close」に設定しなさい。デフォルトにすると、すべてのコントロール・リストがタイトル・バーに現れます。切り抜きウインドウアプリケーションを開いた直後に見せる、スプラッシュの切り抜きウインドウのサンプルを作ります。スプラッシュだけとは限りません。始めにフォトショップなどでPINGファイルを作ってください。下のサンプルPINGファイルは、ダウンロードできます。http://kenjikojima.com/livecode/download/LCShape.pngこれはスクリプトで操作というより、イメージをうまく作れるかなどがより重要になります。透明ファイルを作ります。図のグレーの格子になっている部分は透明です。それ以外の部分がウインドウの形になります。このPING原稿は400x400で作っていますから、そのサイズのメインスタックを作ります。スタックはリサイズ(resize)できないようにします。File...」で、透明のあるPINGファイルをインポ-トします。可)インポートしたら、イメージのプロパティー・インスペクターで「ID」を確認してください。windowShape)を、上で確認した「ID」の「1003」にすると、PINGイメージの透明部分が切り抜きとなって、ウインドウのシェイプが現れます。スクリプトでは、こういう表現になります。このスタックのウインドウシェイプ(windowShape)を(ID)1003に設定しなさい。直線で形を作るのはさほど難しくはないのですが、カーブのラインをきれいに切り抜こうとするのは、ちょっとしたコツが必要です。透明部分をアンチエイリアスで作ったりすると、かなり汚くなります。普通アンチアイリアスの中間トーンは、バックの白地にとけ込んできれいに見えるはずですが、そのあいまいなトーンもすべてウインドウの形になって現れてくるためです。そのあたりの注意をしながら、透明イメージを作ってください。タイトルバーなしで、動かせるウインドウもうひとつ大事なポイントがあります。切り抜きウインドウを作ると、スプラッシュのように自動的に次のスタック・ウインドウが開かれれば問題ないですが、ウインドウのタイトルバーがないので、どこかにウインドウを動かすハンドルを付けなくてはいけません。ここでは、ウインドウのどこででもマウスで動かせるように、下記のスクリプトを全体を覆っているイメージ内に書き込んでいます。ローカル(local)を使っています。)でつないで、同じオブジェクトのどのハンドラー内でも使える、ローカルのバリアブル「lAllowDrag」に入れます。「mouseH」はマウスのXポジション、「mouseV」はマウスのYポジションを返すファンクションです。ハンドラー「mouseMove」では、バリアブル「lAllowDrag」(マウスのXYポジション)がエンプティ(empty)であれば、ハンドラー「mouseMove」から実行が抜けます。それ以外、つまり「lAllowDrag」にXYポジションがあれば、スタックのトップレフト(topLeft)をグローバルロック(globalLoc)に変換した、スタックの「0,0」に移動させます。0(トップレフト)」から「X,Y」のローカル・ポジションです。lAllowDrag)」は、始めにマウスダン(mouseDown)したポジションからの差を、XYポジションにしています。マウスアップ(mouseUp)されるまで「lAllowDrag」は同じ値です。グローバル・ポイントに変換して返しますハンドラー「mouseUp」が実行されたら、バリアブル「lAllowDrag」をエンプティ(empty)にして、マウスムーブ(mouseMove)から抜けます。切り抜きウインドウにアプリケーションの機能を作ったら、ウインドウを閉じる設定も必要ですから、このサンプルでは右上にスタックを閉じるボタンを付けました。透明のボタンを切り抜きイメージの中に作った、右上の小さな四角のアイコンの上に乗せて終了ボタンにします。Tipsスタンドアロンにすると、メインスタックの変更保存ができないので、それをうまく使えるプロジェクトを始めから考えておきます。カスタム・プロパティをサブスタックに保存すると、メインスタックの書き換えも可能になります。開発の初期から時々スタンドアロンを作っておくと、完全に書類が完成してからのトラブルよりも、修正ができてダメージも少なくてすみます。スタンドアロンにする時、セッティングの「Stacks」でスタックファイルのフォルダーを作っておけば、複数のサブスタックを1つにまとめられます。hierarchy)から、サブスタッックを逃すひとつの方法は、メインスタックの始めのカードに「preOpenStack」や「openStack」を書く方法があります。切り抜きウインドウの透明イメージをPINGやGIFFで作る時、輪郭をアンチエイリアスにすると、透明部分に影響が出てかえって汚くなる事がありますから、注意してください。