プログラム講座 初級編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