プログラム講座 初級編3
- メニューの選択処理 -
初級編3です。今回はMacintoshで必ずといっていいほど使用される「メニュー」について解説します。このメニューの部分を理解すれば、作成できるアプリケーションも、いくらか体裁を整える事ができます。
◆メニューの作成と、表示について
メニューと一口に言ってもいくつか種類があります。とは言ってもFuture BASICで用意されているか、いないかといった程度の違いしかありません。
まずは、一番左端に表示されている「アップルメニュー」の作り方(?)から説明しましょう。通常アップルメニューの一番上には「このアプリケーションについて...」といった内容のメニューが来ます(英語ではAbout...といった具合になります)。そして、その下にアップルメニューフォルダの内容が表示されます。
「なんか面倒な事をしなければいけないのだろうか?」
その心配はありません。Future BASICでは非常に簡単に作る事ができます。例えば一番上のメニュー項目を「マイクロソフトを倒す方法について...」という具合にしたければ以下のようにします。
APPLE MENU "マイクロソフトを倒す方法について..."
これだけです。これで自動的にアップルメニューができあがってしまいます。簡単ですね。
次にファイルメニューについて説明します。標準でもファイルメニューはありますが、ここでは自前のものにしましょう。メニューバーに表示される文字は「ファイル」とし、そのメニュー項目は「File...」「Quit」にしましょう。このような独自のメニューを作る場合は「MENU」命令を使用します。この命令は次のような書式になっています。
MENU メニューバーの番号,項目番号,選択可能フラグ,項目内容
メニューバーの番号はアップルメニューが127(または255)、その次が1、2、3、4・・・・といった具合になります。今回のファイルメニューはアップルメニューの隣りなので「1」になります。
項目番号というのはメニュー項目を表示させたときの上からの番号になります。番号がゼロの場合は「メニューバーに表示される」部分になり、1以降が実際に選択する項目になります。今回は「0がファイル」「1がFile...」「2がQuit」になります。
選択可能フラグはメニュー項目が選択可能かどうかを示すものです。選択可能なものは「_enable」で選択不可能なものは「_disable」になります。そのほかにも指定できますが、今回は使用しません。ちなみにMacでは選択不可能な項目はハイライト表示されませんが、Windows 95では、そんな事はおかまいなしにハイライト表示してくれます。
項目内容は実際に表示される文字やアイコンになります(直接アイコンは指定できません)。
Macintoshのメニュー項目の中には「キーボードショートカット」ができるものがあります。今回のメニューでもこのキーボードショートカットを使えるようにしてみましょう。このキーボードしょーっとカットというのは「コマンドキー(林檎マークのキー)」と英数字/モディファイキーを同時に押す事をいいます。
Macの場合、勝手にキーを割り当てる事はできません。いくつかのキーはお約束という事で決められています。以下のキーは大抵どのアプリケーションでも共通となっています。
A:全てのオブジェクトを選択
C:コピー
N:新規作成
O:ファイルを開く
P:印刷
Q:終了
S:保存
V:ペースト
X:カット
Z:取り消し
.:処理を中断
これ以外の割り当ては基本的に自由です。ただし文字を扱うエディタやワープロなどの場合は以下のものも共通に割り当てられます。
B:ボールド(太字)
I:イタリック(斜体)
U:アンダーライン(下線)
これだけ把握しておけば大丈夫でしょう。今回はファイルと終了しかありません。これはそれぞれ以下のように割り当てすればいい事になります。
File...は「O」(オー)
Quitは「Q」
このキーボードショートカットを定義するには次のようにします。
/文字
/Oといった具合にメニュー項目の所に書けばいいだけです。つまり今回のものはそれぞれ、
"/OFile..."
"/QQuit"
とすればいいという事です。
メニューの定義は、これだけ覚えておけば大丈夫でしょう。次はメニューが選択された場合の処理について説明します。
◆メニューイベント
メニューが選択された場合、どこのメニューのどの項目が選択されたのか調べる必要があります。これらを調べるにはMENU()関数を使います。
まず、どのメニューかを調べるには次のようにします。
menuID = MENU(_menuID)
これで、前に設定したメニュー番号がかえってきます。
さらにその選択されたメニューの何番目の項目かを調べるには次のようにします。
itemID = MENU(_itemID)
これらは、お決まりパターンですので一度作ったプログラムを使い回せばいいでしょう。
さてメニュー番号に応じてそれぞれ処理を行いますが、従来のようにIF〜THEN命令でやってもいいのですが、もっと見やすくわかりやすく記述できる命令があります。SELECT〜CASEという便利な命令があります。これは1つの変数が複数の値を持ち条件分岐させるときに非常に便利です。C言語であればswitch(n)〜case命令と同じです。
このSELECT〜CASE文は以下の書式になっています。
SELECT 調べる変数名
CASE 調べる値
変数の値が調べる値だった場合の処理
CASE 調べる値
変数の値が調べる値だった場合の処理
:
:
END SELECT
これが、わかれば今回のプログラムは十分理解できるでしょう。
今回使用しているメニュー選択処理の最後でMENUという命令が入れてありますが、これには理由があります。この命令を消して実行させればわかりますが、選択したメニューの部分がハイライト表示(反転表示)したままになってしまいます。これを元に戻すためにMENU命令を入れてあります。
◆イベント処理
メニューを定義し、メニュー選択による分岐処理も作りましたが、このままでは駄目です。Macintoshは「イベントドリブン(イベント駆動型)」のプログラムスタイル(?)というか処理をしなければなりません。C言語などでは、いちいちXXのイベントがなんたらと調べなければなりませんが、Future BASICではHANDLEEVENTSという1命令で終わってしまいます。非常に簡単です。後は条件を満たすまでループさせてやればOKです。今回はDO〜UNTIL命令で繰り返していますが、実際にはエンドレスループにしても変わりません。というのは今回のプログラムは終了メニューが選択された時点でEND命令で強制的に終了させてしまっているからです。
実はこれだけでは駄目でメニュー選択関数があることを教えておく必要があります。これは「ON MENU FN 関数名」と書いておくだけでメニュー選択時に自動的にその関数を呼び出してくれるようになります。
◆終わりに
今回はメニューの作成とメニューイベントの処理が主な目的ですので、サンプルプログラムはメニューを選択すると「XXXが選択されました」といったたぐいのメッセージを表示するだけです。実際には、この部分でいろいろな関数を呼び出したり処理を行います。
◆今回のプログラムリスト
' "メニューの初期化関数"
LOCAL FN initMenu
APPLE MENU "About..."
'File Menu
MENU 1,0,_enable,"ファイル"
MENU 1,1,_enable,"/OFile..."
MENU 1,2,_enable,"/QQuit"
END FN
' "メニューが選択された場合の処理関数"
LOCAL FN doMenus
menuID = MENU(_menuID): ' "どのメニューバー項目かな?"
itemID = MENU(_itemID): ' "選択項目は何かな?"
SELECT menuID
CASE 255,127
SELECT itemID
CASE 1
PRINT "About...が選択されました"
END SELECT
CASE 1 : ' File Menu
SELECT itemID
CASE 1: ' Open...
PRINT "File...が選択されました"
CASE 2
PRINT "Quit...が選択されました"
BEEP
END
END SELECT
END SELECT
MENU
END FN
ON MENU FN doMenus: ' "メニューが選択された場合の呼び出し先"
FN initMenu: ' "ここでメニュー初期化部分を呼び出します"
DO
HANDLEEVENTS
UNTIL theProgramEnds
END