28
 ダイアログ 



アプリの操作者に何らかの情報を表示したり、対応を尋ねるのにダイアログと言う機構が使えます。
本章で解説するのはGUIライブラリ独自の機能です。他方、OS標準のダイアログ、たとえば、ファイル選択、ディレクトリ選択、色の選択などはもっと先、標準ダイアログ で解説します(ここで解説するのは「標準」が付かないほうのダイアログです)。


 
 
簡単なダイアログ表示
 
 

 1つまたは2つのメッセージと共にダイアログを表示し、ボタンを押すとダイアログを閉じて戻って来る・・という比較的簡単なダイアログが、幾つかのバリエーションを持って定義されています。この中から適当なものを選べばほとんどのケースで利用できると思います。
 バリエーションは以下の通りです。単語名で意味が分かるかと思いますので解説は簡単にします。


■簡単なダイアログ群

構文=
<メッセージ>を メッセージをダイアログで表示 → ・ <タイトル>と <メッセージ>で       タイトルとメッセージをダイアログで表示 → ・ <タイトル>と <メッセージ1>と <メッセージ2>で       タイトルと二つのメッセージをダイアログで表示 → ・ <タイトル>と <メッセージ>と <秒数>で       タイトルとメッセージとタイマーをダイアログで表示 → ・ <タイトル>と <メッセージ1>と <メッセージ2>と <秒数>で       タイトルと二つのメッセージとタイマーをダイアログで表示 → ・ <メッセージ>と  <ボタン情報>で    メッセージとボタンをダイアログで表示  → ボタン番号 <タイトル>と <メッセージ>と  <ボタン情報>で    タイトルとメッセージとボタンをダイアログで表示 → ボタン番号 <タイトル>と <メッセージ1>と <メッセージ2>と  <ボタン情報>で    タイトルと二つのメッセージとボタンをダイアログで表示 → ボタン番号 <メッセージ1>と <メッセージ2>と  <ボタン情報>で    二つのメッセージとボタンをダイアログで表示 → ボタン番号
       プログラム例:
dialog-hilevel-many.src を起動したりソースをご覧ください
       ダイアログ内の部品配置:


■簡単なダイアログ表示のサンプル
dialog-hilevel-simple.src
「メッセージをダイアログで表示」を使った最も簡単なサンプルです。 「メッセージをダイアログで表示」はプログラムのデバッグ目的(処理途中で値を表示させる)にも使えます。


dialog-hilevel-many.src
簡単なダイアログ群のすべてを試すことのできるサンプルです。


■ダイアログ表示中の待ち時間
 GUIアプリケーションでは ”待つような単語を実行してはならない” ことが基本です。しかし本単語は例外で、この処理単語に入ると待ちになりしばらく(ダイアログが閉じるまで)戻ってきません。しかしこの処理の中でイベント処理がおこなわれるので大丈夫です。本処理単語の呼びのあと後続した処理を書くことができます。
記: 「ダイアログで表示」系の処理単語の内部では最後に「ウィンドウが閉じるのを待つ」を使っています。

■ボタン番号(戻り値)

 簡単なダイアログ群の中で <ボタン情報> を与えるタイプは処理単語から戻ったときボタン番号(整数)を返してきます。アプリケーションはこれを見て適切な後続処理をおこなうことができます。
 ボタン番号は1〜Nの整数または −1 です。タイトルバー右にある「×」を押すことでダイアログを閉じた時は −1 が返されます。Alt+F4 または Escキーで閉じた時も同様です。

■ボタン情報
 「ボタン情報」の個所には次のような定義済みの単語名を書きます。
  (ボタン情報)
    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    Mind単語名            それで定義される文字列
    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    ボタン・OK            「OK:1」
    ボタン・OK/キャンセル      「OK:1* キャンセル:0」
    ボタン・OK/Cancel        「OK:1* Cancel:0」
    ボタン・ハイ/イイエ       「はい:1* いいえ:2」
    ボタン・Yes/No          「Yes:1* No:2」
    ボタン・ハイ/イイエ/キャンセル 「はい:1* いいえ:2 キャンセル:0」
    ボタン・Yes/No/Cancel      「Yes:1* No:2 Cancel:0」
    ボタン・再試行/キャンセル    「再試行:1* キャンセル:0」
    ボタン・中止/再試行/無視    「中止:0 再試行:1* 無視:2」
    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
       プログラム例:
