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



イベントハンドラの実行順について - snishimura - 07-27-2011

既にあるイベントハンドラの実行順を制御することは可能でしょうか?


RE: イベントハンドラの実行順について - yosuga - 07-28-2011

EventTarget.event-handlers (protected) をいじればできるかと思います。個人的にはあまり、、、です。


RE: イベントハンドラの実行順について - snishimura - 07-29-2011


ご回答ありがとうござます。実現できたとしたとしても弊害が多そうですね。。。


RE: イベントハンドラの実行順について - umemura - 01-31-2013

イベント関連でデバッグするたびに混乱するのですが、
イベントが実行される順番は、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
}