Visual Basic 業務アプリ構築法 第32回

アプリケーションにメニューを付ける
長谷川裕行
2000/12/12

長谷川 裕行 (はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。

VBの基本操作、Windowsアプリケーションの仕組み、データベースの扱い、ユーザーインターフェイスの設計、モジュール別開発、ネットワークへの対応…と、VBによる業務アプリケーション開発のノウハウを紹介してきました。
いよいよ最後の仕上げです。作成したアプリケーションにメニューを設けましょう。


業務アプリケーションとメニュー

ここで言うメニューとは、ウィンドウのタイトルバーの下に表示されるメニューバーです。メニューの作り方の説明に入る前に、ひとつ考えておきたいことがあります。「業務アプリケーションにメニューは必要か?」という問題です。


- メニューには基準がある -

ワープロや表計算ソフトなどの汎用アプリケーションでは、以下のような形が一般的であることはご存じでしょう。

ファイル(F) 編集(E)
  開く(O)   切り取り(T)
  保存(S)   コピー(C)
  名前を付けて保存(A)   貼り付け(P)
 
終了(X)
   

不特定多数のユーザーが戸惑うことなくアプリケーションを操作できるようにするため、基本的な構造は統一されています。
無論、目的や機能が異なればメニュー構造も異なってきますが、基本的な構造がアプリケーションごとに異なっていてはユーザーが戸惑います。そのため、最低限の基本ルールが定めてあるのです。


- 業務アプリケーションはワープロと違う -

では、業務アプリケーションの場合にも、ワープロや表計算ソフトと同じようなメニュー構成にする必要があるでしょうか?
もちろん、最低限の基本ルールは守る必要があります。しかし、「受注を記録する」「在庫を調べる」といったように単一目的であることが多い業務アプリケーションは、そもそも一般的な汎用アプリケーションと同じ機能を搭載することが少ないため、メニュー項目自体が異なってきます。
業務アプリケーションの場合、基本的な処理の選択は、ウィンドウに配置されたコマンドボタンのクリックで行います。つまり、初期状態で表示されるウィンドウ自体がメニューなのです。
一方ワープロでは初期状態で文書作成画面、表計算ソフトでは新規ワークシートの画面となり、ユーザーは各自の目的に沿った操作を行います。汎用アプリケーションと業務アプリケーションの操作はまったく異なるのです。メニュー構造も別物であると捉えておきましょう。


- メニュー画面にメニューは要らない -

受注管理処理の場合を例にしましょう。初期状態のウィンドウには、以下のような処理選択用ボタンが並ぶでしょう。

[基本処理]
受注入力、受注訂正、受注伝票発行、などを実行

[日次処理]
日次集計、集計表印刷、などを実行

[月次処理]
月次集計、集計表発行、などを実行

[随時処理]
商品データ保守、得意先データ保守、日付設定、などを実行

[終了]

この画面でメニューを作るとしたら、どのような項目と構成が考えられるでしょう? どう考えても「ファイル(F)」→「新規作成(N)」や「編集(E)」→「コピー(C)」などの項目は登場しません。
作るとすれば、上に示したボタンの項目と同じ構成となるでしょう。しかしそれなら、わざわざメニューバーを使わなくても、ウィンドウ上の大きなボタンをクリックすればよいことになります。
せいぜい、終了処理と操作説明のためのヘルプメニュー程度で十分でしょう。これも、必須のものではありません。


- 個々の処理では必要な場合もある -

初期画面から分岐した各処理の中ではどうでしょう?
例えば「商品データの保守」処理では、商品マスターテーブルのデータを追加したり書き換えたりするときに、クリップボード経由でデータをコピーすることがあるかもしれません。そのような場合には、「編集(E)」→「切り取り(T)」などのメニュー項目も必要になるでしょう
また、伝票発行や集計表の印刷では、「ファイル(F)」→「印刷(P)」メニューが必要になるでしょう。これらの処理も、基本的にはフォーム上のコマンドボタンに割り当てます。しかし、それとは別にメニュー項目としても用意しておくことで、ユーザーの利便性が高まります。

VBでクリップボードを利用するには、組み込みのCripboardオブジェクトを使います


メニューデザインの基準

Windowsでは、メニューをはじめとするユーザーインターフェイスのデザインに一定の基準が設けられています。異なるアプリケーション間で、ユーザーが操作に戸惑わないようにするためです。メニューデザインの基準を紹介しておきましょう。


- メニュー項目の分類 -

メニューでは、まずメニューバーに「ファイル」「編集」などの大分類があり、その下に小分類が設けられます。一般に、大分類を「メニュー項目」その下の小分類を「サブメニュー項目」と言います。

ファイル: ファイルやアプリケーション自身の基本的な操作
  例)新規作成、ファイルを開く、保存、印刷、終了
