Curl Global Community
非活性ボタンにbind-screen-command を指定すると・・・? - Printable Version

+- Curl Global Community (http://communities.curl.com)
+-- Forum: Discussions (http://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (http://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: 非活性ボタンにbind-screen-command を指定すると・・・? (/showthread.php?tid=324)



非活性ボタンにbind-screen-command を指定すると・・・? - umemura - 10-25-2011

ある条件によって、このコマンドボタンの活性、非活性(enabled?)を切り替えたいと思ったのですが、
sonntag で、bind-screen-command を使ってコマンドボタンに処理を追加しているため、
Attacheイベントで画面に表示された際にコマンドが追加され、enabeld? もtrue になってしまうようです。

切り替えを行うには bind-screen-command を使わずに、
エベントハンドらの中でコマンドを呼ぶ必要があるのでしょうか。



RE: 非活性ボタンにbind-screen-command を指定すると・・・? - ashimo - 10-26-2011

同じ問題にぶつかった覚えがあります。
うろ覚えで恐縮ですが、確かそのときは
bind-screen-commandの後ろにon Actionとか
イベントタイプを付け加えたら押下不可になってくれました。


RE: 非活性ボタンにbind-screen-command を指定すると・・・? - fukuta - 10-27-2011

Sonntag のスクリーンコマンドは Curl の Command / CommandContext アーキテクチャにもとづいています。
コマンドアーキテクチャでは enabled? はボタンのプロパティで直接指定することはせず、
bound-command に設定された CommandImpl の enabled? の値にもとづいて制御されます。
(スクリーンコマンドの実体は CommandImpl で、bind-screen-command によって内部的にボタンの bound-command にセットされます)

スクリーンコマンドでこの enabled? の値を指定する場合は define-screen-command の enabled? 句を指定してください。

Code:
{define-screen-command xxx of XXXScreen
    {enabled?
        || ここに true / false の判定をかく
        || この句内の最後の式が bool 値に評価されて enabled? の値として使用される
    }
do
    || ...
}

bind-screen-command でスクリーンコマンドを設定する際に、enabled? 句が評価されてボタンの enabled? の
初期値が決まります。
また、enabled? の値が変化する可能性のあるタイミングでは、スクリーン(Screen-ofなどを継承してつくるオブジェクト)
の request-update-commands というメソッドを呼び出すようにする必要もあります。
request-update-commands によって、再度 enabled? 句が評価されてボタンの状態が更新されます。
ボタンの enabled? プロパティを直接変更してはいけない点に注意してください。



RE: 非活性ボタンにbind-screen-command を指定すると・・・? - umemura - 11-02-2011

なるほど、ボタン側でそのコマンドを「呼ぶかどうか」ではなく、そのコマンドが「有効かどうか」で切り替えるということでしょうか。

{self.request-update-commands} を忘れないように気をつけないとですね。


Code:
||| Ex1LoginScreen の "login" スクリーンコマンドの定義
{define-screen-command
    login of screen:Ex1LoginScreen {enabled? screen.login-enabled?}
do


Code:
||ユーザー名の入力にあわせて、ログインボタンの活性を切り替える
    {self.userid-tf.add-event-handler
        {on ValueChanged at tf:TextField do
            {if tf.value.size > 0 then
                set self.login-enabled? = true
             else
                set self.login-enabled? = false
            }
            {self.request-update-commands}
        }
    }



RE: 非活性ボタンにbind-screen-command を指定すると・・・? - umemura - 01-22-2013

以前同様の質問をしておきながら、bind-screen-method を指定したボタンが、
コンストラクタの中で非活性(enabled?=false)状態にしても、
初期表示時に活性(enabled?=true)状態になってしまう現象に悩んでいました。

bind-screen-method の場合もbind-screen-comamndと同じ、というか、
メソッドにはコマンドのような「有効、無効」という考えがないため、
実質、常に活性(enabled?=true)になってしまうという認識で正しいでしょうか。



RE: 非活性ボタンにbind-screen-command を指定すると・・・? - fukuta - 01-22-2013

おっしゃる通り bind-screen-method は試験的なAPIということもありenabled?の制御はサポートしていません。