display dialogとdisplay alertの違い

AppleScriptでユーザーと会話する手段の一つとして、display dialogdisplay alert という似通った二つのGUIが用意されている。(display dialogは遥か昔から存在していたが、display alertはたしかOSX 10.4の頃から登場したような気がする)
大差ない(と思っていた)ので、今までその時の気分で使い分けていた。ところが、最近 giving up afterでハマった。この機会に、どんな違いがあるのか詳細に調べてみることに。

基本

まずは、メッセージのみ指定した時のイメージの違い。

  • コメント部分は、デフォルトのオプション設定。
display dialog


display dialog "display dialog 基本" --buttons {"キャンセル", "OK"} default button "OK" cancel button "キャンセル"

display alert


display alert "display alert 基本" --buttons {"OK"} default button "OK" as informational

アイコン表示

with icon オプションを指定することで、アイコンも表示できる。

display dialog


display dialog "with icon note(= with icon 1)" with icon note
display dialog "with icon caution(= with icon 2)" with icon caution
display dialog "with icon stop(= with icon 0)" with icon stop


  • 上記3つとアイコンなしの状態も含めて、4つのモードがある。
display alert


display alert "as informational" as informational
display alert "as warning" as warning
display alert "as critical" as critical


  • アイコンは常に表示されるようなので、実質2つのモードしかない。

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は、前回までの経過秒数を引き継いでいるのだ。
  • どうしてこんな仕様なのか?非常に使いにくい。改善して欲しい。

OSX 10.9.4 Mavericksにおいて、display dialogと同じ挙動になっていることを確認した。


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種類を使い分けられるので。