プログラム講座 初級編5

- ミニミニ時計を作ってみよう -

 初級編5です。今回は簡単な「時計」を作ってみましょう。この時計の作成で「アプリケーションの作り方」と「アップデートイベントの処理」を勉強する事にしましょう。



◆アバウト画面
 今回は前回同様にアバウト画面をリソースエディタで作成してください。そしてファイル名をeasy5.resにしてください。これ以外は前回と同じ手順になります。
 初級編3、4で使ったイベント選択、メニュー選択部分も流用していますので、詳しい解説はそちらを読んで下さい。



◆アップデートイベント
 今回勉強する部分は、この「アップデート」です。アップデートというのは端的に書くと「画面再描画」になります。これはどのようなものかというと、下に隠れていたウィンドウが前面に出てきた場合、ウィンドウの中身を書き換える必要があります。この「書き替え要求」が「アップデートイベント」としてプログラムに送られてきます。
 もし、このイベントがやってきても書き換えを行う関数(ルーチン)がないと、ウィンドウは真っ白け(背景色)になってしまいます。よく使うPRINT文などが、そうです。文字とかを表示しても上にウィンドウを置いて動かしたりすると、白く抜けてしまいます。
 こうならないためにプログラムで書き換えを行う必要があります。今回は「時計」ですので「1秒ごと」「アップデートイベントがきた時」に書き替えればOKです。



◆時刻の表示部分
 アップデートイベントと1秒ごとに時計を表示しますが、この部分は全く同じ関数になります。
 まず、あらかじめ開かれているウィンドウ(移動可能ダイアログにしてあります)の中身を消します。ウィンドウの中身(文字、画像)を消すにはいくつかの方法がありますが、今回は一番簡単なCLS命令を使います。CLSとすれば全部消してくれます。
 今まで文字を表示する際には、システムであらかじめ設定されたフォント(大阪)を使用していました。今回はフォントを指定しサイズを変更してみましょう。  フォントを設定するにはTEXT命令を使います。この命令は以下のようになっています。

TEXT フォント名,表示サイズ,スタイル,転送モード

 フォント名というのはワープロやSimpleTextなどのメニューにあるフォントの名前です。ROMなどにすでに入っているフォントやシステムフォント、アプリケーションフォントは定数として定義されています。具体的には以下のフォントが定数として登録されています。

_sysFont
システムフォント(漢字Talkでは大阪)
_applFont
アプリケーションフォント(漢字Talkでは大阪)
_newYork
_times
_venice(最近のシステムでは入っていません)
_helvetica
_geneva
_courier
_monaco
_london(最近のシステムでは入っていません)
_athens(最近のシステムでは入っていません)
_sanFran(最近のシステムでは入っていません)
_toronto(最近のシステムでは入っていません)
_cairo(最近のシステムでは入っていません)
_losAngeles(最近のシステムでは入っていません)
_symbol
_mobile(最近のシステムでは入っていません)

 フォントメニューからフォントを選択して表示させたりする場合は、それなりの方法が必要です。これについては、また別の機会に解説します。

 表示サイズは「ポイント」で指定します。ごくごく普通に使用しているものと変わりません。1〜32767ポイントまで指定できます。TrueTypeでない場合は最大127ポイントまでです。

 スタイルというのは「ボールド」「イタリック」など文字修飾の事です。以下の文字修飾が標準で定義されています。

 標準の場合は、0を指定します。それ以外の場合は+記号で加算して使用します。例えば斜体にして影付き文字にするには以下のようにします。

TEXT _sysFont,9,_italicBit%+_shadowBit%

 転送モードというのは、文字を表示する場合に、すでに表示されている部分とどのように組み合わせて表示するか?という指定です。これはFuture BASIC II-Jのリファレンスマニュアル309ページに実際の表示例が掲載されていますので、そちらを参考にして下さい。通常使う分には_srcCopyでいいでしょう。文字を重ね合わせたい場合やグラフィックと重ね合わせる場合は、_srcOrを使います。

 だいぶ長くなりましたが、フォントを指定したら後は表示させればOKです。いきなりToolBoxのQuickDrawの関数を呼び出してもいいのですが、初級編という事で一番簡単なPRINT文を使用しました。PRINT文の最後にセミコロン(;)がつけてありますが、これがないと勝手に改行されてしまい、表示が見えなくなってしまいます。


