[ SuperCard ] [ Delphi ] [ SmalltalkAgents ]

Building Simple Application in SuperCard

[ Updated: Apr 7, 1997 ]


SuperCard でデジタル時計を作る

ざっと紹介
ウィンドウを作る
メソッドを作る
メニューを作る
メニュー・バーを構築するスクリプトを書く
スタンドアロンのアプリケーションを作る

ざっと紹介

SuperCard とは何ですか?

SuperCard は、サンディエゴに拠点を置く Allegiant Technologies, Inc. が開発・販売しているマルチメディア・オーサリング・システムです。1989 年に初めて公表されて以来、SuperCard は、他のツールには見られない機能を提供し続けています。つまり、マッキントッシュにおけるすべてのスタイルのウィンドウを作成可能であり、ウィンドウを同時に複数開くことができます(マルチウィンドウ)。5種類のアニメーション形式をサポートし、ビットマップとドロー・グラフィックの両方を使用することができます。真の意味でのリスト・オブジェクト、プレイントーク(TM) を含めて拡張されたサウンド処理、メニュ・オブジェクトの機能や、さらに他にもユニークな機能を備えています。SuperCard 2.5 は、アメリカにおいて「ベスト・マルチメディア・オーサリング・パッケージ」として 1995 年度の「マックエディ」賞を獲得しました。

SuperCard の核心には、そのスクリプト言語である SuperTalk があります。SuperTalk は、HyperTalk 1.2.x の上位互換スクリプト言語であり、SuperCard のユニークな特徴を生かすために機能拡張された言語です。

このように多様な特徴を織り込まれた SuperCard は、商業エンターテインメント・ソフトウェア、インタラクティブ・トレーニング教材、キオスク、データベース・フロントエンド、チュートリアル、電子雑誌、そして無数の直販・注文開発アプリケーションなど、多様なソフトウェアの開発に使用され、数々の成功を勝ち得てきました。

"SuperCard FAQ 日本語版 ver.2" (SCUJ 大島久雄監訳) より

ふつうの Macintosh ユーザなら HyperCard に関してはご存知でしょう。SuperCard は HyperCard がマルチ・ウィンドウになり、カラーを扱えるようになったとイメージしておけば、あながち間違いではありません。カードというメタファの呪縛がある点も同様です。登載されている言語やオブジェクト階層構造も、拡張されていますが (例えば、Draw や Paint 等の Graphics Object がメソッドを格納できます) ひじょうによく似ています。Hypertalk 語族の一派とも言える Lingo (Director に登載されている script 言語) と同じく、それぞれの差異を認識しておれば、環境の移行は割りとスムーズに行くかもしれません。ちなみに、伝統的に Hypertalk 語族ではメソッドをハンドラと呼称します。これはオブジェクトを返すファンクション・ハンドラと返さないメッセージ・ハンドラの 2 種類に別れます。

HyperCard と同じように、SuperCard が持つオブジェクトの階層構造は、ひじょうに単純明快です。そのため、全体構造が把握しやすく、とっつきやすいものになっています。反面、各オブジェクトはインスタンスのみを生成し、クラスの作成をユーザに許さないため、その限定されたオブジェクト以外を用いたい場合は、非常にやっかいな作業を伴います。

SuperCard が持つオブジェクトの階層構造 SuperCard が持つコンポーネント

SuperCard でのアプリケーション作成手順は、SuperEdit という編集環境と、SuperCard という実行環境の間を行き来しながら開発を進め、最終的に Standalone Maker によってアプリケーションを作るということになります。実行環境は Runtime Editor (3.0.1E では Project Editor) と呼ばれるランタイムでの編集機能も持っており、実行環境のままで編集作業を進めることも可能です。なお、ランタイム環境である SuperCard Player の元で project ファイルをアプリケーションに変換することなく実行させることも可能ですが、ここでは触れないことにします。

  1. Project を作成する。
  2. 最低 1 枚の Window を作成し、そのなかに最低 1 枚の Card を作成する。
  3. Runtime Editor (3.0.1E では Project Editor) / SuperEdit <-> SuperCard を駆使して Project を仕上げる。
  4. Standalone Maker でスタンド・アロンのアプリケーションを作成する。 (Standalone Maker はアプリケーション作成に必要なリソースを保持しておくこともできる)
という手順になります。作成されたアプリケーションは、基本的には SuperEdit では再編集できませんが、ResEdit 等を用いて Creator/Type を書き換えることにより、再度編集可能な状態に戻すことができます。

それではさっそく始めてみましょう。対象ヴァージョンは 3.0.1E (2.0E でも可) です。

[ go to top ]

3.0.1E で、 2.0E で作成された project ファイルを開く際の注意事項

なお、 3.0.1E では Runtime Editor が機能強化され Project Editor に生まれ変わりました。これは佳いんですが、なぜか type と creator も変更されたため、2.0E で作成された project ファイルは開くことができません。一度コンヴァートする必要があります。


Project Browser Opening

