この節では、メッセージ・エディタについて解説し、メッセージ・ダイアログ・ボックスを作成および編集する方法を説明します。
メッセージ・エディタ (図 5–1 とその解説を参照) は、コンパイル済みアプリケーションで、適切な時に表示されるさまざまなタイプのメッセージを作成するために使用します。使用方法については、メッセージ・ダイアログ・ボックスを作成するには、および メッセージを編集するにはを参照してください。
現在のプロジェクトのすべてのメッセージをリストします。リスト内のメッセージ名の前にモジュール名が付きます。
新規メッセージを追加するモジュールを指定します。[メッセージ] リストのメッセージ名の前にモジュール名が付きます。
新規メッセージを [メッセージ] リストと現在のプロジェクトに追加します。メッセージは、モジュール・オプション・メニューで選択されるモジュールのためのものです。
選択したメッセージを削除します。
現在のメッセージのインスタンス名を指定します。デフォルトのメッセージ名は、「message」、「message2」、「message3」、のようになります。
メッセージ・ダイアログ・ボックスの一番上に表示されるタイトルを指定します。
作成するメッセージのタイプを指定します。選択肢は、エラー、インフォメーション、作業中、クエスチョン、および警告です。メッセージ・テキスト区画の上に、メッセージ・タイプが表示されます。コンパイル済みアプリケーションのメッセージ・ダイアログ・ボックスに、該当するメッセージ・アイコンが表示されます。
メッセージ・テキストの入力域となるテキスト区画です。テキストを改行する場合は、 [Return] キーを押してください。テキスト区画上部のラベルは、選択したメッセージのタイプによって変わります。
メッセージ・ダイアログ・ボックスの一番下に取り込まれるボタンを指定します。メッセージ・タイプによって、デフォルトで指定されるボタンのセットが異なります。
このデフォルトの選択肢は変更できます。[アクション 1]、[アクション 2]、[アクション 3]、および [取消し] ボタンに関連するアクションは、接続エディタで設定されます。詳細は、メッセージ・ダイアログ・ボックスを作成するにはを参照してください。
選択したメッセージ・ダイアログのデフォルト・ボタンを指定します。
[アクション] ボタンと [取消し] ボタンを呼び出す関数を指定するための接続エディタを表示します。
ヘルプ・エディタを表示します。このエディタで、メッセージ・ダイアログ・ボックスの [ヘルプ] ボタンをクリックした時に表示されるヘルプ・テキストを記述します。
選択したメッセージをメッセージ・ダイアログ・ボックス (コンパイル済みアプリケーションの実際のダイアログ・ボックスに似ている) に表示するためのプッシュ・ボタンです。[ヘルプ] 以外のボタンをクリックして、ダイアログ・ボックスを閉じます。
エディタの一番下にあるボタンについては、属性エディタ: 共通ボタンを参照してください。
エディタの各フィールドについては、メッセージ・エディタを参照してください。メッセージを表示させる関数にメッセージを接続する方法については、モードなしメッセージを関数に接続するにはを参照してください。
アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メッセージ] を選択して、メッセージ・エディタを表示します。
[メッセージ] リストの下にあるオプション・メニューのメッセージを追加するモジュールを選択します。
[名前] フィールドに、固有の名前 (「message」、「message2」のようになり、名前の最後の数字は、現在のモジュールのメッセージ数に依存します) が表示されます。[メッセージ] リストに、モジュール名とメッセージ名が追加されます。
必要であれば、[名前] を変更します。
この名前は、メッセージを内部的に識別するために使用します。たとえば、接続エディタなどで使用します。この名前は、コンパイル済みメッセージ・ダイアログ・ボックスでは表示されません。
メッセージ・ダイアログのタイトルを [ダイアログのタイトル] フィールドに入力します。
これは、コンパイルされたメッセージ・ダイアログ・ボックスのタイトル・バーに表示されます。
[タイプ] メニューに、メッセージ・タイプのアイコンが表示され、メッセージ・テキスト区画 ([タイプ] メニューの右側) の上に、メッセージ・タイプ (エラー、インフォメーション、作業中、クエスチョン、または警告) が表示されます。
メッセージ・テキストをメッセージ・テキスト区画に入力します。コンパイルされたメッセージで改行する場合は、[Return] キーを押します。
メッセージ・ダイアログ・ボックスに表示されるボタンを次のように指定します。メッセージ・テキスト区画の下にあるチェック・ボックスをクリックし、[アクション 1]、[アクション 2]、および [アクション 3] ボタンに付けるラベルを入力します。
各メッセージ・タイプには、次のようなデフォルトのボタン・セットが用意されていてます。このボタンは変更できます。
エラー: アクション 2 (再試行)、取消し、ヘルプ
インフォメーション: アクション 1 (了解)、ヘルプ
作業中: アクション 1 (閉じる)、アクション 2 (中止)、ヘルプ
クエスチョン: アクション 1 (はい)、アクション 2 (いいえ)、ヘルプ
警告: アクション 2 (継続)、取消し、ヘルプ
[デフォルト・ボタン] メニューから、デフォルトのボタンを選択します。
このボタンは、メッセージ・ダイアログ・ボックスの表示時に特別な枠が付いています。このボタンは、[Return] キーを押すとアクテイブになります。各メッセージ・タイプには、次のようなデフォルトのデフォルト・ボタンが用意されています。このボタンは変更できます。
エラー: アクション 2
インフォメーション: アクション 1
作業中: アクション 1
クエスチョン: アクション 1
警告: アクション 2
必要に応じて、[ヘルプ・テキスト] ボタンをクリックして、ヘルプ・テキストを作成します。
作成方法については、ヘルプを作成するにはを参照します。
[了解] か [適用] をクリックして、変更内容を適用します。
[了解] をクリックすると、メッセージ・エディタは終了します。
アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メッセージ] を選択して、メッセージ・エディタを表示します。
[メッセージ] リストから、編集するメッセージを選択します。
必要に応じて、メッセージを編集します。
メッセージを削除するには、[メッセージの削除] をクリックします。
ダイアログ・ボックスのタイトルを変更するには、[ダイアログのタイトル] テキスト・フィールド内をクリックして、新規ラベルを入力します。
メッセージ・タイプを変更するには、別のタイプのアイコンを選択します。
メッセージ・テキストを変更するには、メッセージ・テキスト区画内をクリックして、適切な変更内容を入力します。
使用できるボタンを変更するには (該当する場合)、チェック・ボックスを選択して、新規ボタン・ラベルを入力します。
デフォルト・ボタンを変更するには、[デフォルト・ボタン] メニューから別のものを選択します。
ヘルプ・テキストを変更するには、[ヘルプ・テキスト] をクリックし、[ヘルプ・エディタ] で変更してから、[ヘルプ・エディタ] の [了解] をクリックします。
[了解] か [適用] をクリックして、変更内容を適用します。
[了解] をクリックすると、メッセージ・エディタは終了します。
モード付き (保護) メッセージを関数に接続する方法については、例: メッセージ用のコードの書き方を参照してください。
メッセージ・エディタの [接続] をクリックするか、アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [接続] を選択して、接続エディタを開きます。
メッセージ・エディタでメッセージを選択して、[接続] をクリックした場合は、接続エディタの [ソース] リストに、選択されたメッセージが表示されます。その場合は、手順 4 に進んでください。
[ソース] メニューから [メッセージ] を選択して、[ソース] リストにメッセージを表示します。
[ソース] リストの中の、メッセージを選択します。
[アクション・タイプ] として [関数呼び出し] を選択します。
接続エディタの [ソース] 側の [いつ] メニューが起動します。
[いつ] 項目 ([アクション 1 の起動]、[アクション 2 の起動]、[アクション 3 の起動]、または [取消しの起動] で、メッセージ・エディタでクリックされるボタンに依存します) を選択します。
指定したボタンを選択した時に呼び出す関数名を入力します。
コードが生成されると、この関数は <module_name>_stubs.c に作成されます。make を実行する前に、必ず該当するコードを置換しなければなりません。
[接続] をクリックして、接続を作成します。
接続エディタの一番下にある [表示] リストに、接続が表示されます。
ヘルプ以外の各ボタンに対して、手順 5 〜 7 を繰り返します。
[取消し] をクリックして、[接続エディタ] を終了します。
メッセージ・ダイアログ・ボックスを作成するにはに従ってメッセージを一度作成すると、それをいつ、どのように表示するかを決めなければなりません。メッセージは通常、ロジックのある部分が実行された後に表示されます。たとえば、ユーザが、名前を受け入れるように設計されたテキスト・フィールドに数字を入力した場合、数字が不正であることを知らせるエラー・メッセージが表示されます。
Motif のメッセージ・ボックスは、モード付きかモードなし (保護か非保護) の 2 つの方法のどちらかで表示できます。アプリケーション・ビルダのコード・ジェネレータ (dtcodegen) には、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_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 と名付けられ、1 つのモジュール (foo.bil) で構成されています。モジュール foo.bil は、メイン・ウィンドウ、コントロール区画、および 2 つのテキスト・フィールドで構成されています。2 つのテキスト・フィールドのうち、1 つはユーザの名前、もう 1 つは名字を入力するためのものです。ユーザが数字を入力した場合、エラー・メッセージが表示され、数字は入力できないことをユーザに通知し、2 つの選択肢を提示します。ユーザはやり直すか継続するかを選択します。やり直す場合は入力したテキストは消去され、継続する場合は入力されたテキストはそのまま残り、テキストを変更する方法についてはユーザに任されます。
関数呼び出し接続は、両方のテキスト・フィールドについて行われ、ユーザが何かを入力するたびに呼び出されます。最初のテキスト・フィールドの関数は、入力した文字が数字かどうかをチェックします。数字の場合は、エラー・メッセージをモード付きで表示します。
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() を使用します。この関数はモード付きではなく、戻り値を返さないので、メッセージ・ボックス・ボタンのコールバックは、モードなしメッセージを関数に接続するにはで説明したように、接続エディタを介して指定できます。メッセージ・ボックスに指定したボタンは、メッセージ・オブジェクトの [いつ] 項目として接続エディタに表示されます。
前節と同じ例を使用して、ユーザが数字を入力した場合に、名字を入力するためのテキスト・フィールドにモードなしでエラー・メッセージを表示させます。前述したように、まずメッセージ・ボックスの 2 つのボタン (「やり直し」と「継続」) 用の 1 組の関数呼び出し接続を行う必要があります。コードが生成されている場合は、適切な処理を行うルーチンにコードを追加してください。この場合、やり直しルーチンはテキスト・フィールド内を空にし、継続ルーチンは何も実行しません。
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()) を介して作成された時の、メッセージ・エディタで指定された値が入っています。