# 区画、メニュー、メッセージの作成と編集

ほとんどのアプリケーション・ビルダのオブジェクトはウィンドウ、区画、またはコントロ ール・パレットからドラッグします。いくつかのオブジェクト(階層化された区画、区画 ウィンドウ、メニュー、およびメッセージ)は 作成されたオブジ ェクトです。本章では、これらのオブジェクトの作成、使用、および編集方法を説明しま す。

ABUG.crobj.mkr.2
ABUG.crobj.mkr.4
ABUG.crobj.mkr.7
ABUG.crobj.mkr.11
ABUG.crobj.mkr.12
ABUG.crobj.mkr.19
ABUG.crobj.mkr.20
ABUG.crobj.mkr.25

## 区画エンティティの作成と編集

アプリケーション・ビルダの主ウィンドウ上には、コントロール区画、テキスト区画、描画 領域区画、端末区画という4種類の区画オブジェクトがあります。さらに、子区画、階層 化された区画、区画ウィンドウという3種類の作成された区画エン ティティがあります。

### 子区画

子区画は、コントロール区画上にドロップされ、コントロール区画の「子」になる テキスト区画、端末区画、または描画領域区画です。例えば、アプリケーション・ビルダの ラベル属性エディタにあるラベル・フィールドはコントロール区画の子のテキスト区画です。

### 子区画を作成するには

1. インタフェース内のコントロール区画上に、テキスト区画、描画領域区画、端末区画をドロップします。

   メッセージ・ダイアログ・ボックスが表示され、コントロール区画の子として区画をドロップするか、または階層化された区画としてドロップするかを選択します。

   [取消]をクリックすると、子区画または階層化された区画は作成されません。

2. [子]をクリックします。

   区画は、コントロール・オブジェクトと同じように、ドロップした位置に作成されます。 区画は、コントロール区画上にあるコントロール・オブジェクトの兄弟になります。 他のコントロール・オブジェクトと同じように、区画を選択しコントロール区画上を移動 することができます。

### 階層化された区画

階層化された区画は、2つ以上の区画が「重なって」います。例えば、アプリケーション・ビルダで、それぞれのインタフェース・オブジェクトの属性を表示するのに使用される属性エディタは階層化された区画です。

### 階層化された区画を作成するには

1. 区画をインタフェース内の別の区画にドロップします。

   メッセージ・ダイアログ・ボックスが表示され、階層化された区画を作成するオプションを 選択します。

   コントロール区画上に、テキスト区画、描画領域区画、または端末区画をドロップしたときは、 コントロール区画の子としてオブジェクトを作成かどうかを選択します。

   [取消]をクリックすると、子区画または階層化された区画は作成されません。

2. [階層]をクリックします。

   区画は、ドロップした区画の一番上に階層化された区画として作成されます。元の区画と 同じサイズであるため、元の区画は完全に隠れてしまいます。階層化された区画のサイズ を変更するには、すべての区画のサイズを変更します。階層化された区画の階層を表示する方法は、 ABUG.crobj.mkr.6を参照してください。

   インタフェースが完成した後、階層化された区画内の区画のサイズ・ポリシーを[内容に合 わせる]に変更することができます。(デフォルト値は[固定]です。インタフェースが完成 するまでは、デフォルト値のままにしておくべきです。)それぞれの区画ののサイズが 異なっている場合があります。

階層化された区画を元に戻す直接的な方法はありませんが、 階層の1つを選択し、アプリケーション・ビルダの[編集]メニューまたは、ポップアップ・ メニュー(インタフェースまたはモジュール・ブラウザで、マウス・ボタン3を押すこと によって表示されます)の1つからから[カット]を選択することで、行うことはできます。

カットした階層を保存するには、空のウィンドウを選択し[編集]メニューから[ペースト] を選択します。階層がなくなる(ブラウザで容易に確認できます)まで、カットとペースト を繰り返します。 階層を保存しないときは、[カット]のかわりに[削除]を選択します。

### 階層化された区画を表示するには

階層化された区画の1つの階層のみ表示できます。他の階層化された区画を表示するには、 次のようにします。

1. インタフェースまたはモジュール・プラウザで、表示されている階層化された区画 を選択します。

   階層化された区画をブラウザで選択すると、インタフェース内で、選択した区画を、区画 の重なりの一番上にポップできません。

2. 主ウィンドウの[表示]メニューまたはインタフェースのポップアップ・メニュー(マウス・ ボタン3を押すことで表示されます)から[次の階層]を選択します。

   現在の区画のすぐ下の階層が表示されます。他の階層を表示するには、この操作を繰り返 してください。

### 区画ウィンドウ

区画ウィンドウは、複数の区画を持つ仮想ウィンドウ内にある2つ以上の区画 の組合せ(コントロール、テキスト、描画領域、または端末区画のいずれかの組合せ)で、 移動可能なサッシで区切られています。区画ウィンドウが一定の高さを保っている間、 個々の区画はサッシの移動に合わせて小さくなったり大きくなったりします。

区画ウィンドウのサイズと位置の初期値は、その区画のサイズと位置によって決定します。 区画ウィンドウの左のマージンは、一番左にある区画の左端によって決定します。 区画ウィンドウの幅は、最も幅の広い区画の幅によって決定されます。

[区画ウィンドウ]属性エディタで[区画の高さ]を設定することで、区画の高さの最大値と 最小値の限界を設定できます。詳細は、ABUG.apRPE.mkr.1を参照してください。

区画ウィンドウを作成した後、マウス・ボタン1またはマウス・ボタン2をサッシ上で押し、 それを移動することで、区画のサイズを変更することができます。

### 区画ウィンドウを作成するには

1. 区画パレットから区画をドラッグし、メイン・ダイアログまたはカスタム・ダイアログ上に ドロップします。

   区画ウィンドウと親ウィンドウの上端を合わせるには、親ウィンドウの左上隅に区画をド ロップします。区画は、親ウィンドウに対して、その左端と上端のマージンがオフセット0で 接続されます。

