display dialogとdisplay alertの違い
AppleScriptでユーザーと会話する手段の一つとして、display dialog と display alert という似通った二つのGUIが用意されている。(display dialogは遥か昔から存在していたが、display alertはたしかOSX 10.4の頃から登場したような気がする)
大差ない(と思っていた)ので、今までその時の気分で使い分けていた。ところが、最近 giving up afterでハマった。この機会に、どんな違いがあるのか詳細に調べてみることに。
基本
まずは、メッセージのみ指定した時のイメージの違い。
- コメント部分は、デフォルトのオプション設定。
アイコン表示
with icon オプションを指定することで、アイコンも表示できる。
1行に入力可能な文字数
display dialogのアイコンあり・なし、display alertはメッセージのあり・なしで1行に入力可能な文字数が変化する。調べてみた。
- 半角文字はプロポーショナルフォントなので、以下の文字数は目安にしかならないが。
display dialog
アイコンなし
display dialog "1234567890123456789012345678901234567890" with title "123456789012345678901234567890123456789012"
display dialog "1234567890123456789012345" with title "123456789012345678901234567"
- 半角:タイトル42、メッセージ39
- 全角:タイトル27、メッセージ24
アイコンあり
display dialog "123456789012345678901234567890" with title "123456789012345678901234567890123456789012" with icon note
display dialog "1234567890123456789" with title "123456789012345678901234567" with icon note
- 半角:タイトル42、メッセージ29
- 全角:タイトル27、メッセージ18
display alert
messageオプションなしでは、タイトルは標準フォント。
display alert "123456789012345678901234567890123456789012"
display alert "123456789012345678901234567"
- 半角:タイトル41
- 全角:タイトル26
messageオプション付きでは、タイトルは太字フォントになる。
display alert "123456789012345678901234567890123456789012" message "123456789012345678901234567890123456789012345678901"
display alert "1234567890123456789012345678" message "123456789012345678901234567890123"
- 半角:タイトル41、メッセージ50
- 全角:タイトル27、メッセージ32
表示しておく秒数を指定
giving up after オプションを指定することで、指定した秒数が経過すると、次の処理に進むようになる。(ボタンのクリックは不要)
とっても便利なんだけど、display dialogとdisplay alertで挙動が違うのが悩み。
display dialog
- display dialogの挙動は素直に理解できる。giving up after 4 となっていれば、4秒間ダイアログを表示して、(OKボタンを押さなくても)次の処理に進む。
set lap to {}
set t0 to (current date)'s time
display dialog "(1)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display dialog "(2)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display dialog "(3)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
lap
--結果:{4, 4, 4}
display alert
- ところが、見てのとおりdisplay alertの挙動はトリッキー。1回目は4秒間表示されるが、2回目、3回目は1秒間しか表示されない。
set lap to {}
set t0 to (current date)'s time
display alert "(1)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display alert "(2)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display alert "(3)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
lap
--結果:{5, 1, 1}
- 何が起こっているのかは、以下のように4秒、8秒、12秒を指定してみると予測がつく。
- つまり、display alertのgiving up afterは、前回までの経過秒数を引き継いでいるのだ。
- どうしてこんな仕様なのか?非常に使いにくい。改善して欲しい。
set lap to {}
set t0 to (current date)'s time
display alert "(1)giving up after 4" giving up after 4
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display alert "(2)giving up after 8" giving up after 8
set lap's end to ((current date)'s time) - t0
set t0 to (current date)'s time
display alert "(3)giving up after 12" giving up after 12
set lap's end to ((current date)'s time) - t0
lap
--{結果:4, 4, 4}
入力した値を取得
default answer オプションを指定することで、テキストフィールドに値を入力して取得できるようになる。
但し、default answerはdisplay dialogだけのオプション。display alertでは使えない。
display dialog
- default answerで指定した値がテキストフィールドに設定されて、入力待ちになる。
- 空欄のテキストフィールドにしたければ、default answer ""とすればOK。
display dialog "名前を入力してください。" default answer "例:山田"
--{text returned:"例:山田", button returned:"OK"}
- with hidden answerとすることで、入力した値が表示されないテキストフィールドになる。
display dialog "パスワードを入力してください。" default answer "パスワード" with hidden answer
--{text returned:"パスワード等", button returned:"OK"}
- ちなみに、レコード形式の返り値のキーには、 text returned、button returned、gave up の3つが含まれる可能性がある。
display dialog "名前を入力してください。" default answer "例:山田" giving up after 4
--{text returned:"例:山田", button returned:"", gave up:true}
所感
- giving up afterを使いたいなら、display dialogを使った方が良い。display alertでは苦労しそう。
- 長い情報を1行で収めたいなら、display alert の message オプションを使うのが良さそう。
- display alertのタイトルとメッセージに分かれた書式は、情報をわかり易く伝えられそう。
- 特にこだわりがなければ、自分の場合は、基本的に display dialog を使うことにしよう。
- キャンセルボタンもデフォルトで設定されているし、
- アイコンも3種類を使い分けられるので。