「削除していいですか?」と
  ボタン・ハイ/イイエを         ←ボタン情報
    メッセージとボタンをダイアログで表示し
 ボタン情報の一覧にあるように、「ボタン・○○」系の単語群はボタン指示となる文字列定数を単語定義しただけのものです。したがって、表の右側にあるような文字列を直接指定するのでも構いません。
 次はボタン情報を具体的に書いた例です。
       プログラム例:
「エラーが発生しました」と
  「Abort:1* Retry:2 Ignore:3」を
    メッセージとボタンをダイアログで表示し
 ボタン情報の簡単なタイプは以下のようなものです。
    (指示例1) 「はい いいえ キャンセル」
 上記のように3つの語を空白を区切って並べると、ボタン名称であると解釈され 表示されます。ダイアログから戻ったときのボタン番号は左から1,2,3と順に 割り当てられます。
    (指示例2) 「はい:1 いいえ:2 キャンセル:0」
 上記のよう数字を併記した場合は、ダイアログから戻ったときのボタン番号がその数字になります。このような表記にすることの意義は、将来的にボタン並びを変えたくなったとき、ダイアログから戻った時、ボタン番号の扱いを変更しなくて済むことです。たとえば、
    (指示例2b) 「いいえ:2 はい:1 キャンセル:0」    ←「はい」と「いいえ」が逆並び
のようにして、「はい」と「いいえ」の表示並びを取り換えたとしても、対応番号は変わりないためプログラムの修正が最小限で済みます。

■ボタンへのフォーカス
 次の仕組みとして、ダイアログ中のボタンに対するフォーカスが指定できます。
                 ↓'*'に注目
    (指示例3) 「はい:1* いいえ:2 キャンセル:0」
 上記では「はい:1*」のようにボタン項目の末尾に'*'を付けています。この* 印は「フォーカスをこのボタンに当てて欲しい」という意味です。「はい」にフォーカスが当たっているため、マウスを操作せずともキーボードからEnterキーを押すだけで先に進めることができます。

■ダイアログをAlt+F4で閉じた場合
 ダイアログを閉じるのに Alt+F4 打鍵や、タイトルバー右上にある「×」をクリックすることでダイアログウィンドウ自体を閉じた場合ですが、もし、ダイアログの処理単語のスタック仕様中に<ボタン情報>があるタイプであるなら、ボタン番号として −1 を返す仕様になっています。
 またこのことと関連しますが、Escキーの打鍵がタイトルバー「×」のクリックと同じ扱いとなります。ボタン番号を返すタイプではボタン番号として −1 を返します。

■タイマーの指定について
 上記バリエーションの中で <秒数> を指示するタイプのものは、指定した秒数が経過すると自動的にダイアログを閉じます。
 秒数は整数値です。小数は使えません。


 
 
詳細なダイアログ表示
 
 

 ラベルやボタンを生成した時と同じように、ダイアログのIDを取得し、何かしらの属性を設定し、最後にダイアログを開く・・といった手順を踏む方法もあります。手数はかかりますがダイアログを開く位置など細かな指示をすることができます。
記: 本章前半の「簡単なダイアログ表示」で紹介した単語群は本項で解説する機能を使って実現した上位語です。

■ダイアログのIDを取得、ダイアログを開く

構文=
<親ウィジェット>で ダイアログのIDを取得 → ダイアログID     〜〜              〜〜     〜〜 ここで属性設定をおこなう 〜〜     〜〜              〜〜      (通常のダイアログ) <ダイアログID>で ダイアログを開く → 結果      (エントリーを含むダイアログ) <ダイアログID>で ダイアログを開く → 入力文字列、結果
       プログラム例:
○○とは
        ダイアログは  ID
        結果は     変数

    メインウィンドウで ダイアログのIDを取得し ダイアログに 入れ

    〜〜(ここで属性設定をおこなう)  〜〜

    ダイアログで ダイアログを開き 結果に 入れ
    結果が 1に 等しい
        ならば ・・・・
        つぎに
 まずダイアログのIDを取得します。このIDを使って各種の設定をおこない、最後に「ダイアログを開く」を実行します。
 「ダイアログを開く」はスタックにどのボタンが押されたのかの整数を返してきます。そのときの戻値(ボタン番号)については ボタン番号(戻り値) の項目を参照ください。

■詳細なダイアログ表示をおこなうサンプルプログラム
 以下はダイアログの表示位置を各種テストするものです。「ダイアログを開く」の戻り値もモニタ表示します。
dialog-lowlevel-simple.src/.exe
位置指定無しで「ダイアログを開く」
dialog-lowlevel-setpos.src/.exe
位置指定を伴う「ダイアログを開く」
dialog-lowlevel-manypos.src/.exe
さまざまな位置を指定するダイアログ表示
dialog-setfont.src/.exe
ダイアログのフォントを指定する

■ダイアログのタイトル

構文=
<タイトル文字列>を <ダイアログID>に ダイアログのタイトルを設定 → ・
       プログラム例:
「確認」を ダイアログに ダイアログのタイトルを設定する
 タイトルを設定しない場合は、ダイアログのタイトルバーには何も表示されません。

■ダイアログのメッセージ

構文=
<文字列>を <ダイアログID>に ダイアログのメッセージ1を設定 → ・ <文字列>を <ダイアログID>に ダイアログのメッセージ2を設定 → ・
       プログラム例:
「エラー」を     ダイアログに ダイアログのメッセージ1を設定し
「○○が誤りです」を ダイアログに ダイアログのメッセージ2を設定し
 アイコン、 メッセージ1、 メッセージ2 の位置関係を下に示します。
        ・−−−−−−−−−−−−−−・
        |     タイトル     |
        ・−−−−−−−−−−−−−−・
        |              |
        | アイコン  メッセージ1 |
        |              |
        |   メッセージ2     |
        |              |
        ・−−−−−−−−−−−−−−・
 メッセージは2種類あります。1はダイアログの上のほうに表示する短い文として、2は下のほうに表示する比較的長い文として使い分けてください。
 メッセージ1、2のいずれかは省略することもできます。(どちらかは指定しないと何のダイアログなのか分からないので1つは指定してください)
注: メッセージ1,メッセージ2ともにメッセージウィジェットです。自動的に折り畳み表示されます。あるいは意図的に改行(ソース中に「&改行&」と表記)」できます

■ダイアログのタイトルとメッセージの同時設定

構文=
<メッセージ1>と <メッセージ2>を  <ダイアログID>に   ダイアログのメッセージ1/2を設定      → ・ <タイトル>と <メッセージ1>を  <ダイアログID>に   ダイアログのタイトルとメッセージ1を設定   → ・ <タイトル>と <メッセージ1>と <メッセージ2>を  <ダイアログID>に   ダイアログのタイトルとメッセージ1/2を設定 → ・

■ダイアログのフォント

構文=
<短形式フォントorフォントマクロ>を <ダイアログID>に ダイアログのフォント1を設定 → ・ <短形式フォントorフォントマクロ>を <ダイアログID>に ダイアログのフォント2を設定 → ・ <短形式フォントorフォントマクロ>を <ダイアログID>に ダイアログのフォントBを設定 → ・        注:「ダイアログのフォントBを設定」はボタンのフォントのことです
       プログラム例:
「{MS 明朝} 11」を ダイアログに ダイアログのフォント1を設定し
       サンプルプログラム:
dialog-setfont.src をご覧ください。メッセージ1とメッセージ2、ボタンのすべての
フォントを指定しています。
 ダイアログに表示する文字のフォントを指定できます。