編集: クリップボード操作、データの部分変更、文書内の検索など
  例)元に戻す(やり直し)、切り取り、貼り付け、検索
表示: ウィンドウやデータの表示変更、設定など
  例)レイアウト表示、印刷表示、ツールバー
ツール: 補助機能の実行や基本設定の変更など
  例)マクロ、オプション
ヘルプ: アプリケーションの情報表示
  例)ヘルプ、バージョン情報


- 基本はあくまで基本 -

これらはあくまで基本的な指針であって、アプリケーションの機能などによって変更して構いません。事実、業務アプリケーションでは、先述したように「新規作成」などの項目が存在しない場合があります。
但し、上記の基本分類にはできるだけ従った方がよいでしょう。「新規作成や保存処理は不要だから」と考えて左端に「終了」メニューを持ってくると、ユーザーは戸惑います。他のアプリケーションに慣れているユーザーは、左端には「ファイル」メニューがあるもの――と考えているからです。
小分類の項目名も、基本的に同じ処理を行う項目は同じ名前にします。「印刷」を「プリントアウト」などとすると、やはりユーザーを戸惑わせます。但し、業務アプリケーションでは「伝票発行」「一覧印刷」など、ユーザーに馴染みのある具体的な処理名にしても構いません。
要は「ユーザーを戸惑わせないで、操作をスムースに導く」ことです。適切な項目名は、想定されるユーザーが「一般的なWindowsアプリケーションに慣れている人」か、それとも「業務処理上の用語に慣れている人か」によっても、変わってきます。


- 区切り線で機能を分類する -

メニュー項目をクリックすると、サブメニュー項目のリストが表示されます。「ファイル」メニューの「新規作成」「保存」と「印刷」「終了」のように、リスト内には機能的に異なる小分類が存在することもあります。その場合は、項目のリストに区切り線を入れて「機能が異なる」ことを明示します。
こういったメニュー設計の基準は、WordやExcelなどのマイクロソフト製アプリケーションを参考にするのがよいでしょう。

画面1:一般的なメニューの構成(Excel 2000の場合)


- アクセラレータキー -

メニュー項目には、1つのキーを押すだけでそれを選択できる「アクセラレータキー」が割り当てられるのが普通です。アクセラレータキーは、メニューバー上の大分類では[Alt]キーを押したまま英字キーを押すことで、その中の小分類では単に英字キーを押すことで目的の項目を選択できるようにします。
アクセラレータキーは、項目名の後ろの( )内に表示され、これも項目名との対応に一応の基準があります。

ファイル(F): Fileの意味
保存(S): Saveの意味
名前を付けて保存(A): save Asの意味
編集(E): Editの意味
コピー(C): Copyの意味
切り取り(T): Cutの意味
ヘルプ(H): Helpの意味
アプリケーション情報(A): About ...の意味


業務アプリケーションにメニューを付ける

一般のアプリケーションとは異なる業務処理用のメニュー構成を前提に、メニューの作り方を紹介しましょう。まず、ベースとなるアプリケーションの構造を把握してください。


- フォームのデザイン -

アプリケーションのフォームは画面2のようになっているとします。
コマンドボタンで、伝票種別の変更や一覧の印刷、データ表示方法の切り替えなどを行います。ソースコードはリスト1のようにしてあります。「コマンドボタンをクリックしたら、実行される処理の内容をメッセージボックスに表示する」だけです。  本来はADOコントロールによってデータベース内のデータを表示することになるのですが、サンプルなのでADOコントロールとグリッドは機能しません。

画面2:メニューを設定するフォームのデザイン
リスト1:アプリケーションのソース


- メニュー構造を決める -

このコマンドボタンの機能を、そのままメニューにも反映させることにします。メニューは以下のような構成になります。