2. 必要であれば、区画のサイズを変更します。

   親ウィンドウの全域を区画ウィンドウにするには、親ウィンドウの右端を越えるまで、 区画の右端をドラッグします。区画が右端にも接続されます。

3. 1つ以上の追加区画をメイン・ウィンドウまたはダイアログにドラッグし、ウィンドウの空いて いる箇所にドロップします。

4. 区画ウィンドウの一部にしたいすべての区画を選択します。

   1つの区画を選択するときはマウス・ボタン1を使用し、追加区画を選択したいときはマウス・ボタン2を使用します。

5. [レイアウト]メニューまたはインタフェースまたはモジュール・ブラウザのポップアップ・ メニュー(マウス・ボタン3を押すことで表示します)から[区画ウィンドウの作成]を選択 します。

   区画ウィンドウが生成されます。

区画の1つが親ウィンドウの右端(East)に接続されていて、1つ以上の他の区画が右端に 接続されていないとき、親ウィンドウの右端に接続されていない区画の右端が、親ウィン ドウの右端に接続されます。メッセージ・ダイアログ・ボックスが表示され、区画ウィン ドウの子が異ったEastアタッチメントを持っていること、そして最も右にある区画のアタ ッチメントがEastアタッチメントに設定されたことが説明されます。 タッチメント・エディタで右のアタッチメントを調節して、[了解]をクリックします。

### 区画ウィンドウをに区画を追加するには

1. 区画ウィンドウに区画をドロップします。

   メッセージ・ダイアログ・ボックスが表示されます。コントロール区画の子として新規 区画を取り込むか(テキスト区画、描画領域区画、または端末区画をコントロール区画に ドロップしたとき)、階層化された区画を作成するか、または区画ウィンドウに追加する かを選択します。

2. [区画]をクリックし、区画ウィンドウに区画を追加します。

   区画ウィンドウの一番下に新規区画が追加されます。

### 区画ウィンドウを元に戻すには

1. 区画ウィンドウを選択します。

   区画ウィンドウを選択するには、区画ウィンドウの端をクリックします。区画ウィンドウ の周りに濃いボックスが描画されていると、その区画ウィンドウは選択されています。

   またはモジュール・ブラウザを開き、区画ウィンドウを選択します。これが、区画ウィンドウを選択する最も容易で確実な方法です。

2. [レイアウト]メニューから、またはインタフェースあるいはモジュール・ブラウザ内のポップアップ・メニュー(マウス・ボタン3を押すことによって表示されます)から、[区画ウィンドウを元に戻す]を選択します。

   区画ウィンドウを構成していた区画は、それぞれの区画に戻ります。

## メニューの作成と編集

メニュー は、意味のあるラベルを持つ項目のリストです。メニューが表示され項目が 選択されると、それぞれの項目は、実行する機能に接続されます。本節では、メニューの 作成と編集方法、オブジェクトにメニューを接続する方法、プログラムの機能にメニュー 項目を接続する方法について説明します。

メニューはメニュー・ボタン、メニューバー、項目、リスト、そして4種類の区画に接続できます。メニューは、自動的にオプション・メニューに接続します。よってメニューをオプション・メニューに接続する必要はありません。

### メニュー属性エディタ

メニュー属性エディタはメニューの作成に使用します。メニューは、属性エディタで編集 されるほとんどのオブジェクトとは異なり、作成されたオブジェクトであり、オブジェクト・パ レットから得ることはできません。

メニュー・オブジェクト特有の属性のみ、ここでは記述します。 オブジェクト型、オブジェクト、オブジェクト名、およびカラーについては、 ABUG.apRPE.mkr.2を参照してください。 項目、ラベル、項目の状態(アクティブ)についは、ABUG.apRPE.mkr.3を参照してください。

新規メニューの追加 | メニューのリストに新規メニューを追加します。
編集 | メニュー・オブジェクトのリストから選択された項目 に対して、編集機能([カット]、[コピー]、[ペースト]、 [削除])を実行します。[カット]および[コピー]は、 ペーストのために、バッファ内に選択した項目を置き ます。削除は項目を削除しますが、バッファには置かれ ません。
ティアオフ | ティアオフを[使用する]または[使用しない]を 指定します。ティアオフを使用すると、選択したメニュー は「表示可能」になります。すなわち、[ティアオフ] インジケータをクリックすると明示的に削除するまで メニューが表示されます。
項目ラベルのタイプ | [項目]リストから選択した項目にラベルのタイプ([文字列]、 [グラフィック]、[セパレータ])を指定します。 [グラフィック]を選択すると、[ラベル]が[グラフィック・ ファイル名]になります。[セパレータ]を選択すると、[ラベル] または[グラフィック・ファイル名]がアクティブでなくなり、 [線の形状]がアクティブになります。[セパレータ]メニュー 項目は、アプリケーション・ビルダの主ウィンドウの[エディタ] メニューのように、メニュー内の仕切りを作成するのに使用 します。
項目のニーモニック | メニューが表示されたとき、項目を選択するためのキーボ ード・ショートカットとして、選択された項目の1文字を 指定します。指定した文字には下線が付きます。 メニューが表示されたときにニーモニック文字を押すと、 項目が選択されます。ニーモニックとして使用する 個々の文字は大文字と小文字で区別され、メニュー内で1回しか ニーモニックとして使うことができません。
アクセラレータ | 選択された項目を選択するキーボード・ショートカット を指定します。アクセラレータは、接頭辞(Ctrl, Alt, Meta,またはShift)`<key>`、 および文字(大文字または小文字)で構成されています。 Control-xをアクセラレータにするには、 `Ctrl<key>x` と入力します テスト・モードまたはコンパイルしたアプリケーション でメニューを表示すると、Ctrl+xがメニュー項目の ラベルの右側に付けられます。メニューがあるウィンドウ をフォーカスし、コントロール・キーを押しながら、 xを入力するとメニュー項目に指定したアクションが 実行されます。 シフト・キーとその他のキーの1つを組み合わせて、 複合した接頭辞を作ることもできます。 Shift Control-xをアクセラレータにするには、 `Shift Ctrl<>` を入力します。
線の形状 | 選択されたセパレータ項目の線の形状の種類を 指定します。[項目ラベルのタイプ]が[セパレータ]の ときだけ、アクティブになります。選択肢は、[なし]、 [内側エッチング]、[外側エッチング]、 [内側エッチング・ダッシュ]、[外側エッチング・ダッシュ]、 [一本線]、[二本線]、[一本破線]、[二本破線]です。 選択された線の形状のセパレータがメニュー内に、 グラフィックまたはテキストのラベルの代わりに 表示されます。
項目のサブメニュー | [項目]リストで選択した項目のサブメニューを接続、 接続解除、作成、または編集するメニュー・ボタン およびテキスト・フィールドです。サブメニューが、 選択した項目に接続されると、テキスト・フィールド にサブメニューの名前が表示されます。 セパレータ項目の種類は無効です。

