Curl Global Community
Applet 終了中にはサブアプレットを表示できない? - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: Applet 終了中にはサブアプレットを表示できない? (/showthread.php?tid=945)



Applet 終了中にはサブアプレットを表示できない? - umemura - 07-25-2013

register-exit-proc を利用して、アプリケーション終了時にスプラッシュスクリーンを表示しようと思ったのですが、
「Applet creation disallowed while exiting」というメッセージが表示されます。
おそらく、アプリケーション終了時にはスプラッシュスクリーンを表示することはできない、ということでしょうか。

Code:
{import * from CURL.ENGINE.BROWSER}
{do
    ||アプリケーション終了時にログアウト処理を登録する
    {register-exit-proc
        {fn =>
            def a = 0
            {try
                {SplashScreen.setup
                    title = "Existing Applet ...",
                    footer = "Test Example ..."
                }
                || indeterminateなプログレスバーを表示します。
                {SplashScreen.set-progress-bar-indeterminate}
                || 作業が終わるまで2秒必要と仮定しています。
                {sleep 2s}
                {SplashScreen.set-progress-bar  max = 10.0}
                {sleep 1s}
                || ループに入り、ループの中でスリープし、
                || なんらかの作業をしているような状態にします。
                let val:double = 0
                {for i = 0 below 50 do
                    set val = val + 0.2
                    {SplashScreen.set-progress-bar-value val}
                    {sleep 0.1s}
                }
                || 完了したので、スプラッシュスクリーンを破棄します。
                {SplashScreen.destroy}
             catch ex:Exception do
                {popup-message ex.message}
            }
        }
    }
}

上記の問題に関連して、
アプリケーションが終了しようとしているかどうか、というのは、どのように判断すればよいでしょうか。

AppletData のプロパティにそれっぽいものがありますが、
get-the-applet で取得できるのはApplet なので、AppletData は取得できないという認識です。

「現在のアプレットの動作状態」を取得する方法があれば教えてください。



RE: Applet 終了中にはサブアプレットを表示できない? - dyoshida - 07-28-2013

register-exit-proc はCurl IDE ドキュメントをみると
「一般的には、ダイアログ ボックスの作成およびイベントの処理は、exit-procs では避けるようにしてください。」
と書かれているので、この時点では終了処理が進みすぎてスプラッシュウィンドウを表示するには手遅れなのでは。

アプリケーションが終了しようとしていることを知る方法ですが、WindowClose イベントハンドラを実装しては
どうでしょうか?

他のウィンドウシステムでも、アプリケーションが終了のリクエストを察知して、終了処理に入る前になにか処理を
行ったり終了をキャンセルするのにウィンドウのcloseイベントを利用していたと思うので、Curlでも同じように
実現できるのでは。

試しに独立型アプレットで終了確認と、終了前にスプラッシュスクリーンを表示するコードを書いてみました。
Code:
{curl 8.0 applet}
{import * from CURL.ENGINE.BROWSER}

{do
def layout =
    {VBox
        width = 4cm, height = 1cm,
        halign="center",
        {CommandButton
            label = "Exit",
            {on Action at btn:CommandButton do
                def graphic-root = {btn.get-graphical-root}
                {type-switch graphic-root
                 case v:View do
                    {v.close}
                }
            }
        }        
    }

def v =
    {View
        layout,
        visibility = "normal",
        {on wc:WindowClose do
            let x:String =
                {popup-question
                    "Are you sure you want to exit?"
                }
            
            {if x == Dialog.yes then
                {SplashScreen.setup
                    title = "Existing Applet ...",
                    footer = "Test Example ..."
                }
                || We will now be in a loop and sleep in the loop to fake
                || some work..
                {for i = 0 below 5 do
                    {sleep 1s}
                }
                || We are done. Destroy the Splash Screen.
                {SplashScreen.destroy}
                
                {exit}
             else
                {wc.consume}
            }
        }
    }
}

v






RE: Applet 終了中にはサブアプレットを表示できない? - umemura - 07-29-2013

ヘルプをよく確認していませんでした。
すいません。

やはり、exit-procs ではスプラッシュスクリーンは無理そうなのですね。

私のアプレットでは、いろいろなところからexit プロシージャでアプリケーションを終了しているのですが、
exit プロシージャを直接呼ぶのではなく、「終了処理」というプロシージャを作成し、
その中でのみ exit プロシージャを呼ぶようにするべきでした。

そうすれば、dyoshida さんのアドバイスに従って、View のクローズ時などから呼び出せますね。

ありがとうございました。