起動中ダイアログを表示する

アプレットの起動に時間がかかる場合は、起動中のダイアログを表示したい場合があります。
以下はデタッチドアプレットで起動中ダイアログを表示するサンプルです。
最初にダイアログを表示して、Viewが表示された後にダイアログを閉じています。

{curl 6.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{applet manifest = "manifest.mcurl",
    {compiler-directives careful? = true}
}

{def dialog = {Dialog
                  margin = 10pt,
                  "アプリケーションを起動しています。"
              }
}

{dialog.show title = "起動中", modal? = false}
{def saved-cursor = {{get-gui-manager}.set-busy-cursor}}
{dispatch-events true}

{import * from A-HEAVY-PACKAGE-TO-LOAD}

{View
    {Frame width = 8cm, height = 8cm, "サンプルアプレット"},
    visibility = "normal",
    owner = null,
    {on WindowClose do
        {exit}
    }
}

{{get-gui-manager}.restore-cursors saved-cursor}
{dialog.close "launched"}


このサンプルのポイントは以下の通り。

  • import 文の前でダイアログを show する

アプレットの起動時間の多くはパッケージのロードとコンパイルによります*1。特に初回起動時はパッケージキャッシュが存在しないため、2回目以降よりも時間がかかります。パッケージのロード&コンパイル中にもダイアログを表示するために、import文よりも前にダイアログ表示のコードを記述します。

  • ジーカーソル(砂時計マウスカーソル)の設定には GuiManager.set-busy-cursor を使用する

必須ではありませんが、起動中ダイアログにビジーカーソルを設定できます。import 文は必ずトップレベルに記述する必要があるため with-busy-cursor マクロは使用できません。ここでは代わりに GuiManager.set-busy-cursor メソッドを直接呼び出しています。なお、これによって設定したビジーカーソルは GuiManager.restore-cursors によって復帰させます。

  • import 文の直前で dispatch-events を呼び出す

import の直前で dispatch-events を呼び出しています。これによってパッケージのインポートが始まる前にダイアログの描画処理を完了させます。

  • View に owner = null を指定する

些細なことですがこのケースでは View に owner = null を指定する必要があります。指定しなかった場合は View が起動中ダイアログの子ウィンドウとなってしまい、ダイアログを閉じたと同時に View も閉じてしまいます。

*1:当然アプリケーションの作りにもよります。