### メニューを作成するには

この説明は、メニューを作成し、別の手順でメニューをインタフェース・オ ブジェクトに接続することを想定しています。これらの手順を組み合わせるには、 ABUG.crobj.mkr.16を参照してください。

メニューはモジュール内でのみ使用できます。作成したメニューが、メニューを接続した いオブジェクトと同じモジュールにあることを確認してください。メニューは、現在の モジュールに作成されます。現在のモジュールはインタフェース内で選択されてい るものによって決ります。アプリケーション・ビルダの主ウィンドウのオブジェクト情報 領域にある[編集モジュール]は現在のモジュールを示しています。

1. アプリケーション・ビルダの主ウィンドウの[エディタ]メニューから[メニュー]を選択して、 メニュー属性エディタを表示します。

   または、属性エディタを表示して、オブジェクト型に[メニュー]を選択します。

   主ウィンドウの[エディタ]メニューから[メニュー]を選択することは、属性エディタで、 オブジェクト型が[メニュー]であるときに[ティアオフ]ボタンをクリックするのと同じ ことです。

   メニュー属性エディタの詳細は、ABUG.crobj.mkr.12を参照してください。

   現在のプロジェクトにメニューが存在しないときは、[メニュー・オブジェクト]リストは 空白、[新規メニューの追加]および[編集]ボタンだけがアクティブになります。

   現在のプロジェクトにメニューが存在しているときは、[メニュー・オブジェクト]リストに メニューがリストされます。メニューの1つをリストとから選択すると、メニュー属性が 編集のために表示されます。

2. [新規メニューの追加]をクリックします。

   メニューは、デフォルトのオブジェクト名(「menu」、「menu2」など、 名前は現在のモジュール内にあるメニューの数によって決ります。)で作成され、[項目] リストには、2つの項目(「Item1」と「Item2」)を持っています。 メニューは、メニュー名の前に現在のモジュールの名前を付けて、[メニュー・オブジェ クト]リストの終りに追加されます。[オブジェクト名]、[ティアオフ]、[項目]、 [項目ラベルのタイプ]、[ラベル][項目の状態]はデフォルトの値を持ちます。

   いくつかのメニューが必要なときは、[新規メニューの追加]を必要な回数だけクリック することで同時に作成することができます。このとき、メニュー項目に接続されるサブ メニューとして、メニューを作成することもできます。

3. ABUG.crobj.mkr.14に従って、メニューを編集します。

   メニューの作成後、すぐにそのメニューを編集できます。また、しばらくしてから編集することもで きます。

メニューを作成および編集した後、インタフェース・オブジェクトにメニューを接続し、 そして、メニュー項目と特定のアクションを接続することでメニューを機能させることができ ます。操作方法は ABUG.crobj.mkr.15とABUG.afunc.mkr.9を参照してください。 メニュー項目にサブメニューを接続するには、ABUG.crobj.mkr.17を参照してください。

### メニューを編集するには

メニューを作成した後、メニュー項目を追加したり、メニュー項目に意味のある名前を付けたり、サブメニューを追加するなどのメニューの編集が必要です。

1. アプリケーション・ビルダの[エディタ]メニューから[メニュー]を選択して、メニュー属性エディタを表示します。

   または、属性エディタを表示して、[オブジェクト型]として[メニュー]を選択します。

   エディタの詳細は、ABUG.crobj.mkr.12を参照してください。

2. 必要であれば、オブジェクト名を変更します。

   自動的に生成されるオブジェクト名は、モジュール特有なものであるため、通常、変更す る必要はありません。

3. 必要であれば、[ティアオフ]機能を使用可能にするために[使用する]をクリックします。

   これは、メニューを「表示可能」にします。すなわち、[ティアオフ]インジケータ (ドットのある行)をクリックしたとき、メニュー項目を選択してすぐにメニューを削除し ません。メニューは、明示的に削除するまで表示されます。

4. 必要であれば、[項目]リストにメニュー項目を追加します。

   [項目の追加]をクリックすると、選択した項目の後に項目が追加されます。別の編集機能を実行するには[編集]メニュー・ボタンから選択します。

5. 必要であれば、[項目]リストのメニュー項目の[項目のラベルのタイプ]を変更します。

   選択肢は、[文字列]、[グラフィック]、または[セパレータ]です。[グラフィック]を選択すると[ラベル]が[グラフィック・ファイル名]になります。[セパレータ]を選択すると[線の形状]がアクティブになります。

