モードなしメッセージを表示する場合は、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()) を介して作成された時の、メッセージ・エディタで指定された値が入っています。