GO BACK

REALbasic教室 その5


「その他のGUIを使う」


■メニューを使う


 ウインドウと並んで重要なGUIといえば「メニュー」です。メニューは、REALbasicでは専用のエディタを使って簡単に作ることができます。新規にプロジェクトを作ると、Projectウインドウに必ず「Menu」という項目が作成されるはずですね。これが、デフォルトで設定されるメニューなのです。

 これをダブルクリックしてみてください。画面にメニューを編集するメニューエディタウインドウが現れます。マウスでメニューバー部分をクリックしてみてください。「File」メニューに「Quit」が、「Edit」メニューに「Undo/Cut/Copy/Paste/Clear」が既に組込まれているはずです。

 それぞれの項目をクリックすると、その項目の属性がPropertiesパレットに現れます。ここで「Text」を変更すれば表示するテキストを変更できますし、BoldやItalicをチェックすればボールドやイタリックのメニュー項目を作ることができます。またCommandKeyにアルファベットを入力すればコマンド+任意キーのショートカットが作れます。

 新しいメニュー項目を作りたいときは、一番下(メニューバー部分では一番右)にある空白のメニュー項目をクリックし、Textプロパティに表示するテキストを入力します。他の場所にメニュー項目を追加したい場合も、まず一番下の空白に新しい項目を作り、それをマウスでドラッグして他の場所に移動します。

では、簡単な例として、Appleメニューにアバウトメニューをつけてみましょう。

1.まずメニューエディタでAppleメニューをクリックし、そこにある空白の項目を選択します。

2.そしてPropertiesパレットの「Name」に「aboutMenuItem」と入力します。これがプログラム内からメニューを利用する場合の名前になります。

3.もう一つ「Text」に「about MyApp...」と入力します。これが実際にメニュー項目に表示されるテキストになります。


■メニューハンドラを作る


 さて、これでメニューそのものはできたんですが、このままではメニューは使えません。実際にRunさせてみると、作ったメニュー項目は選択できないディスエーブル状態のまま表示されてしまうのです。

 なぜこうなるのか。どうもREALbasicでは、自作したメニューはディスエーブルの状態で作成されるようです。それを使うためには、起動時に「これをこれは使用可能な状態にします」ということを指定しておかないといけないのです。

 それを行うのが、EnableMenuItemsというイベントです。これはメニューの使用状態をまとめて定義するための専用イベントです。コードブラウザを開き、「Events」の中を探してみてください。きっと見つかるはずです。ここに、以下のように記述をします。

Sub EnableMenuItems()
	aboutMenuItem.enabled = true
End Sub

 これでOK。Runさせてみてください。先ほど作成したaboutメニューがちゃんと使える状態になっているはずです。

 ここで行ったのは、メニューの「enabled」というプロパティをtrueに変更する、という処理です。enabledというのはメニューがイネーブル状態(つまり使用可能な状態)かどうかを示すプロパティで、これがtrueならば使用可能、falseならば使用不可となります。

 さて、これでメニューはできました。次はメニューに機能を組込みましょう。例として、このaboutメニューを選んだら何かのメッセージを表示するようにしてみます。

 メニューを選んだときの処理は「メニューハンドラ」という特別なサブルーチンを作成して行います。コードブラウザを開き、「Edit」メニューから「New Menu Handler...」を選んでみてください。画面にメニューハンドラ作成のためのウインドウが現れます。ここで、ポップアップメニューより先ほど作成した「aboutMenuItem」を選んでOKすると、aboutMenuItemを選んだときに呼び出されるメニューハンドラがコードブラウザに作成されます。

 あとは、このハンドラ部分に、実行する命令を書けばいいわけです。例として、msgBoxで何か表示させてみましょう。

Function Action As Boolean
	msgBox "これは私のアプリです。"