6. 必要であれば、選択した項目に対し、異った[ラベル]または[グラフィック・ファイル名]を入力します。

   メニュー項目のラベルを編集する最も容易な方法は、[項目]リストの一番始めの項目を 選択することです。例えば、[ラベル]フィールドでそれを行います。新しい名前を入力 して改行キーをクリックします。新しい名前が[項目]リストに表示され、リストの次の 項目が選択されます。すべてのラベルの編集が完了するまで、選択、入力、改行キーを 押すという処理を繰り返します。

   [項目ラベルのタイプ]で[グラフィック]を選択した場合、[グラフィック・ファイル名]は、 `xpm`または `xbm`グラフィック・ファイルにしなければなりません。

7. 必要であれば、[項目のニーモニック]を選択します。

   項目のラベルの1文字を入力します。メニュー項目のラベル内で、その文字には下線が付きます。メニューが表示されているとき、そのキーを押すとメニュー項目に接続されたアクションが実行されます。

   同じニーモニック文字は1つのメニューで一回以上使用することはできません。

8. 必要であれば、[アクセラレータ]を入力します。

   アクセラレータは接頭辞(Ctrl, Alt, MetaまたはShift)、`<key>`、文字 (大文字または小文字)で構成されています。詳細は、ABUG.crobj.mkr.12 を参照してください。

9. [項目ラベルのタイプ]が[セパレータ]のときは、[線の形状]を選択します。

   [線の形状]の選択肢は、ABUG.crobj.mkr.12を参照してください。

10. 必要に応じて、[項目のサブメニュー]を接続します。

    操作方法は、既存のサブメニューをメニュー項目に接続するにはABUG.crobj.mkr.17を参照してください。

11. 必要であれば、[項目の状態]を変更します。

    デフォルトの[項目の状態]は[アクティブ]です。アプリケーションが起動されるとき、 メニュー項目をアクティブでない状態にするには、[アクティブ]チェック・ボックスをクリックして、選択を解除します。

12. 必要であれば、[バックグランド]と[フォアグランド]のカラーをを選択します。

    カラーを入力するか、またはメニューから[カラー・チューザ]を選択して、カラー・チューザ からカラーを選択します。詳細は、 ABUG.edprp.mkr.5 を参照してください。

13. 必要であれば、[接続]を選択してプログラムのメニュー項目を追加します。

    操作方法は、ABUG.afunc.mkr.9を参照してください。

14. [適用]または[了解]をクリックして変更を適用します。

    [適用]]をクリックしたとき、属性エディタは表示されたままになります。

### オブジェクトに既存メニューを接続するには

以下の操作方法は、1つ以上のメニューがABUG.crobj.mkr.13に従って作成されたこと、 そしてインタフェース内のオブジェクトにメニューを接続する準備ができていることを 想定しています。メニューは、メニュー・ボタン、メニューバー項目、リスト、および 4種類の区画に接続できます。メニューは自動的にオプション・メニューに接続されます ので、オプション・メニューにメニューを接続する必要はありません。

1. メニューを接続したいオブジェクトの属性エディタを表示します。

   インタフェースまたはモジュール・ブラウザでオブジェクトをダブルクリックします。または 属性エディタで適切なオブジェクト型を選択し、[オブジェクト]リストから希望のオブ ジェクトを選択します。

2. 選択したオブジェクトに接続するメニューを選択します。

   [ポップアップ・メニュー]または[プルダウン・メニュー]メニュー・ボタン上で、マウス・ ボタン2をクリックするか、またはマウス・ボタン1か3を押します。メニューのサブメニューから適切なメニューを選択します。

   選択したメニューの名前が、[ポップアップ・メニュー]または[プルダウン・メニュー]メのテキスト・フィールドに表示されます。

3. [了解]または[適用]をクリックします。

   選択したオブジェクトに、メニューが接続されます。メニューを機能させる方法は ABUG.afunc.mkr.7を参照してください。

メニューを区画オブジェクトの1つまたはリストに接続すると、メニューは ポップアップ・メニューになります。その区画またはリスト上にカーソルがある状態で マウス・ボタン3を押すと、テスト・モードまたはコンパイルしたアプリケーションで 表示できます。

### メニューを作成および接続するには

メニューをオブジェクトに作成および接続する方法は、ABUG.crobj.mkr.13とABUG.crobj.mkr.15で説明しています。 ここで説明する方法は、メニューの作成と接続を同時に行うことができます。 最も適切な方法を選んで使用してください。

1. エディタで選択したメニューを接続したいオブジェクトの属性エディタを表示します。

   インタフェースまたはモジュール・ブラウザでオブジェクトをダブルクリックするか、または 属性エディタで適切なオブジェクト型を選択し、[オブジェクト]リストでオブジェク トを選択します。

2. いくつかのオブジェクトで使用可能なプルダウン・メニューまたはポップアップ・メニュー・タン から[新規メニューの作成]を選択します。

   プルダウン・メニューはメニュー・ボタンとメニュー・バーで使用できます。 ポップアップ・メニューはすべての区画オブジェクトとリストで使用できます。 [項目のサブメニュー]は、メニュー自身で使用できます。

   メニュー属性エディタが表示されます。[メニュー・オブジェクト]リストでは、新規に 作成したメニューが選択されています。メニューの[オブジェクト名]、[ティアオフ]、 [項目]、[項目ラベルのタイプ]、。[ラベル]、および[項目の状態]はデフォルト値 に設定されています。

   [オブジェクト名]は、「object_type_menu」、「object_type_menu2」などのような形式をとります。 これは、[新規メニューの作成]を選択したときに属性エディタで選択したオブジェクトの 型と現在のモジュールに作成されているメニューの数に依存します。 メニューは[メニュー・オブジェクト]リストの終りに追加されます。メニューの名前の 先頭には現在のモジュールの名前が付きます。

3. メニューを編集し、[了解]をクリックして変更を適用します。そしてメニュー属性エディタを終了します。

   操作方法は、ABUG.crobj.mkr.14を参照してください。メニューの編集は後で行うこともできます。

4. 属性エディタで[適用]または[了解]をクリックし、メニューを選択したオブジェクトに接続します。`
   ` `
   `

   メニューを機能させる方法は、ABUG.afunc.mkr.7を参照してください。 `
   `