SuperCard アプリケーションを立ち上げると、このようなオープニング・ダイアログが現れるので、「既存のプロジェクトを開く」を選択し、「開く...」ボタンをクリックして、コンヴァートしたい project ファイルを指定します。変換が開始されます。


Project Browser

無事に変換が終わると、Project Browser が開きます。一度変換してしまえば、あとの作業は 2.0E でも 3.0.1E でも変わりはありません。

[ go to top ]

ウィンドウを作る

編集環境である SuperEdit を立ち上げます。編集する Project を選択するダイアログが現われるので、ここでは新しい Project を起こすため、New を選びます。 自動的に Window が 1 つ作成され、そのなかに Card が 1 枚作られます。この時点で、一度 save しておきます。Project 名は "showTime.proj " にしておきます。

テキスト・フィールドを 1 つ置きます。FieldName を timeField とします。作ったフィールドをダブル・クリックしてプロパティ・ダイアログを出し、ユーザにテキストを編集させないために、LockText プロパティをチェックします。表示されるフォントを変えたい場合は、適宜変更します。コンテンツの文字列表示のスタイル等も、必要があれば、そのプロパティを変更します。ここではアライン・プロパティを中央揃えに設定しています。

ボタンを 1 つ作成します。ButtonName を Quit とします。 作ったボタンをダブル・クリックしてプロパティ・ダイアログを出し、AutoHilite, ShowName プロパティをチェックします。リターン・キーが利くようにデフォルト・ボタンにしたい場合は、Default プロパティもチェックします。

ウィンドウの中味はこれで終わりですが、ウィンドウと言っても、ここではカードというメタファを格納するオブジェクトでしかありません。つまり、ウィンドウをリサイズしても、そこに含まれるカード上のオブジェクトの配置位置は変化しません。リサイズにオブジェクトを追随させるには、リサイズに応答するメソッドを書く必要があります。リサイズに応答するオブジェクトはウィンドウですから、ウィンドウ・スクリプトにリサイズ・ハンドラを設定し、そのなかで自分の上に乗っているオブジェクト群を移動またはリサイズさせます。わりと面倒くさいです。ここでは、ウィンドウは固定サイズのものを使っています。

Window Info... メニューで開かれるダイアログで WindowName を設定します。ここで設定された名前がタイトル・バーに表示されます。

[ go to top ]

メソッドを作る

次いで、メソッドを作成します。メソッドはオブジェクト階層構造中のどこへでも格納できます。

テキスト・フィールドは、外部から書き込まれるだけなので、ここでは触りません。 「終了」ボタンは、クリックされたら、確認して終わるという動作を行います。ボタンをダブル・クリックして、ダイアログから Script ボタンを押すか、オブジェクトを選択後、Object Script メニューを選択するかして、Script Editor を開きます。ここに、上記の動作を書き込んでも佳いのですが、メニューから終了する方法もあるため、Script を散らさないように、ここでは、ユーザ・メソッドを呼ぶだけにしておきます。

on mouseUp
  quitAPP
end mouseUp

さて、時刻を表示し、それを更新するにはどうすればいいでしょうか。日付は date 関数で、時刻は time 関数で、それぞれ取得することができます。が、これでは、呼ばれた時でないと動きません。これを自動的に呼ぶようにするにはどうしたらいいでしょうか。

実は、SuperCard は (HyperCard も同じですが) イベント・ループをユーザが管理しなくてもすむように、アイドル状態では常に、idle というメッセージをオブジェクトに送り続けています。これを知っていれば、簡単です。テキスト・フィールド以降の階層中のどこかのオブジェクトで、idle メッセージを捕捉してしまえば佳いのです。ここでは、何も考えずに、ボタンとフィールドが置かれている Card の Script で捕まえてみます。

on idle
  put the long date & return & the long time into cd fld "timeField"
  pass idle
end idle 

pass idle は、idle というメッセージをここで処理するが、イベント・キューから削除せず、さらに上位のオブジェクトに渡すという意味です。super idle みたいなもんだと思っておけば間違いありません。date 関数、time 関数には、 long というオプションが付いてますが、下図を観れば、何を返すのか、想像が付きますね。

ここまで作ったら動くでしょうか。File メニューから Run させてみましょう。save するかどうか聞かれたら、save してください。どうでしょうか。ちゃんと動いていると思います。

では「終了」ボタンを押して編集環境に戻りましょう。おっと、ここで、"Never heard of that handler. " と、お叱りがあるはずです。そうでした。ボタンのクリックで、quitAPP というメソッド (ハンドラ) を呼んでいますが、これは (まだ) どこにも定義されていません。そのため、エラー・ダイアログが表示されたのでした。では定義しましょう。エラー・ダイアログから、Quit で抜けて、編集環境に戻ってください。 quitAPP メソッドも、どこで定義しても佳いのですが、ここでは Project Script に書いておきます。

on quitAPP
    answer "Are you sure?" with "Continue" or "Quit"
    if (it = "Continue") then
        exit quitAPP
    end if
    close all wds
end quitAPP

