07-27-2011, 06:06 PM
07-28-2011, 09:22 AM
EventTarget.event-handlers (protected) をいじればできるかと思います。個人的にはあまり、、、です。
07-29-2011, 03:51 PM
ご回答ありがとうござます。実現できたとしたとしても弊害が多そうですね。。。
01-31-2013, 05:20 PM
イベント関連でデバッグするたびに混乱するのですが、
イベントが実行される順番は、add-event-handler で追加した順と逆になりますよね。
たとえば、共通部品として、入力された数値に「円」をつけるテキストフィールドを作ろうとしたときに、
default コンストラクタ内にadd-event-handler で処理を実装すると、
利用する側で、イベントをコンストラクタにイベントを入れるか、add-event-handler で後からつけるかで、振る舞いが変わってしまいます。
これを避けるには、handle-event で、どんなイベントでも、必ず実行前に処理されるように実装するのが正しいのでしょうか。
イベントが実行される順番は、add-event-handler で追加した順と逆になりますよね。
たとえば、共通部品として、入力された数値に「円」をつけるテキストフィールドを作ろうとしたときに、
default コンストラクタ内にadd-event-handler で処理を実装すると、
利用する側で、イベントをコンストラクタにイベントを入れるか、add-event-handler で後からつけるかで、振る舞いが変わってしまいます。
これを避けるには、handle-event で、どんなイベントでも、必ず実行前に処理されるように実装するのが正しいのでしょうか。
Code:
{define-class public AETextField {inherits TextField}
{constructor public {default ...}
{construct-super {splice ...}}
{self.add-event-handler
{on FocusOut do
set self.value = self.value & "円"
}
}
{self.add-event-handler
{on FocusIn do
set self.value = {self.value.substr 0, {max self.value.size - 1, 0}}
}
}
}
}
振る舞いが異なる
{VBox
"コンストラクタ内で popup のイベントを指定",
{AETextField
{on FocusOut at tf:AETextField do
{popup-message tf.value}
}
}
}
{def atf = {AETextField}}
{do
{atf.add-event-handler
{on FocusOut at tf:AETextField do
{popup-message tf.value}
}
}
}
{VBox
"インスタンス化後、add-event-handler で popup のイベントを指定",
atf
}
{define-class public HETextField {inherits TextField}
{constructor public {default ...}
{construct-super {splice ...}}
}
{method public {handle-event event:Event}:void
{type-switch event
case fo:FocusOut do
set self.value = self.value & "円"
case fi:FocusIn do
set self.value = {self.value.substr 0, {max self.value.size - 1, 0}}
}
{super.handle-event event}
}
}
振る舞いは同じ
{VBox
"コンストラクタ内で popup のイベントを指定",
{HETextField
{on FocusOut at tf:HETextField do
{popup-message tf.value}
}
}
}
{def htf = {HETextField}}
{do
{htf.add-event-handler
{on FocusOut at tf:HETextField do
{popup-message tf.value}
}
}
}
{VBox
"インスタンス化後、add-event-handler で popup のイベントを指定",
htf
}