プログラム講座 中級編25
- メニューの点滅回数を設定する -
中級編25です。今回は「メニューの点滅回数を設定する」ユーティリティを作成してみます。今まで解説していない「ダイアログ」を使ってみます。
◆点滅回数の設定方法
Macintoshはメニューバーから、メニュー項目を選択すると、選択されたことがわかるようにメニュー項目が点滅します。コントロールパネルの一般設定で、この点滅回数を設定する事ができます。コンパネと同等の機能だけでなく、任意に点滅回数を設定できるようにしてみます。
メニュー項目の点滅回数を設定するには以下の呼び出しを使います。
CALL SETMENUFLASH(点滅回数)
点滅回数が0の場合は点滅しなくなります。1行で終わってしまうものですが、これをちゃんとした(?)アプリケーションとして作成してみます。メニューの点滅回数はメニューバーから選択するようにし、1、2、3回まではメニューを選択した時点で設定されるようにし、それ以外であれば「ダイアログ」を表示して数値を入力してもらうようにします。その場合、31以上の値が入力されたら警告を出すようにします(この場合は点滅回数は設定しません)。
◆ダイアログの作成
ダイアログはリソースエディタで作成しておく場合と、Future BASICの命令を組み合わせて作成する方法があります。Future BASICで作成する場合は、Button, Edit field等の命令を使います。ここでは、手抜きをしてリソースエディタで作成してしまいます(こっちの方が速いので)。
今まではアラートダイアログをアバウト画面の表示に使用していましたが、今回は以下の3つのダイアログが必要です。
(1)アバウト画面用のダイアログ(id = 129)
(2)点滅回数入力用のダイアログ(id = 128)
(3)入力エラーの時のダイアログ(id = 130)
カッコ内のidはダイアログのidです。このプログラムでは直接指定したり変数にしていますが、普通はグローバル変数定義の部分(プログラムの一番先頭です)で定数として定義しておくべきでしょう。
ダイアログをリソースから読み込んで使用するには次の命令を使います。
dPtr& = FN GETNEWDIALOG(リソース番号, 作成場所, 表示優先順位)
リソース番号はリソースエディタで作成したダイアログのidを指定します。作成場所はあまり気にする必要はなく通常は0にしておけば大丈夫です(0がヒープに、それ以外であればスタック上に作成される)。表示優先順位は-1が最前面になり0であれば最後面になります。
このようにすれば、リソースを読み込んで表示してくれます。
◆ダイアログ表示後の処理
ダイアログが表示された後に行う事は、数値が入力されてリターンキーが押されるか、設定ボタンが押されるまで待つことです。この処理を通常のイベントループとして組み込んでしまうと面倒になってしまいます。そこで、ダイアログが表示されたらリターンキーが押されるか設定ボタンが押されるまで待つ処理を行います。
ダイアログ内のボタンが押されたかどうかを調べるには次の命令を使います。
CALL MODALDIALOG(0,item%)
この命令を実行するとitem%に押されたボタンや入力されたり変更されたボタンの「項目番号」が入ります。このプログラムでは「設定」ボタンは「項目番号=1」としてリソースエディタで作成してあります。つまり次のようにすると設定ボタンが押されるまで自動的に処理を行ってくれます。
最初の引数の0というのは、本当はここに「コールバックルーチン」のアドレスを指定します。0を指定すると「コールバックルーチンはない」という事になります。他のコールバックルーチンも同様で0を指定すると「コールバックルーチンはなし」とみなされます。
DO
CALL MODALDIALOG(0,item%)
UNTIL item% = 1
数字の入力処理などは全く行う必要はありません。
設定ボタンが押された後、入力された数字を読み込む必要があります。入力された値(実際は文字列)を調べるには2段階の作業?が必要です。まず入力された文字へのハンドルを求める必要があります。そのハンドルから今度は文字列を読み込みます。次の2行が、これらの処理を行っています。
CALL GETDITEM(ダイアログポインタ,項目番号,項目の種類,項目へのハンドル,矩形サイズ)
CALL GETITEXT(項目へのハンドル,文字列)
ダイアログポインタは、すでにダイアログを作成した時に得ていますので、それをそのまま指定します。項目番号ですが、このプログラムでは数値入力の項目番号は3にしてありますので3を指定します(リソースエディタで作成した項目番号です)。項目の種類は指定する必要はなく、逆に指定した変数に種類が入ります。項目へのハンドルは指定した項目へのハンドルが返ってきます。この項目へのハンドルを次の命令で使用します。矩形サイズは項目の表示サイズが返ってきます。
GETDITEMで得た項目へのハンドルをGETITEXTで指定し、文字列変数を指定すると文字列変数に入力した文字列が返ってきます。文字列を数値に変換するにはVAL命令を使います。この命令を使うと数値に変換可能な文字列であれば数値に変換されます。もし変換できない場合は0になります。
◆ストップアラートの表示
アラートといってもToolboxには標準でいくつか用意されています。数値の範囲が異常だった場合、どのアラートを表示しても良いのですが、今回はストップアイコンのついたアラートを表示してみましょう。
やる事は今までのアバウト画面の表示で使っていた方法と全く同じで、命令の名前だけが異なるだけです。通常、
err% = FN ALERT(id%,0)
とするところを
err% = FN STOPALERT(id%,0)
にすればストップアイコンがついたアラートが表示されます。他にも
err% = FN CAUTIONALERT(id%,0)
err% = FN NOTEALERT(id%,0)
があります。変更しても害はありませんでプログラムを書き換えて試してみるとよいでしょう。
◆終わりに
ちょっとした「ユーティリティ系」のものであれば初心者でも気軽に作ることが出来ます。問題は、どのようなインターフェースにするか、うまく使えるようにするか、形にするか?といった所です。プログラムに慣れないうちは、とてもそこまで手が回りませんが、次第にそういった部分へ労力を注げるようになると思います。
次回予告は、ありません。でも、講座はまだまだ続きます・・・(いつまで続く^^?)
◆今回のプログラムリスト
'--------------------------------------------------------
' "メニュー点滅回数設定アプリケーション"
'--------------------------------------------------------
OUTPUT FILE "SetFlash"
RESOURCES "dialog.res"
gQuit_flag = _false: ' "終了フラグ (_zTrueになるとプログラムは終了)"
END GLOBALS
'--------------------------------------------------------
' "メニュー点滅回数の設定(その他...の場合はダイアログを表示)"
'--------------------------------------------------------
LOCAL FN setFlash(Number%)
editText_Number = 3: ' "数値入力の項目番号(リソース番号じゃなくて項目番号)"
error_dialog = 130: ' "数値が範囲外の時に出る警告のアラートリソース番号"
set_dialog = 128: ' "点滅回数を設定するダイアログのリソース番号"
LONG IF Number% < 4
CALL SETMENUFLASH(Number%): ' "メニューの点滅回数を設定"
XELSE
dPtr& = FN GETNEWDIALOG(set_dialog,0,-1): ' "リソース(id=128)からダイアログを作成&表示"
DO
CALL MODALDIALOG(0,item%): ' "押された項目番号が入る"
UNTIL item% = 1: ' "[設定]ボタン(id=1にしてある)が押されるまで繰り返す"
CALL GETDITEM(dPtr&,editText_Number,itemType%,itemHandle&,itemRect):' "ダイアログの項目のハンドルを得るため"
CALL GETITEXT(itemHandle&,theValue$): ' "ダイアログの項目から文字列を得る"
CALL DISPOSDIALOG(dPtr&): ' "不要になったのでダイアログを破棄"
count% = VAL(theValue$): ' "ダイアログの入力された項目から数字を求める"
LONG IF ( count% < 30 ) AND ( count% > -1 )
CALL SETMENUFLASH(count%): ' "メニューの点滅回数を設定"
XELSE
err% = FN STOPALERT(error_dialog,0): ' "警告アラートダイアログを表示(設定された回数が多すぎる)"
END IF
END IF
END FN
'--------------------------------------------------------
' "アバウト画面の表示"
'--------------------------------------------------------
LOCAL FN about
err = FN ALERT(129,0): ' "アバウト画面の表示 (ALRTリソースid = 129)"
END FN
'--------------------------------------------------------
' "メニューの作成"
'--------------------------------------------------------
LOCAL FN initMenu
APPLE MENU "SetFlashについて...": ' "Apple Menuにこの項目を追加"
' "ファイルメニューの作成
MENU 1,0,_enable,"ファイル"
MENU 1,1,_enable,"/Q終 了"
' "編集メニューの作成(自動)"
EDIT MENU 2
' "点滅回数メニューの作成"
MENU 3,0,_enable,"点滅回数"
MENU 3,1,_enable,"1回"
MENU 3,2,_enable,"2回"
MENU 3,3,_enable,"3回"
MENU 3,4,_enable,"その他..."
END FN
'---------------------------------------------
' "メニューの選択"
'---------------------------------------------
LOCAL FN doMenus
menuID = MENU(_menuID): '"選択されたメニューバー項目の番号"
itemID = MENU(_itemID): '"プルダウンメニューで選択された項目番号"
SELECT menuID
CASE 255: ' "アバウト画面の表示"
FN about
CASE 1 : ' "ファイルメニュー"
SELECT itemID
CASE 1: ' "用紙設定"
gQuit_flag = _true
END SELECT
CASE 3:
FN setFlash(itemID): ' "メニューバーの点滅回数を設定"
END SELECT
MENU: ' "これがないとメニューバーの項目が強調表示されたまま"
END FN
'---------------------------------------------
' "メインルーチン"
'---------------------------------------------
WINDOW OFF: ' "起動後ウィンドウを表示しない"
ON MENU FN doMenus: ' "メニューイベントを設定"
FN initMenu: ' "メニューバーを構築"
DO
HANDLEEVENTS: ' "イベントループ"
UNTIL gQuit_flag
END