SuperCard では、すべてのウィンドウを閉じてしまえば、Project / Application は終了します。逆にいえば、ウィンドウを持たないアプリケーションは作れないということになります。 メソッドの意味は判りますね。"Quit" ボタンと "Continue" ボタンを持ち、"Are you sure?" という文字列を表示するダイアログを出して、ユーザの応答を待ちます。"Continue" ボタンが押されたら、何もせずにメソッドを抜けます。そうでなければ、すべてのウィンドウを閉じて終了します。

[ go to top ]

メニューを作る

ついでに、メニューも作っておきましょう。メニュー・バーは、ユーザが明示的に作成しないと表示されません。SuperEdit から Run させると出てくるメニューは、実は Runtime Editor が持っているものなのです。 ここで作成するメニューは、Apple メニューは About だけ、File メニューも Quit だけの簡単なものです。それでも、Apple メニューでは、ちゃんと (いわゆる) DA メニュー以下も表示されます。


Apple Menu


File Menu

[ go to top ]

メニュー・バーを構築するスクリプトを書く

スタンドアロンのアプリケーションにするためには、メニュー・バーの構築が必要です。残念ながらメニュー・アイテムを作っただけで自動的にメニュー・バーが構築されるわけではありません。Project script の startUp メソッドを修正します。 startUp メソッドは、Project / Application の起動時に、一度だけ呼ばれるメソッドです。

on startUp
    -- editor
    set the lockMenus to true
    repeat with count = 1 to the number of menus
        insert menu count
    end repeat
    set the lockMenus to false
end startUp

デフォルトで、startUp メソッドの中味が "editor" となっているはずです。これは Runtime Editor を呼び出しています。Runtime Editor はオブジェクト階層構造から言うと、project よりも上位に位置し、スタンドアロンのアプリケーションでは、もちろん、組み込まれないので、忘れずに削除するか、コメント化しておきます。

これは「おまじない」みたいなもんです。こうやっておけば、空のメニュー・バーにユーザが作成したアイテムをひとつづつ付加していきます。lockMenus プロパティを変更しているのは、メニュー・バーを構築したあと、一気に表示するためです。ロックしないと、ぱらぱらと追加されていきます。が、別にロックしなくても支障はありません。

これで、Project の作成は完了しました。およそ、5600 byte ほどの小さな project file ができているはずです。ちなみに 3.0.1E では 8500 byte ほどになりました。

[ go to top ]

スタンドアロンのアプリケーションを作る

では、この project から Standalone Maker でスタンドアロンのアプリケーションを作ってみましょう。

SuperCard / SuperEdit を終了し、Standalone Maker を立ち上げます。 Standalone Maker 3.0 では、オプション指定がさらに追加されていて、 script の保護もできるようになっていますが、基本的に画面は同じです。 Welcome ウィンドウが開くので、 "Create New Configuration File" を選択します。"Project:" ボタンで先ほどの showTime.proj を選択します。Resources, Documents (BNDL, FREF およびその ICON) は今回は必要ないので設定しないでおきます。"Hardware Platform:" は、そうですね、"PowerPC" にでもしておきましょうか。PowerMac をお持ちでない方は、68K か Fat にしてください。"Application Name:" も適当な名前を付けてください。本来は、きちんと設定すべきですが、その他はデフォルトのままにしておきます。


Standalone Maker


New Options

"Make" ボタンで、スタンドアロン・アプリケーションを作成します。およそ、711600 byte ほどのアプリケーションができました (3.0.1E では 1.2MB ほどになりました。デカい!)。立ち上げてみてください。きちんと動いていると思います。

が、一つだけ、欠点があります。このアプリケーションは、idle メッセージで動いています。idle メッセージは、当然ながら、イベントが何もないときのみに送られます。試しに、ウィンドウ内のどこかで、マウスを押しっぱなしにしてみてください。この状態では、ずっと mouseDown / mouseStillDown メッセージが送られるため、idle メッセージが送られません。そのため、表示も止まってしまいます。SuperCard 2.0E には、Thread や Process などという便利なものはないので、ちとやっかいです。方法としては、いろんなイベントのデフォルト・ハンドラをオーバーライドして、その中で idle を呼ぶというのが考えられます。また、VBL 等のタスクに登録してしまうという手もあります。この場合は、C, Pascal などコード・リソースを作成できる環境で、XCMD, XFCN を書くことになります。

駆け足ながら、SuperCard でのアプリケーション作成を追いかけて観ました。ひじょうに簡単であることがお判りいただけたかと思います。実際に作成したのは、わずか 40 ステップ程度です。C や Pascal ではどれくらいのステップ数を必要とするでしょうか。もちろん、これはツール・パレットや、その下に見えているクラス・ライブラリのおかげです (クラス・ライブラリを持たない C や Pascal と比較するのは卑怯ですね)。SuperCard (Hypertalk 語族) では、このライブラリが見慣れた Macintosh のオブジェクト群のように見えます。そのため、直観的に触ることができますし、立ち上がりも、また、速い、と言うことができます。

[ go to top ]


Created: Sep 1, 1996
[ SuperCard ] [ Delphi ] [ SmalltalkAgents ]