### メニュー項目に既存のサブメニューを接続するには

以下の説明は、ABUG.crobj.mkr.13に従って、2つ以上のメニューを作成し、メニュー項目のサブメニューとして、 これらのメニューの1つを接続する準備がなされていることを想定しています。

1. メニュー属性エディタまたは、オブジェクト型としてメニューを選択した属性エディタを 表示します。

2. [メニュー・オブジェクト]または[オブジェクト]リストから、サブメニューを接続したい メニュー項目を含むメニューを選択します。

3. [項目]リストで、サブメニューを接続したいメニュー項目を選択します。

4. 選択したメニュー項目を接続するメニューを選択します。

   [項目のサブメニュー]メニュー・ボタン上で、マウス・ボタン2をクリックするか、またはマウス・ボタン1か3を押します。メニューのサブメニューから適切なメニューを選択します。

   選択したメニューの名前が[項目のサブメニュー]のテキスト・フィールドに表示されます。

5. [了解]または[適用]をクリックします。

   サブメニューが、、選択したメニュー項目に接続されます。サブメニューを機能させる方法は、ABUG.afunc.mkr.7を参照してください。

### サブメニューを作成および接続するには

以下の説明は、1つ以上のメニューを作成し、そのメニューの項目の1つにサブメニューを 作成および接続することを想定しています。この方法を用いると、サブメニューを作成し、 それを、1つの手順の一部として接続することはできます。この作業を別の方法で行う には、ABUG.crobj.mkr.13に従ってメニューを作成し、 ABUG.crobj.mkr.17に従ってそれをメニュー項目に接続します。 最も適切な方法を選んで使用してください。

サブメニューを作成および接続するとき、2つのエディタを使用します。1つは、メニューを 作成するエディタ、もう1つはメニュー項目にサブメニューを接続するエディタです。 メニュー属性エディタでこの作業を始めたときは、メニュー属性エディタでサブメニュー を接続し、属性エディタでそれを作成します。属性エディタで作業は始めたときは、 属性エディタでメニューを接続し、その作成はメニュー属性エディタで行います。 以下の例はメニュー属性エディタで作業をはじめることを想定しています。

1. アプリケーション・ビルダの主ウィンドウにある[エディタ]メニューから[メニュー]を選択し、メニュー属性エディタを表示します。

2. [オブジェクト]リストから、サブメニューを接続したいメニュー項目を含むメニューを選択します。

3. [項目]リストからサブメニューを接続したいメニュー項目を選択します。

4. [項目のサブメニュー]から[新規メニューの作成]を選択します。

   属性エディタが表示されます。[オブジェクト]リストでは新規メニューが選択されています。

5. メニューを編集し、[了解]をクリックして編集した変更内容を適用します。そして属性エディタを終了します。

   操作方法は、ABUG.crobj.mkr.14を参照してください。 メニューの編集は後で行うこともできます。

6. メニュー属性エディタで[適用]をクリックし、ステップ2で選択したメニュー項目にサブメニューを接続します。`
   ` `
   ` サブメニューを機能させる方法は、ABUG.afunc.mkr.9を参照してください。 `
   `

### ヘルプ・メニューを作成および接続するには

アプリケーションの主メイン・ウィンドウのメニュー・バーの右端にあるヘルプ・メニューは、 アプリケーションの共通の特徴です。ヘルプ・メニューを作成し、メニュー・バーの ヘルプ項目にそれを接続するには、次のようにします。以下の説明は、主メイン・ウィン ドウにメニュー・バーが含まれており、ヘルプがメニュー・バー項目の1つであると想定 しています。

1. 属性エディタを選択して、[メニューバー]を選択します。

   インタフェースまたはモジュール・ブラウザで適切なメニューバーをダブルクリックします。または、属性エディタの[オブジェクト型]から[メニューバー]を選択し、[オブジェクト]リストで希望のメニュー・バーを選択します。これは、通常、主メイン・ウィンドウのメニュー・バーになります。

2. [項目]リストから[ヘルプ]を選択します。

   これはメニュー・バー上のヘルプ項目になります。

3. [プルダウン・メニュー]メニュー・ボタン上で、マウス・ボタン2をクリックするか、またはマウス・ボタン1か3をクリックします。[メニュー]サブメニューから[新規メニューの作成]を選択します。

   新規メニューの名前が[プルダウン・メニュー]のテキスト・フィールドに表示され、 新規メニューを読み込んだメニュー属性エディタが表示されます。

4. メニューを編集します。

   1. 例えば、アプリケーション・ビルダのようなヘルプ・メニューにするには、[項目] リストで2つのデフォルトの項目に4つの項目を追加します。各項目を順番に選択して、 適切なラベル(概要、使い型、リファレンス、項目アイテムヘルプ、ヘルプの使い方、 [アプリケーション名 ]について、など)を入力します。

   2. 必要であれば、ニーモニックとアクセラレータを追加します。

      詳細は、ABUG.crobj.mkr.12を参照してください。

   3. 必要に応じて、メニューにその他の変更をします。

5. メニュー属性エディタで[了解]または[適用]をクリックします。

   メニューが完了し、[了解]をクリックしたときはメニュー属性エディタが終了します。

6. 属性エディタで[了解]または[適用]をクリックします。

   [ヘルプ]メニューは、メニュー・バーのヘルプ項目に接続されます。[了解]をクリックし たときは属性エディタが終了します。

## メッセージの作成と編集

この節は、メッセージ・エディタとメッセージ・ダイアログ・ボックスを作成および編集する方法を説明します。

### メッセージ・エディタ

メッセージ・エディタは、コンパイルされたアプリケーションで適時に表示される様々な 種類のメッセージを作成するのに使用します。メッセージ・エディタをABUG.crobj.mkr.21に示します。 メッセージ・エディタの操作方法は、 ABUG.crobj.mkr.22とABUG.crobj.mkr.23を参照してください。

