<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.alumican.net &#187; HELP!</title>
	<atom:link href="http://blog.alumican.net/tag/help/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.alumican.net</link>
	<description>日々の記憶と記録とActionScript とその周辺</description>
	<lastBuildDate>Tue, 20 Jul 2010 16:21:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TimerEvent.TIMERのdispatcherが分からない（追記あり）</title>
		<link>http://blog.alumican.net/2009/07/22_225206</link>
		<comments>http://blog.alumican.net/2009/07/22_225206#comments</comments>
		<pubDate>Wed, 22 Jul 2009 13:52:06 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[HELP!]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1083</guid>
		<description><![CDATA[Timerクラスを継承したMyTimerクラスを作ってみる。
MyTimerはdispatchEventをオーバーライドしているので、
Timerが発行するイベント（TimerEvent.TIMERとTimerEvent [...]]]></description>
			<content:encoded><![CDATA[<p>Timerクラスを継承したMyTimerクラスを作ってみる。<br />
MyTimerはdispatchEventをオーバーライドしているので、<br />
Timerが発行するイベント（TimerEvent.TIMERとTimerEvent.TIMER_COMPLETE）を検出できるはず･･･だった。</p>
<pre><code>package {
  import flash.events.Event;
  import flash.utils.Timer;

  public class MyTimer extends Timer {

    public function MyTimer(delay:Number, repeatCount:int = 0):void {
      super(delay, repeatCount);
    }

    /**
     * dispatchEventをオーバーライドする
     */
    override public function dispatchEvent(event:Event):Boolean {
      <span style="color: #ff0000;">trace(event.type);</span>
      return super.dispatchEvent(event);
    }
  }
}</code></pre>
<p><span id="more-1083"></span></p>
<p>で、下記のテスト用コードを実行してみる。<br />
0.1秒間隔でタイマーを10回繰り返し実行する簡単なもの。<br />
TIMERイベントとTIMER_COMPLETEイベントに対してそれぞれ、timerHandler関数とtimerCompleteHandler関数をaddEventListenerしており、関数内でどのインスタンスからdispatchされたイベントなのか出力するようにした。</p>
<pre><code>var myTimer:MyTimer = new MyTimer(100, 10);
myTimer.addEventListener(TimerEvent.TIMER         , timerHandler);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
myTimer.start();

function timerHandler(e:TimerEvent):void {
  <span style="color: #0000ff;">trace(e.target);</span>
}

function timerCompleteHandler(e:TimerEvent):void {
  <span style="color: #008000;">trace(e.target);</span>
}</code></pre>
<p>当然オーバーライドしたdispatchEventを通過したのと同じ数だけきっかり、イベントハンドラが実行されるものだと思っていたのだけれど、実行結果はこうなってしまった。</p>
<pre><code><span style="color: #0000ff;">[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]</span>
<span style="color: #ff0000;">timerComplete</span>
<span style="color: #008000;">[object MyTimer]</span></code></pre>
<p>timerHandler関数は実行されているのだけれども、TIMERイベント発行に際してMyTimerクラスのdispatchEventを通過していない様子。どこでイベントが発行されているんだろうか。<br />
一方、TIMER_COMPLETEイベントは期待通り。</p>
<p>うーん、よくわからないです。<br />
教えてえらいひと！</p>
<p><strong>追記　09.07.26</strong><br />
niumさんにコメントもらいました。</p>
<blockquote><p> 可能性 1, Timer が super.dispatchEvent() してる。 可能性 2, 内部で別の EventDispatcher に委譲してる。 Timer のソースが読めないと何ともｗ</p></blockquote>
<p>試しに、オーバーライドしたdispatchEvent内の処理を下記のようにしてみました。</p>
<pre><code>override public function dispatchEvent(event:Event):Boolean {
  <span style="color: #ff0000;">return false;</span>
}</code></pre>
<p>この場合、TIMERイベントは正常に動作しますが、TIMER_COMPLETEイベントは動作しませんでした。確かに、TIMERイベントに関しては別の処理系がdispatchEventをしているようです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/07/22_225206/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
