02-26-2014, 05:59 PM
ある処理の間、画面の操作を無効化したいです。
lib ライブラリに、ボタンの2度押し防止のためのAPIとして、
with-busy-view があり、これを使うと、
TextField なども操作不可の状態になるので、
画面をロックする目的に利用できるかな、と思ったのですが、
①with-busy-view を呼び出す
②上記の処理中に、画面上のテキストエリアをクリック
③キー入力を行う
↑このタイミングでは画面上には入力したキーは表示されない
④with-busy-view の処理が終了する
⑤画面上のテキストエリアに、先ほど入力したキーが表示される。
となってしまい、目的に合致しません。
おそらく、with-busy-view の処理中も、マウスイベント、
キーイベントがイベントキューにたまり
with-busy-view の処理が終了したら、イベントキュー内のイベントが順次実行されてしまうため、
この現象になっていると思っています。
理想は、⑤の時点で、それまでの全てのイベントを破棄してほしいです。
画面の操作をロックする方法をご存知の方がいらっしゃったら教えてください。
lib ライブラリに、ボタンの2度押し防止のためのAPIとして、
with-busy-view があり、これを使うと、
TextField なども操作不可の状態になるので、
画面をロックする目的に利用できるかな、と思ったのですが、
①with-busy-view を呼び出す
②上記の処理中に、画面上のテキストエリアをクリック
③キー入力を行う
↑このタイミングでは画面上には入力したキーは表示されない
④with-busy-view の処理が終了する
⑤画面上のテキストエリアに、先ほど入力したキーが表示される。
となってしまい、目的に合致しません。
おそらく、with-busy-view の処理中も、マウスイベント、
キーイベントがイベントキューにたまり
with-busy-view の処理が終了したら、イベントキュー内のイベントが順次実行されてしまうため、
この現象になっていると思っています。
理想は、⑤の時点で、それまでの全てのイベントを破棄してほしいです。
画面の操作をロックする方法をご存知の方がいらっしゃったら教えてください。
Code:
{import * from COM.CURL.LIB.UI}
{def v:View = {View}}
{def ta = {TextArea
width = {make-elastic},
height= {make-elastic}
}}
{def cb =
{CommandButton
label= "with-busy-view",
{on Action do
{with-busy-view v do
||時間をかけるためのダミー処理
def (buf:StringBuf, n:int, encoding:CharEncoding) =
{read-from {url "http://www.yahoo.com"}}
}
}
}
}
{do
{v.add {VBox hstretch? = true, ta, cb}}
{v.show}
}