Curl Global Community
オプションの監視について - 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: オプションの監視について (/showthread.php?tid=391)



オプションの監視について - umemura - 01-17-2012

あるインスタンスの、ある値の「変更」を監視したい場合、どのような方法がありますか?

目的はデバッグではなく、たとえば、あるCommandButton の enabled? をfalse にした際、
監視していたそのボタンのラベル自身が、自分の表示文字を切り替える、というような場合を考えています。

Observerを利用したり、コマンドボタンの継承クラスに同様の機能を実装することができることは理解していますが、
今回の目的は、既存のコードになるべく影響を出さないように、継承クラスなどはつくら渦に実現できればと思っています。

言い換えると、on-action などのイベントと同じように、「enable? の値が変わったら」という記述方法があるか、
というイメージになります。

register-options を利用して、下記のようなコードで実現できるのではと予想したのですが、
監視するオプションの指定方法が分かりません。

Code:
{def cb:CommandButton = {CommandButton label =  "押せます"}}
{do
{cb.register-options
   {proc { [CommandButton の enabeld? のオプションキー]:}void
        {if enabled? == true then
              set cb.label = "押せます"
          else
              set cb.label = "押せません"
         }
    }
}
{value cb}

{CheckButton
{on ValueChanged at chb:CheckButton do
     set cb.enabled? = chb.value
   }
}







RE: オプションの監視について - c-s - 01-18-2012

register-optionsがcallback的じゃなくて、そう使えませんね。

非ローカルなら、option-childを追加して、そこから監視出来るでしょう?



RE: オプションの監視について - umemura - 12-04-2012

とりあえず、option-changed を使って、こんな感じでできました。



Code:
{define-class public CustomCB {inherits CommandButton}
  {method public {option-changed key:String, value:any}:void
    {super.option-changed key, value }
    || enabled? と visible? を連動させる
    {if key == "enabled?" then
        set self.visible? = value asa bool
    }
  }
}

{let ccb:CustomCB = {CustomCB}}
{value ccb}
オプション enabled? の値に応じて visible? も設定される
{CheckButton
    label = "enabled? 切り替え",
    value = true,
    {on ValueChanged at chkb:CheckButton do
        set ccb.enabled? = chkb.value
    }
}