End Function

 これで完成です。Runしてaboutメニューを選ぶと、ちゃんとアラートウインドウが表示されますよ。

 このメニューハンドラは、ちょっと変な形をしています。今までのイベントやサブルーチンは「Sub ○○」という形でしたが、これは「Function ○○」という形をしていますね。これは、このサブルーチンが「関数」として定義されている、ということを示します。

 まあ、まだ自分で関数やサブルーチンを定義するところまでいっていないので、どう違うのかよくわからないかと思いますが、「サブルーチンの中にはSubで定義するものとFunctionで定義するものがあるのだ」ということぐらいは頭に入れておくとよいでしょう。


■チェックボックスとラジオボタン


 この他のGUIについてもいくつか触れておきましょう。まずはチェックボックスです。クリックするとチェックマークが入る、あれですね。チェックボックスの使い方は非常に簡単です。ただCheckBox部品をドラッグ&ドロップで配置するだけ。クリックしたときにON/OFFする処理はREALbasicが勝手に行ってくれるので、何もプログラムを書く必要はありません。

 似たようなものにラジオボタンがあります。これはいくつかの項目から1つだけを選ぶのに使うGUIですね。こちらもそのままRadioButton部品をいくつか配置すれば、それらをクリックすると自動的に1つだけ選択されるようになります。

 ただし、ラジオボタンの方は、そのまま配置しただけだと常に1つのウインドウに1グループだけになります。例えば「こっちの2つと、そっちの3つは別々のグループとしてそれぞれ1つだけ選べるようにしたい」と思っても、REALbasicは勝手に「全部の中から1つだけ」を選ぶようにしてしまうのです。

 このように複数のグループを作りたい場合は、「GroupBox」という部品を作ってください。これはラジオボタンをグループ分けするための専用部品です。この部品をグループの数だけ配置し、ラジオボタンをこのGroupBoxの中に配置すると、それぞれのグループごとにON/OFFできるようになります。

 では、これらチェックボックス/ラジオボタンをプログラム内から利用するにはどうすればいいでしょうか。これらのON/OFFの状態は、その部品の「Value」というプロパティで得ることができます。この値がtrueであればONであり、falseであればOFFになっている、というわけです。

 ですから、例えば「A」「B」という2つのRadioButtonがあって、そのどちらがONになっているかをチェックして動くプログラムを作りたいような場合は、

Sub Action()
	If A.Value = true Then
		……Aのときの命令……
	Else
		……Bのときの命令……
	End If
End Sub

――こんな感じで書けば、ラジオボタンの状態によって動きを変えるプログラムを作ることができます。意外と簡単でしょう?


■ポップアップメニューとリストボックス


 選択項目が多くなってくると、ラジオボタンというのは場所をとるし使いにくくなります。そうなるともっと別のGUIが必要になるでしょう。それは「ポップアップメニュー」や「リストボックス」といったものです。

 ポップアップメニューは、文字通りマウスでプレスするとその場でメニューが現れるものですね。これは「PopupMenu」という部品で作れます。また、リストボックスというのは、選択する項目が表示されたテキストフィールドのようなもので、これもクリックして項目を選ぶのに重宝します。

 いずれも、表示される項目というのはプロパティとして用意されています。DR1r.34以降のバージョンでは「InitialValue」というプロパティがありますが、これが表示する項目を設定するためのものです。

 このプロパティ部分にある「Edit」というボタンをクリックすると、画面に項目を組込むためのウインドウが現れます。ここで、表示する項目をそれぞれ改行して記述しOKすれば、その項目が部品に表示されるようになります。

 これらを使ったプログラムを作るには、覚えておく必要のあることが2つあります。1つは「選択したときに何かの処理をするにはどうすればいいか」ということであり、もう1つは「現在選択されている項目をどうやって知るのか」ということです。この2つがわかれば、ちょっとしたプログラムは作れそうですね。

 最初の「選択したときに実行させる」には、部品に用意されている「Change」というイベントを使います。これは、選択が変わったときに自動的に呼び出されるイベントです。ですから、何も選択しなかったり、同じものを選択したときには動作しません。

 もう一つの「現在選択されている項目」を知る方法はいくつかあります。もっとも簡単なのは「Text」プロパティを使うものです。これらの部品では、現在選択されている項目のテキストがTextに設定されるのです。例えば、

