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=868)



値の初回変更後の再変更を許可しない - umemura - 03-08-2013

ある値が変更されたら、その後はその値の変更を許さない、
という機能を実装したいのですが、どのような方法があるでしょうか。

こういう設計じたい、あまり美しくないとは思うのですが、
テキストフィールドを入力不可にしたりするときに利用したいです。



RE: 値の初回変更後の再変更を許可しない - umemura - 03-08-2013

■def、 constant を利用する
定義時、つまりコーディング時に値を決められるのであれば、この方法が一番よいと思います。
ただ、「プログラムで初回の変更のみゆるす」という目的には合致しません。

■first?:bool などのフラグを用意する。
初回の変更かどうかを保持するフラグを用意し、
ある値が変更されたら、そのフラグを倒す、という方法です。
ロジックとしてわかりやすいのですが、そのフラグが変更されたら・・・、
ということを考えると確実性がありません。

■uninitialized-value-for-type
これは一時的な不正行為を許す機能とのことですが、NULLを許可しない型で定義すれば、
値を一度入れたらnullにすることはできないので、上記の first? フラグに利用できるかもしれません



RE: 値の初回変更後の再変更を許可しない - umemura - 03-08-2013

つまり、こういうことでしょうか。

Code:
{define-class public A
  field _value:String = "100"
  {setter public {value  val:String}:void
    ||値確定前の型は Null
    {if Null == {type-of self.first?} then
        set self._value = val
        set self.first? = {Frame}
    }
  }
  {getter public {value}:String
    {return self._value}
  }
  ||値が設定されると、null は入れられない
  field first?:Frame = {uninitialized-value-for-type Frame}
  {constructor public {default}}
}
{def tf = {TextField value = "333"}}
{value tf}
{def a = {A}}
{value "Aクラスの初期値:" & a.value}
{CommandButton
    label = "Aクラスの値を上記の値に変更して表示",
    {on Action do
        set a.value = tf.value
        {popup-message  a.value }
    }
}

ちょっと面倒ですね。