◆アップデートイベントの処理
 今回の目玉?である「アップデート処理」の部分です。とは言ってもすでに描画部分はできていますので、アップデートイベントがきたかどうかを調べて、アップデートイベントであれば、さきほどの表示ルーチンを呼び出せばいいという具合になっています。
 さて、ここでアップデートイベントをどうやって取得するか?ですが、これにはDIALOG(0)命令を使用します。この命令を使うと、どのイベントが発生しているのか調べてくれます。アップデートイベントは「ウィンドウ再描画」イベントとしてやってきます。このイベントは定数で定義されていて_wndRefreshとなっています。後は取得してきたイベントがこの_wndRefreshだったら、表示関数を呼び出せばいいというわけです。実際に見てもらえばわかりますが2行しかありません。Macのプログラミング解説書は、偉そうに(?)、またぎょうぎょうしく書いてありますが、肝心な部分さえわかれば後は応用です。とにかく、なるほどこういう具合にやればいいんだな、と理解してくれれば十分です。
 実は、まだ重要な部分が抜けています。というのは、このイベントを処理させるために、ここでイベントを処理しているよ、という事をFuture BASICに教えてやらなければいけません。このイベント処理の場所を教えるのがON DIALOG FN 関数名です。実際のプログラムを見てもらえばわかりますが至って簡単です。

 最後にもう1つあります。それは「1秒ごとに表示関数を呼び出す」というものです。これも便利な命令が用意されています。ON TIMER(秒数) FN 関数名とするだけで、指定秒数毎に関数を呼び出してくれます。ここに表示関数を指定し1秒毎に呼び出すようにしてやればできあがりです。



◆アプリケーションにする
 さて、これでプログラムは作成し終わりました。が、今まではFuture BASIC上から実行(Command+R)していましたが、今回はそうではなくて「単体のアプリケーション」にしてダブルクリックで起動して使えるようにします。
 アプリケーションにするには「Command+B」キーを押せばOKです。するとダイアログが出てきますので適当な名前を付けます。後でいくらでも変更できます。後はちょっと待っていればアプリケーションができあがります。
 場合によってはFuture BASICと共存できない場合もありますので注意が必要です。また、最初のFuture BASIC II-Jではデバッガーのスイッチが常にオンになってしまっているのでオフにしてからアプリケーションを作成する必要があります。正規ユーザーであれば、すでに新しいCD-ROMがモモデラーズブランドから送られてきているはずですので、新しいものをインストール(実際はコピーするだけですが)してください。


◆終わりに
 今回は簡単な時計を作ってみましたが、いろいろ改良して自分なりの時計を作ってみて下さい。例えば定時にアラームが鳴るようにするとか、グラフィックが表示されるとかいった具合にいろいろ挑戦してみてください。きっとよい勉強になると思います。
 次回は、まだネタが決まっておりません(^^; 何にしよう・・・



◆今回のプログラムリスト
RESOURCES "easy5.res" ' "時刻をウィンドウに表示する" LOCAL FN displayTime WINDOW OUTPUT #1 CLS TEXT _sysFont,9 PRINT TIME$; END FN ' "アップデートイベントを処理" LOCAL FN eventProc evnt = DIALOG(0) IF evnt = _wndRefresh THEN FN displayTime END FN ' "メニュー構築" LOCAL FN initMenu APPLE MENU "時計について..." 'File Menu MENU 1,0,_enable,"ファイル" MENU 1,1,_enable,"/Q終 了" END FN ' "Aboutの処理" LOCAL FN ABOUT err% = FN ALERT(128,0) END FN ' "メニュー分岐処理" LOCAL FN doMenu menuID = MENU(_menuID): ' "どのメニューバー項目かな?" itemID = MENU(_itemID): ' "選択項目は何かな?" SELECT menuID CASE 255,127 SELECT itemID CASE 1 FN ABOUT: ' "About...が選択されたので呼び出す" END SELECT CASE 1 : ' Quit Menu SELECT itemID CASE 1: END END SELECT END SELECT MENU END FN ON TIMER(1) FN displayTime ON MENU FN doMenu ON DIALOG FN eventProc FN initMenu WINDOW OFF WINDOW #1,"時 計",(4,42)-(4+48,42+12),_dialogMovable WHILE 1 HANDLEEVENTS WEND