ファイル(F) 表示(V)
  種別変更(C)   一覧表示(L)
  一覧表印刷(P)   個別表示(I)
 
終了(X)
   
  種別変更(伝票の種別を変更する)と一覧表の印刷は、どちらも処理対象のデータファイルに関連する処理なので「ファイル」メニューに分類します。一覧表示と個別表示の切り替えは、当然「表示」メニューとなります。
アクセラレータキーは、種別変更では“Change”の
“C”、一覧表示は“List”の“L”、個別表示は“Indevidual”の“I”としています。


メニューの作成

VBでは、メニューはメニューエディタというアドインツールを使って作ります。実際のメニュー作成手順を紹介しましょう。


- メニューもClickイベントを持つ -

メニューエディタで作成したメニューはオブジェクトとなり、その中のメニュー項目はさらにサブメニューを表示するポップアップ(popup)項目と、実際に処理を実行するメニュー項目とに分かれます。「ファイル」はポップアップ項目、その中の「開く」や「終了」がメニュー項目です。
実際に処理を実行するメニュー項目では、コマンドボタンと同じようにClickイベントに対するプロシージャを定義します。これによって、項目が選択されると処理が実行されます。


- コマンドボタンと同じ処理を割り当てる -

業務アプリケーションでは、1つのウィンドウ内で実行される処理が限定されているため、実行されるべき処理は基本的にフォーム上のコマンドボタンに割り当てられています。そのためメニュー項目のClickイベントでは、対応するコマンドボタンのClickイベントプロシージャを指定するだけで済む場合がほとんどです。
例えば、「商品マスターの保守」というフォームに[商品の追加][商品の削除][データの訂正]というコマンドボタンが配置されていた場合、メニューでは「ファイル(F)」の下に「追加(A)」「削除(D)」「訂正(R)」などといった小分類が並ぶでしょう。
その場合、「追加(A)」メニューでは[商品の追加]ボタンをクリックした場合と同じ処理、「削除(D)」メニューでは「商品の削除」ボタンをクリックした場合と同じ処理を実行すればよいことになります。


- メニューの作成手順(1) -
- ポップアップ項目を作る -

ここでは、メニューエディタを使って「ファイル(F)」とその下の「種別変更(C)」のメニューを作る手順を示しておきます。
メニューはフォームごとに設定します。メニューを設定したいフォームのデザイン画面(フォームウィンドウ)をアクティブにしておきましょう。

1. 「ツール(T)」→「メニューエディタ(M)」を選択します
  メニューエディタが起動します。
 
画面3:メニューエディタが起動した


2. 「キャプション(P):」に“ファイル(&F)”と入力します
3. 「名前(M):」に“popFile”と入力します
  これで、メニューバーのメニュー項目「ファイル(F)」が出来上がり、メニューエディタ下半分のリストに項目が表示されます。
  ( )内の&に続くアルファベット1文字がショートカットキーです。


- メニューの作成手順(2) -
- サブメニューを作る -

次に、このメニュー項目をクリックしたときに表示される、サブメニュー項目を設定します。サブメニュー項目は「終了(X)」だけです。

4. [次へ(N)]ボタンをクリックします
  リスト内の強調(反転)表示が1行下に移動し、新たなメニュー項目の設定ができるようになります。
5. 「キャプション(P):」に“種別変更(&C)”と入力します
6. 「名前(M):」に“mnuChangeSheet”と入力します
7. リストのすぐ上にある[→]ボタンをクリックします
  これで、リスト内の「種別変更(&C)」の項目が右に移動し ‥‥種別変更(&C)

と表示されます。

画面4:メニュー項目とサブメニュー項目が設定された


- メニューを完成させる -

メニューエディタでは、
メニューバー上の項目(大分類)は一番左側に、
そのサブメニュー項目(小分類)はメニューバーの項目の下に設定して
[→]ボタンで1段階右に移動
という操作でメニューを設定していくことになります。
同じ要領で、残りの項目も設定していきます。表1を参考にしてください。
区切り線は「キャプション(P)」に“-”(1バイトの-記号)を入力します。メニューとしては機能しませんが、名前を付ける必要があります。

画面5:メニューの設定が完了した
表1:メニュー項目と名前の対応


- プロシージャを割り当てる -

