ある条件によって、このコマンドボタンの活性、非活性(enabled?)を切り替えたいと思ったのですが、
sonntag で、bind-screen-command を使ってコマンドボタンに処理を追加しているため、
Attacheイベントで画面に表示された際にコマンドが追加され、enabeld? もtrue になってしまうようです。
切り替えを行うには bind-screen-command を使わずに、
エベントハンドらの中でコマンドを呼ぶ必要があるのでしょうか。
同じ問題にぶつかった覚えがあります。
うろ覚えで恐縮ですが、確かそのときは
bind-screen-commandの後ろにon Actionとか
イベントタイプを付け加えたら押下不可になってくれました。
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? プロパティを直接変更してはいけない点に注意してください。
なるほど、ボタン側でそのコマンドを「呼ぶかどうか」ではなく、そのコマンドが「有効かどうか」で切り替えるということでしょうか。
{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}
}
}
以前同様の質問をしておきながら、bind-screen-method を指定したボタンが、
コンストラクタの中で非活性(enabled?=false)状態にしても、
初期表示時に活性(enabled?=true)状態になってしまう現象に悩んでいました。
bind-screen-method の場合もbind-screen-comamndと同じ、というか、
メソッドにはコマンドのような「有効、無効」という考えがないため、
実質、常に活性(enabled?=true)になってしまうという認識で正しいでしょうか。
おっしゃる通り bind-screen-method は試験的なAPIということもありenabled?の制御はサポートしていません。