#### メッセージ・エディタ

メッセージ | 現在のプロジェクトのすべてのメッセージをリストします。 リスト内のメッセージの名前には、モジュール名が付いています。
モジュール・メニュー | 新規メッセージを追加したいモジュールを指定します。 このモジュール名が、[メッセージ]リスト内のメッセージ名の前に 付きます。
メッセージの追加 | 新規メッセージを[メッセージ]リストと現在のプロジェクトに 追加します。 このメッセージは、モジュール・オプション・メニューで選択される モジュールのためのメッセージです。
メッセージの削除 | 選択したメッセージを削除します。
名前 | 現在のメッセージ・オブジェクトのインスタンス名を指定します。　 メッセージには、デフォルトで、「message」、「message2」、「message3」 などの名前が付いています。
ダイアログ・タイトル | メッセージ・ダイアログ・ボックスの一番上に表示される タイトルを指定します。
タイプ | 作成するメッセージのタイプを指定します。 選択肢は、エラー、情報、作業、質問、警告です。 これらのメッセージのタイプは、メッセージ・テキスト区画に表示されます。 コンパイルされたアプリケーションのメッセージ・ダイアログ・ボックスには 適切なメッセージ・アイコンが表示されます。
メッセージ・テキスト区画 | メッセージのテキストを入力するテキスト区画です。 テキストを改行したいときは改行キーを押します。メッセージ区画 の上のラベルは、選択されたメッセージのタイプに依存します。
ボタン・チェック・ボックス | メッセージ・ダイアログ・ボックスの一番下にどのボタンを 置くかを指定します。 それぞれのメッセージのタイプは、異るボタン・セットを持っています。 ボタン・セットはデフォルトで指定されています。デフォルトの選択肢は変更 できます。[アクション1]、[アクション2]、[アクション3]、[取消し]ボタンに 関連するアクションは、接続エディタで設定されます。 詳細は、ABUG.crobj.mkr.22を参照してください。
デフォルト・ボタン・メニュー | メッセージ・ダイアログのデフォルト・ボタンを指定します。
接続 | 各アクション・ボタンと取消しボタンを必要とする機能を指定する接続エディタを表示します。
ヘルプ・テキスト | ヘルプ・エディタを表示します。ヘルプ・エディタで、 メッセージ・ダイアログ・ボックスで[ヘルプ]ボタンをクリックしたときに 表示されるヘルプ・テキストを記述します。
表示ダイアログ | コンパイルしたアプリケーションで表示される実際の ダイアログ・ボックスと同じメッセージ・ダイアログ・ボックスに、 選択したメッセージを表示させるプッシュ・ボタンです。 [ヘルプ]ボタン以外のボタンをクリックするとダイアログ・ボックスは 終了します。

メッセージ・エディタの一番下にあるボタンの詳細は、ABUG.apRPE.mkr.4を参照してください。

### メッセージ・ダイアログ・ボックスを作成するには

エディタの各フィールドについては、ABUG.crobj.mkr.20を参照してください。 メッセージを表示する関数にメッセージを接続する方法とその例は、ABUG.crobj.mkr.24を参照してください。

1. アプリケーション・ビルダの主ウィンドウにある[エディタ]メニューから[メッセージ]を 選択します。

2. [メッセージ]リストの下にあるオプション・メニューから、メッセージを追加したい モジュールを選択します。

3. [メッセージの追加]をクリックします。

   固有の名前(「message」「message2」など、現在のモジュールにあるメッセージの数に依存します。)が、 [名前]フィールドに表示されます。モジュール名とメッセージ名が、[メッセージ]リスト に追加されます。

4. 必要に応じて、[名前]を編集します。

   これは、メッセージを内部的に識別するのに使用します。例えば、接続エディタなどで 使用します。この名前は、コンパイルしたメッセージ・ダイアログ・ボックスには表示 されません。

5. [ダイアログ・タイトル]フィールドにメッセージ・ダイアログのタイトルを入力します。

   これは、コンパイルされたダイアログ・ボックスのタイトル・バーに表示されます。

6. [タイプ]メニューからメッセージのタイプを選択します。

   メッセージのタイプのアイコンが、[タイプ]メニューに表示されています。 メッセージのタイプ(エラー、情報、作業、質問、警告)は、メッセージ・テキスト区画 ([タイプ]メニューの右側)の上に表示されます。

7. メッセージ・テキスト区画にメッセージ・テキストを入力します。 コンパイルしたメッセージで改行をしたいときは、改行キーを押します。

8. メッセージ・テキスト区画の下にあるチェック・ボックスをクリックし、[アクション1]、 [アクション2]、[アクション3]ボタンのラベルを入力することで、メッセージ・ダイア ログ・ボックスに表示されるボタンを指定します。

   それぞれのメッセージのタイプは、デフォルトのボタン・セットを持っています。 このボタン・セットは変更できます。

   - エラー: アクション2 (再試行), 取消し, ヘルプ

   - 情報: アクション1 (了解), ヘルプ

   - 作業: アクション1 (閉じる), アクション2 (中断), ヘルプ

   - 質問: アクション1 (了解), アクション2 (いいえ), ヘルプ

   - 警告: アクション2 (継続), 取消し, ヘルプ

9. [デフォルト・ボタン]メニューからデフォルト・ボタンを選択します。

   これは、メッセージ・ダイアログ・ボックスが表示されているとき、特別な枠を持っている ボタンです。改行キーを押すと、このボタンがアクティブになります。それぞれのメッセ ージのタイプは、デフォルトのデフォルト・ボタンを持っています。 このデフォルト・ボタンは変更できます。

   - エラー: アクション2

   - 情報: アクション1

   - 作業: アクション1

   - 質問: アクション1

   - 警告: アクション2

