DateField では、1文字ごとに入力内容をパースして、
YYYY/MM/DDなど、フォーマットとして正しい値であればそのタイミングでValueFinishedが発生すると思いますが、
この ValueFinished を抑制することはできますか?
通常の TextField のように、フォーカスアウトやEnterキーの押下などでValueFinished を発生させたいのですが、可能でしょうか。
独自のイベントを利用することで無理やりできそうです。
Code:
{define-class public DateFieldValueFinished {inherits GuiEvent}
{constructor public {default}
{construct-super}
}
}
{define-class public TestDateField {inherits DateField}
{constructor public {default ...}
{construct-super {splice ...}}
}
||ValueFienid の発生をコントロールするために DateFieldValueFinished 発生時かどうかを判断する変数
field private do-finished?:bool = false
||値が変更されたかどうかを判断するための値保持変数
||ValueFienid の発生をコントロールすることが目的
field private prev-val:#DateTime = null
||通常のTextField と同様のタイミングでValueFinished が発生するようにコントロールする
{method public {handle-event e:Event}:void
{type-switch e
case vf:ValueFinished do
|| DateFieldValueFinished 発生時以外のValueFinised は握りつぶす
{if not self.do-finished? then
{vf.consume}
{return}
}
case kp:KeyPress do
||Ennterキー押下時にDateFieldValueFinished を発生させる
{if kp.value == KeyPressValue.enter then
{self.handle-event {DateFieldValueFinished}}
}
case fi:FocusIn do
||フォーカスイン時に前回の値を保持する
set self.prev-val = self.value
case fo:FocusOut do
||フォーカスアウト時に前回の値と比較し、変更されていれば DateFieldValueFinished を発生させる
{if self.prev-val != self.value then
{self.handle-event {DateFieldValueFinished}}
}
case dfvfe:DateFieldValueFinished do
|| DateFieldValueFinished のときのみ、ValueFinished が発生するように do-finished?フラグを立てる
{with self.do-finished? = true do
{self.handle-event {ValueFinished}}
}
}
{super.handle-event e}
}
}