■ダイアログの文字色

構文=
<色指定>を <ダイアログID>に ダイアログの文字色1を設定 → ・ <色指定>を <ダイアログID>に ダイアログの文字色2を設定 → ・
       プログラム例:
「red」を ダイアログに ダイアログの文字色1を設定
 メッセージ1,2の文字色を設定できます。
 <色指定>については既に、「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 にて解説したので参照してください。

■ダイアログの背景色を設定

構文=
<色指定>を <ダイアログID>に ダイアログの背景色を設定 → ・
 ダイアログの背景色を設定できます。
 <色指定>については既に、「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 にて解説したので参照してください。

■ダイアログのアイコンを設定

構文=
<ビットマップ名>を <ダイアログID>に ダイアログのアイコンを設定 → ・          注:デフォルトは「ビットマップ・info」
       プログラム例:
ビットマップ・errorを ダイアログに ダイアログのアイコンを設定し
 ダイアログの左側にはアンコンが表示されますがそのアイコンを指定できます。アイコンはビットマップとして指定します。
 本指定を省略すると、アイコン「ビットマップ・info」が適用されます。
 ビットマップの取り扱いについては既に、「ウィジェットの属性指定」−「ビットマップの埋め込み」 にて解説しましたのでそちらをお読み願います。

■ダイアログのボタン情報を設定

構文=
<ボタン情報>を <ダイアログID>に ダイアログのボタン情報を設定 → ・
 ダイアログに配置するボタンの情報を指定します。
 ボタン情報については、ボタン情報 をお読みください。

■ダイアログの位置
(位置を指定しない場合)
 ダイアログの位置を指定しない場合(デフォルト)は親ウィンドウの左上隅からの相対座標として 150, 150 に設定されています。つまりデフォルトでは位置を指定していることになります。
 デフォルトを使わず、本当に位置を無指定にするには、次に示す「ダイアログの位置を設定」により、-1, -1 を指定してください。

(位置を指定する場合)
 以下の単語群によりダイアログ位置を指定できます。
 ダイアログはウィンドウに属するウィジェットですが、ウィンドウの位置設定目的の 「ウィンドウの位置を設定」 ではなくダイアログ専用の処理単語群を使います。

構文=
<X位置>と <Y位置>を  <ダイアログID>に ダイアログの位置を設定 → ・ <X位置>と <Y位置>を  <ダイアログID>に ダイアログの中央位置を設定 → ・ <X位置>と <Y位置>を  <ダイアログID>に 親からの相対でダイアログの位置を設定 → ・ <X位置>と <Y位置>を  <ダイアログID>に 親からの相対でダイアログの中央位置を設定 → ・        注:位置は絶対値以外に、ディスプレイサイズに対す          る比率も使えます。0.0超〜1.0までの小数形式を          使ってください(比率指定であるかの判断は小数          形式かどうかで見ています)          たとえば、0.5、0.5 を指定するとディスプレイ          中央の座標を指定したことになります。
      ◎GUIエンジン特有の注意点
・この機能を利用してダイアログの位置を変更した場合、ダイアログウィンドウが最初の位置で一瞬現れた後に指定位置に移動する様子がわずか目撃されますが、これはGUIエンジンの特性であり、このようなものとご理解ください。
      ◎「ダイアログの中央位置を設定」の場合
・ダイアログ左上隅の座標を指定するのではなく、ダイアログの中央の座標、いわば ”ウィンドウの重心”の位置を指定する機能です。そのほかは「ダイアログの位置を設定」と同じです。たとえば画面の真ん中ぴったりにダイアログを表示するケースで使えます。
・「ウィンドウ中央位置を設定」の時と異なり、ダイアログでは事前に「すべてのイベントを処理」を併用する必要はありません。
      ◎「親からの相対でダイアログの(中央)位置を設定」の場合
・ダイアログ位置を画面上の絶対座標ではなく、親ウィンドウ左上隅の座標からの相対で指定するものです。
・ダイアログを親ウィンドウの近傍に、かつ正確な位置に開きたい場合に使います。(位置を指定せずとも、ダイアログなど子ウィンドウは親ウィンドウの近くに表示されることが多いようですが本機能を使うことでより確実になります)