10. 必要に応じて、[ヘルプ・テキスト]ボタンをクリックし、ヘルプ・テキストを作成します。

    操作方法は、ABUG.afunc.mkr.4を参照してください。

11. [了解]または[適用]をクリックし、変更内容を適用します。

    [了解]をクリックしたときは、メッセージ・エディタは終了します。

### メッセージを編集するには

1. アプリケーション・ビルダの主ウィンドウの[エディタ]メニューから[メッセージ]を選択して、メッセージ・エディタを表示します。

2. [メッセージ]リストで、編集したいメッセージを選択します。

3. 必要に応じて、メッセージを編集します。

   - メッセージを削除するには、[メッセージの削除]をクリックします。

   - ダイアログ・ボックスのタイトルを変更するには、[ダイアログ・タイトル]フィールドを クリックして、新しいラベルを入力します。

   - メッセージのタイプを変更するには、異なった[タイプ]アイコンを選択します。

   - メッセージ・テキストを修正するには、メッセージ・テキスト区画をクリックして、 適切な変更内容を入力します。

   - 使用可能なボタンを変更するには、チェック・ボックスを選択して、必要に応じて新しい ボタンのラベルを入力します。

   - デフォルト・ボタンを変更するには、[デフォルト・ボタン]メニューから、別のボタンを 選択します。

   - ヘルプ・テキストを変更するには、[ヘルプ・テキスト]をクリックして、ヘルプ・エディタで 変更を行い、ヘルプ・エディタの[了解]をクリックします。

4. [了解]または[適用]をクリックして、変更内容を適用します。

   [了解]をクリックしたときは、メッセージ・エディタは終了します。

### モードなしのメッセージを関数に接続するには

メッセージを、そのメッセージを表示させる関数に接続する方法とその例は、ABUG.crobj.mkr.25を参照してください。 特に、モード付きの(保護)メッセージを関数に接続する方法を参照するには、この節 をお読みください。

1. メッセージ・エディタで[接続]をクリックするか、またはアプリケーション・ビルダの 主ウィンドウの[エディタ]メニューから[接続]を選択して、接続エディタを表示します。

   メッセージ・エディタでメッセージを選択して[接続]をクリックすると、選択したメッセージ が接続エディタの[ソース]リストで選択されます。その場合、次の2つのステップはスキップできます。

2. [ソース]メニューから[メッセージ]を選択して、[ソース]リストにメッセージを表示します。

3. [ソース]リストでメッセージを選択します。

4. [アクション・タイプ]で[関数呼び出し]を選択します。

   接続エディタの[ソース]側の[いつ]メニューが、アクティブになります。

5. [いつ]メニューから項目を選択します。項目は、[アクション1 を起動しました]、[アクション2 を起動しました]、[アクション3 を起動しました]、[起動を取り消した時]です。これら はメッセージ・エディタでチェックされたボタンに依存します。

6. ボタンが選択されたときに呼び出される関数の名前を入力します。

   コードが生成されると、関数は、<module_name>`_stubs.c`に作成されます。 `make`を実行する前に、適切なコードをコードに置換する必要があります。

7. [接続]をクリックして、メッセージを関数に接続します。

   接続エディタの一番下にある[表示]リストに接続が表示されます。

8. ヘルプを除いた各ボタンに対して上記の3つのステップを繰り返します。

9. [取消し]をクリックして、接続エディタを終了します。

### 例: メッセージ用のコードの記述

ABUG.crobj.mkr.22に従ってメッセージを作成後、それを、いつ、どのように表示するかを決定しなければ なりません。通常、メッセージはロジックのある箇所が実行された後に表示されます。 例えば、名前を受け入れるように設計されたテキスト・フィールドに、ユーザが数字を 入力した場合、数字が無効であることをユーザに知らせるエラー・メッセージが表示さ れます。

Motifのメッセージ・ボックスは、モード付きまたはモードなし(保護または 保護なしに相当します)の2つの方法のどちらかで表示できます。 アプリケーション・ビルダのコード・ジェネレータ(`dtcodegen`)は、 表示の2つのモードに対応した2つのルーチンを提供します。この2つのルーチンは、次の ような名前で`dtb_utils.c`にあります。

- `dtb_show_modal_message()`

- `dtb_show_message()`

モード付きで特定のメッセージを表示するには、`dtb_show_modal_message()`を使用します。 モードなしで特定のメッセージを表示するには、`dtb_show_message()`を使用します。

2種類のメッセージを扱う上での相違点の1つに、メッセージ・ダイアログ・ボックスで、 ユーザによってどのボタンが押されたかをアプリケーションが決定する方法があります。 モードなしの場合、メッセージのコールバックは、接続エディタによって各ボタンに追加 されます。ユーザがボタンをクリックすると、それに対応するコールバックが呼び出され ます。モード付きのダイアログは。保護されているため、ボタン のコールバックは、呼び出されません。その代わりに、 `dtb_show_modal_message` によって値が返され、ユーザによって押されたボタンを示します。

### モード付きのメッセージ用のコードを記述するには

モード付きでメッセージを表示するには、`dtb_show_modal_message()`を使用します。 このルーチンは、どのメッセージ・ボックスのボタンをユーザが押したかを示す値を返し ます。この値は、次のように`dtb_utils.h`で定義されてる列挙型です。

    /*
    * Returns answer value for modal MessageBox
    */
    typedef enum {
       DTB_ANSWER_NONE,
       DTB_ANSWER_ACTION1,
       DTB_ANSWER_ACTION2,
       DTB_ANSWER_ACTION3,
       DTB_ANSWER_CANCEL,
       DTB_ANSWER_HELP
    } DTB_MODAL_ANSWER;

戻り値をswitch文などで調べ、適切なコードを実行することができます。

