Thread Rating:
  • 218 Vote(s) - 2.9 Average
  • 1
  • 2
  • 3
  • 4
  • 5
イベントハンドラの実行順について
07-27-2011, 06:06 PM,
#1
イベントハンドラの実行順について
既にあるイベントハンドラの実行順を制御することは可能でしょうか?
Reply
07-28-2011, 09:22 AM,
#2
RE: イベントハンドラの実行順について
EventTarget.event-handlers (protected) をいじればできるかと思います。個人的にはあまり、、、です。
Reply
07-29-2011, 03:51 PM,
#3
RE: イベントハンドラの実行順について

ご回答ありがとうござます。実現できたとしたとしても弊害が多そうですね。。。
Reply
01-31-2013, 05:20 PM,
#4
RE: イベントハンドラの実行順について
イベント関連でデバッグするたびに混乱するのですが、
イベントが実行される順番は、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
}
Reply

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('165')