■ダイアログのサイズ
 ダイアログのサイズは指定できません。ダイアログ内に配置されるメッセージなどのウィジェット群が適切に収容できるサイズに自動で調整されます。

■ダイアログのタイマー

構文=
<秒数>を <ダイアログID>に ダイアログのタイマーを設定 → ・        注:秒数は整数値です。小数は使えません
 指定した秒数が経過すると自動的にダイアログを閉じます。
       プログラム例:
3秒を ダイアログIDに ダイアログのタイマーを設定

       注:「秒」は単位を明確にするため付けたもので
         プログラムの動作としては意味はありません
 サンプル dialog-hilevel-many.src の4番目と5番目のメニューから誘導される処理はタイマーを使っているので参考にしてください。

■文字列入力を伴うダイアログ
記:単体のエントリーウィジェットについては 「ウィジェット」−「エントリーウィジェット」 をお読みください
 ダイアログ中にエントリーウィジェットを設置し、キーボードから文字列を入力できます。

構文=
IDの取得: (ここは通常と同じ)     <親ウィジェット>で ダイアログのIDを取得 → ダイアログID 属性の設定:     <桁数>を <ダイアログID>に              ダイアログのエントリー桁数を設定 → ・     <文字列>を <ダイアログID>に              ダイアログの先行入力文字列を設定 → ・ 開く:                        ↓戻値が多い!     <ダイアログID>で ダイアログを開く → 入力文字列、 結果
       プログラム例:
20桁を ダイアログIDに ダイアログのエントリー桁数を設定
       ダイアログの表示例:

 「ダイアログのエントリー桁数を設定」により文字列入力域の桁数を指定します。この指定によりエントリーウィジェットの埋め込みが有効となります。
 桁数は入力できる桁数ではなくウィジェットの表示幅の意味になります(表示幅以上に入力できますが最大200桁です)。
 ダイアログから戻ったときのスタックには、入力された文字列と、結果(整数)の2つのデータが積まれています。戻値が2つある点は他のダイアログタイプと異なるので注意が必要です。
 入力文字列はライブラリ内部の文字列実体変数(長さ=200桁)に格納された後、そこを指す文字列情報をスタックに返します。そのため得た文字列を消費しないまま再度呼び出すると上書きされてしまうため、ユーザが用意した文字列実体変数に退避するなど工夫してください。
 エントリーを使用する場合、ダイアログは次の挙動となります。
・アイコンの指定は無視されます(アンコンは表示されません)
・メッセージ2は入力域のすぐ左にプロンプトとして表示されます
・プロンプト(メッセージ2)のフォントは "フォント2" サイズより小さく表示されます
 (フォントサイズを2だけ強制減少します)
・先行入力文字列を設定できます。先行入力文字列については、
 エントリーウィジェット − 入力域の初期値 を参考にしてください
・ダイアログが開いたとき、入力域にフォーカスが当たります
 (デフォルトボタンへの自動フォーカス処理は無視されます)
・「ダイアログを開く」の戻値として、入力した文字列および、ボタン番号の
 2つがスタックに返されます。(この点が通常の「ダイアログを開く」と異なります)
 文字列入力を伴うダイアログの表示上の構成は次のようになります。
 ・−−−−−−−−−−−−−−−−−−−・
 |       メッセージ1      |
 ・−−−−−−−−−−−−−−−−−−−・
 |メッセージ2|←−−−入力域−−−−→| 注:メッセージ2はプロンプトとして扱われる
 ・−−−−−−−−−−−−−−−−−−−・
 |  |OK|    |キャンセル|  |
 ・−−−−−−−−−−−−−−−−−−−・
■文字列入力を伴うダイアログ表示のサンプル
dialog-entry.exe
名前の入力を促すものです
dialog-hilevel-many.exe
こちらの一番下のメニューからも利用できます