次にモード付きのメッセージを表示する例を示します。 `foo`という名前の簡単なアプリケーションを作成します。 プロジェクト名は`foo.bip`で、`foo.bil`という1つのモジュールから構成されています。 モジュール`foo.bil`は、メイン・ウィンドウ、コントロール区画、2つのテキスト・フィールドで 構成されています。1つのテキスト・フィールドはユーザの名前を入力するフィールドで、 もう1つのテキスト・フォールドは、ユーザの姓を入力するフィールドです。 ユーザが数字を入力すると、エラー・メッセージが表示され、数字が許可されていない ことをユーザに示し、ユーザに2つのオプションを与えます。ユーザが入力をやり直す(Start Over)場合、 入力されたテキストは取消されます。ユーザが入力を継続する(Continue)場合、入力されたテキスト はそのままで、テキストの修正方法はユーザの判断にまかせます。

関数を呼び出すための接続が両方のテキスト・フィールドに対してなされ、ユーザが何かを入力するたびに呼び出されます。1つのテキスト・フィールドのための関数は、 入力文字が数字であるかどうかチェックします。数字であれば、モード付きのエラー・ メッセージを表示します。

    void
    verify_first_nameCB(
       Widget widget,
       XtPointer clientData,
       XtPointer callData
    )
    {
       /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
       char                *text = (char *)NULL;
       int                 textlen = 0;
       DTB_MODAL_ANSWER    answer = DTB_ANSWER_NONE;
       DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;
       /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/

       /*** DTB_USER_CODE_START vvv Add C code below vvv ***/

       text = XmTextFieldGetString(widget);
       if ((text != NULL) && (*text != NULL))
       {
           textlen = strlen(text);
           if (isdigit(text[textlen-1]))
           {
               dtb_foo_message_initialize(&dtb_foo_message);
               answer = dtb_show_modal_message(instance->textfield,
                           &dtb_foo_message, NULL, NULL, NULL);
               switch (answer)
               {
                   case DTB_ANSWER_ACTION1:        /* Start Over */
                       XmTextFieldSetString(widget, ““);
                       break;

                   case DTB_ANSWER_ACTION2: /* Continue */
                       break;
               }
           }
       }

       /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
    }

### モードなしのメッセージ用のコードの記述

モードなしのメッセージを表示するには、`dtb_show_message()`.を使用します。 この関数は、モード付きでなく、戻り値を返さないため、メッセージ・ボックスのボタン に対するコールバックは、ABUG.crobj.mkr.24に従って、接続エディタで指定します。 メッセージ・ボックスに指定されたボタンは、接続エディタで、メッセージ・オブジェクトの[いつ]項目として表示されます。

モードなしのメッセージ用のコード例と同じ例を使用して　、姓を入力するテキスト・フィールドを作成して、ユーザが 数字を入力するとモードなしのエラー・メッセージを表示するようにします。 まず、メッセージ・ボックスの2つのボタン(ボタンのラベルは 「Start Over」と「Continue」)に 対して関数を呼び出すための接続を行い必要があります。 コードが生成されているときは、正しい処理を行うルーチンに対し、コードを追加してください。 やり直しを行う(Start Over)ルーチンはテキスト・フィールドをを消去します。 処理を継続する(Continue)ルーチンは、テキスト・フィールドに対して何もしません。

    void
    verify_last_nameCB(
       Widget    widget,
       XtPointer clientData,
       XtPointer callData
    )
    {
       /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
       char                *text = (char *)NULL;
       int                 textlen = 0;
       DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;

       /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/

       /*** DTB_USER_CODE_START vvv Add C code below vvv ***/

       text = XmTextFieldGetString(widget);
       if ((text != NULL) && (*text != NULL))
       {
           textlen = strlen(text);
           if (isdigit(text[textlen-1]))
           {
               dtb_foo_message_initialize(&dtb_foo_message);
               dtb_show_message(instance->textfield,
                           &dtb_foo_message, NULL, NULL);
           }
       }

       /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
    }

    void
    start_overCB(
       Widget widget,
       XtPointer clientData,
       XtPointer callData
    )
    {
       /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/

       DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;

       /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/

       /*** DTB_USER_CODE_START vvv Add C code below vvv ***/

       XmTextFieldSetString(dtb_foo_mainwindow.textfield2, “”);

       /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
    }

    void
    continueCB(
       Widget widget,
       XtPointer clientData,
       XtPointer callData
    )
    {
       /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
       /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/

       /*** DTB_USER_CODE_START vvv Add C code below vvv ***/
       /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
    }

上記の2つのルーチン`start_overCB()`と`continueCB()`は、`dtb_show_message()`へのコールによって、2つのボタンのコールバックとして追加されます。

次に、コールバックを追加するコードの一部(`dtb_utils.c`から)を示します。

    /* Add Callbacks if necessary */
    if (mbr->action1_callback != (XtCallbackProc) NULL)
        XtAddCallback(msg_dlg, XmNokCallback, mbr->action1_callback, NULL);
    if (mbr->cancel_callback != (XtCallbackProc) NULL)
        XtAddCallback(msg_dlg, XmNcancelCallback, mbr->cancel_callback, NULL);
    if (mbr->action2_callback != (XtCallbackProc) NULL)
    {
        action_btn = dtb_MessageBoxGetActionButton(msg_dlg, DTB_ACTION2_BUTTON);
        if (action_btn != NULL)
            XtAddCallback(action_btn, XmNactivateCallback,
                          mbr->action2_callback, NULL);
    }
    if (mbr->action3_callback != (XtCallbackProc) NULL)
    {
        action_btn = dtb_MessageBoxGetActionButton(msg_dlg, DTB_ACTION3_BUTTON);
    if (action_btn != NULL)
        XtAddCallback(action_btn, XmNactivateCallback, mbr->action3_callback, NULL);
    }

構造体`mbr`はメッセージのために必要なすべての情報を含んでいます。 この構造体には、メッセージ・オブジェクトが`dtb_&_&_initialize()`(この例では、 `dtb_foo_message_initialize()`)ルーチンによって作成されたときに、メッセージ・エディタ で指定した値が書き込まれます。