Sub Change()
	msgBox PopupMenu1.Text
End Sub

――このようにすれば、PopupMenu1の選択した項目を画面に表示することができます。非常に簡単ですね。

 ただし、この方法は「値を取ることはできるが、変更することはできない」という欠点があります。例えば「PopupMenu1.Text = "A"」というようにして「A」という項目を選択させたりすることはできないのです。プログラムで選択項目を変更するには、他の方法をとらなければいけません。

 それは、「listIndex」プロパティを使う方法です。これは、選択されている項目の番号を示すプロパティです。これが1ならば1つめの項目が選択されていることになるわけです。どれも選択されていないときは値は-1になります。

 このプロパティを使えば、ポップアップメニューなどをプログラムで選択させることが可能になります。例えば、

Sub Action()
	PopupMenu1.listIndex = 1
End Sub

――このようにすれば、PopupMenu1の最初の項目を選択した状態にすることができるというわけです。

 ただし、注意しなければいけないのは「listIndexを変更した場合も、その部品のChangeイベントは発生する」ということです。ですから、部品のChangeイベントに何かの処理を書いてあれば、listIndexを変更するとChangeイベントも実行されることになります。


■コンテクストメニューを使う


 もう一つ、ついでといってはなんですが「コンテクストメニュー」も覚えておきましょう。コンテクストメニューはMacOS 8からサポートになった機能で、コントロールキーを押してマウスをプレスするとポップアップで現れる、あのメニューのことですね。

 これはContextualMenuという部品(Toolsパレットの一番左下)を使います。が、この部品をウインドウに配置しただけではメニューは使えるようにはなりません。ちょっと面倒な手順を覚えなくてはなりません。

 まず、ContextualMenuを1つウインドウに配置します。これはTimerなどと同じく見えない部品の一種で、これを配置しただけでは何も起きません。

 メニューを使えるようにするには、まず「メニューを初期化するopenイベントの定義」を行います。コードブラウザを開き、ContextualMenuの中にある「open」というイベントを選択してください。そして、ここに以下のように記述します。

Sub Open()
	ContextualMenu1.addrow "AAA"
	ContextualMenu1.addrow "BBB"
	ContextualMenu1.addrow "CCC"
End Sub

 これは、「AAA」「BBB」「CCC」という3つのメニュー項目をContextualMenu1に組込むプログラムです。ContextualMenuへのメニューの組み込みは、ここで使っている「addrow」というメソッドを使って行います。「《ContextualMenu》.addrow "メニュー名"」というように実行すると、そのメニュー項目を組込むのです。

 次に、メニューを選んだときの処理をContextualMenuの中にある「Action」イベントに組込みます。

Sub Action(item As String)
	msgBox item
End Sub

 とりあえずここでは、選んだメニュー名を画面に表示することにします。ContextualMenuのActionには、パラメータが1つだけ用意されています。ここに、選択した項目が文字列としていれられるのです。ですからこの変数itemを調べれば、どのメニューが選ばれたかわかるというわけです。

 これで終わりかというと、実はまだ完成ではありません。最後に、「ウインドウをコントロール+クリックしたときコンテクストメニューを呼び出す」という処理をしないといけません。「Events」にある「MouseDown」を選択し、以下のように記述してください。

Function MouseDown(X As Integer, Y As Integer) As Boolean
	if isCMMClick then
		ContextualMenu1.open
	end if
End Function

 ここでは、ifでまず「isCMMClick」というものを調べています。これは、コンテクストメニューを呼び出す形でマウスダウンされているかをチェックするもので、これがtrueならばコンテクストメニューの呼び出しを要求していると判断します。

 そして、if部分で「ContextualMenu1.open」とopenイベントを呼び出しています。これでコンテクストメニューが画面に呼び出されるというわけです。

 コンテクストメニューはちょっと使い方が難しいのですが、実際に自分のアプリケーションでメニューが使えるようになるとちょっと嬉しいものです。ぜひ試してみてください。


GO NEXT


GO HOME