メニューの設定を終えると、フォームのデザイン画面に画面5のようなメニューバーが表示されます。
この段階では、まだメニュー項目に処理が割り当てられていません。メニューの各項目が選択されたときに実行される処理は、Clickイベントに対するプロシージャとして定義します。
フォームウィンドウでメニューの「ファイル(F)」をクリックすると、画面6のようにサブメニューがオープンします。「伝票種別変更(C)」を選択するとコードウィンドウがオープンし、

Private Sub mnuChangeSheet_Click()
End Sub

というソースコードが表示されます。
ここでは、コマンドボタン“cmdChangeSheet”がクリックされたときと同じ処理をさせればよいので、プロシージャ内のソースは

cmdChangeSheet_Click

となります。つまり、
cmdChangeSheet([伝票種別変更]ボタン)がクリックされた時に実行されるイベントプロシージャを、メニューの「伝票種別変更(C)」が選択されたときにも実行するということです。

画面6:フォームにメニューバーが表示された
画面7:処理を設定したいサブメニュー項目を選択する


- メニューのClickイベント -

このように、メニューの項目もClickイベントによってプロシージャを実行するようになっています。
同じ要領で、残るメニュー項目
一覧表印刷(P)、終了(X)、一覧表示(L)、個別表示(I)にも、イベントプロシージャを入力しましょう。リスト2のようになります。
一覧表示のmnuViewList_Clickと個別表示のmnuViewIndiv_Clickでは、オプションボタンの値を変更してからcmdChangeView_Clickを呼び出すようにしています。

リスト2:メニューのClickイベントに対するプロシージャのソース


- メニューの完成 -

これでアプリケーションを実行すると、画面7のようにメニューが表示されて、コマンドボタンのクリック時と同じように動作します。

画面8:メニューが機能する

今回のサンプル・プロジェクトは、以下の2つを用意しています。
321: コマンドボタンのみでメニューの存在しないアプリケーション
322: 321にメニューを追加したアプリケーション
コンパイル済みの実行ファイルはex321.exe(メニューなし)とex322.exe(メニューあり)です。それぞれの違いを確かめてください。
なお、サンプルでは画面表示のためにADOコントロールとDataGridコントロールを組み込んでいます。


メニューの制御

メニュー作成の基本的な手順を紹介しました。作成したメニューをアプリケーション中で制御する方法を、簡単に紹介しておきます。


- メニュー項目の有効/無効 -

アプリケーションの実行中に、処理の流れによっては特定のメニュー項目を無効にしたい場合があります。メニュー項目はコマンドボタンなどと同じオブジェクトなので、有効/無効はEnableプロパティで制御できます。
例えば、「表示(V)」→「個別表示(I)」を無効にするなら

mnuViewIndiv.Enable = False

とします。再度有効にしたい場合は、

mnuViewIndiv.Enable = True

とします。メニューエディタでメニューを登録した直後では、標準ですべての項目のEnableプロパティはTrueになっています。


- チェックマーク付きメニュー項目 -

メニュー項目名の前(左側)にチェックマークを付けるには、Checkedプロパティを使います。通常はFalseとなっていますが、これをTrueにすると項目名の前にチェックマーク(レ)が表示されます。
メニューエディタで項目を選択して「チェック(C)」チェックボックスをONにすれば、初期状態でチェックされた形になります。
アプリケーション内では、Checkedプロパティの値を調べて処理を切り替えることになります。その場合、メニュー項目に対応するイベントプロシージャ内で、メニュー項目が選択されるたびにCheckedプロパティのTrue/Falseを切り替える処理を設ける必要があります。これを忘れると、チェックマークが付いたままとなります。



アプリケーションにメニューを付け、それを制御する方法を紹介してきました。しかし業務アプリケーションでは、処理の基本はあくまでコマンドボタンによる処理選択にあります。
ワープロや表計算ソフトとは目的が異なることを踏まえ、扱いやすいユーザーインターフェイスをデザインしてください。

DownloadVBプロジェクトファイル
のダウンロード(Ex321.LZH)

(LZH形式 7.45KB)


DownloadVBプロジェクトファイル
のダウンロード(Ex322.LZH)

(LZH形式 8.25KB)
Copyright © MESCIUS inc. All rights reserved.