トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   どこでもFlash【携帯向けFlash関連】
     FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tato-tato
Åê¹ÆNo.39714
投稿日時: 2008-7-29 15:34
新米
居住地:
投稿: 7
使用環境:
XP Home(SP2)
10.1.3
8pro. + CS3
FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
初めての投稿なので、不足があるかもしれませんが、どうかご助力お願い致します。


-- 環境 --
OS : WinXP(sp2)
Flash : ver8 pro.
パブリッシュ : FlashLite 2.0


-- やりたいこと --
FlashLite2.0のカスタムクラスで、
カスタムクラスのインスタンスを作ると、自動でKeyクラスにリスナーを登録、
[enterキー]押下を検知し、カスタムクラス内の関数を実行する。


-- ソース --
/* カスタムクラス(Test.as) */
class Test{
// リスナーオブジェクト
private var enter_ltn:Object;
public function Test(){
enter_ltn = new Object();
// enterキーの押下で、funcAの呼び出し
enter_ltn.onKeyDown = function(){
if(Key.getCode() == Key.ENTER){
trace("check_A")
funcA();
}
};
Key.addListener(enter_ltn);
};
private function funcA(){
trace("check_B");
};
};


/* カスタムクラス呼び出し元(test.fla) */
var test:Test = new Test();


-- 上記ソース、実行結果 --
○trace("check_A") : 検出
○trace("check_B") : 検出せず


-- 他に試したこと --
[private]を外したり、[funcA]をコンストラクタ前に定義したりしましたが、結果は変わりませんでした…

また、[func_A]自体が認識されてないのかと思い、[func_A]自体を外してみると、「'func_A' という名前のメソッドはありません。」とエラーが出ます

なぜ "check_A" は検出するのに、"check_B" は検出されないのでしょうか…


野中文雄
Åê¹ÆNo.39715
投稿日時: 2008-7-29 17:20
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
Delegateクラスを使われるとよいでしょう。


----------------
 

あにぃ
Åê¹ÆNo.39717
投稿日時: 2008-7-29 19:09
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
/* カスタムクラス(Test.as) */
class Test{
  // リスナーオブジェクト
  private var enter_ltn:Object;
  public function Test(){
    enter_ltn = new Object();
    // enterキーの押下で、funcAの呼び出し
    enter_ltn.onKeyDown = function(){
      if(Key.getCode() == Key.ENTER){
        trace("check_A")
        funcA();
      }
    };
    Key.addListener(enter_ltn);
    function funcA(){
      trace("check_B");
    };
  };

};


funcAをfunction Testの中で定義したらできるような気がしますが。。


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

tato-tato
Åê¹ÆNo.39718
投稿日時: 2008-7-29 19:40
新米
居住地:
投稿: 7
使用環境:
XP Home(SP2)
10.1.3
8pro. + CS3
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
野中様、コメントありがとうございます。
いつも野中様のサイトで勉強させて頂いております。

引用:

Fumioさんは書きました:
Delegateクラスを使われるとよいでしょう。


上記ご助言を頂きまして、参考にさせて頂きましたが、未だ解決できずにおります。

-- ソース変更前 --
Key.addListener(enter_ltn);

-- ソース変更後 --
import mx.utils.Delegate;
class Test{
<中略>
Key.addListener(enter_ltn, Delegate.create(func_A));


上記のように変更しましたが、結果は変わりませんでした…
また、[addListener]を[addEventListeher]に変更しようとしましたが、Keyクラスに[addEventListener]は使用できないとエラーが表示されてしまいます…。
(コンポーネントや、その他オブジェクトを押下するのではなく、Keyクラスで処理したいのです)

頂戴しましたドキュメントを参照しますと、コンポーネントと[addEventListener]を利用した例しかなく、何ともままならない状態です。

私の読解力不足が問題かもしれませんので、もう一度最初から読み直してみます。。。
tato-tato
Åê¹ÆNo.39719
投稿日時: 2008-7-29 19:57
新米
居住地:
投稿: 7
使用環境:
XP Home(SP2)
10.1.3
8pro. + CS3
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
あにぃ様、コメントありがとうございます。

あにぃ様のご助言通り、コンストラクタの中で定義したら出来ました!

コンストラクタの中では、[function]を使わないと言う先入観があったんですが、違っていたようですね。
と言いながら、改めてソースを見ると[enter_ltn.onKeyDown = funciton()]で既に書いてますね…(苦笑)


あにぃ様、野中様、ありがとうございました!
ひろゆき
Åê¹ÆNo.39720
投稿日時: 2008-7-29 20:08
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
class Test {

	private var enter_ltn:Object;

	public function Test() {
		enter_ltn = new Object();
		enter_ltn.onKeyDown = function():Void {
			if (Key.getCode() == Key.ENTER) {
				trace("check_A")
				this.funcA();
			}
		});
		Key.addListener(enter_ltn);
	}
	private function funcA():Void {
		trace("check_B");
	}

}
thisをつけてみると、問題点がはっきりします。
このthisは、enter_ltnを指すことになります。

import mx.utils.Delegate;

class Test {

	private var enter_ltn:Object;

	public function Test() {
		enter_ltn = new Object();
		enter_ltn.onKeyDown = Delegate.create(this, function():Void {
			if (Key.getCode() == Key.ENTER) {
				trace("check_A")
				funcA();
			}
		});
		Key.addListener(enter_ltn);
	}
	private function funcA():Void {
		trace("check_B");
	}

}

Delegateとスコープ (2)」も参考まで。


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.39721
投稿日時: 2008-7-29 20:15
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
何が問題なのかは、おわかりになっていますか?
/* カスタムクラス(Test.as) */
class Test {
	// リスナーオブジェクト
	private var enter_ltn:Object;
	public function Test() {
		enter_ltn = new Object();
		enter_ltn.whoAreYou = "I am a listener";
		// enterキーの押下で、funcAの呼び出し
		enter_ltn.onKeyDown = function() {
			if (Key.getCode() == Key.ENTER) {
				trace("check_A");
				trace([this, funcA, this["whoAreYou"]]);
				funcA();
			}
		};
		Key.addListener(enter_ltn);
	}
	private function funcA() {
		trace("check_B");
	}
}

また、スクリプトはシンタックスどおりに記述しなければ、正しく動作しないのは当然です。

[Key.addListenerメソッド]より引用:
public static addListener(listener:Object) : Void

イベントの委譲 (Delegateクラス)」より引用:
Delegate.create(スコープオブジェクト, 関数)

引用:
tato-tatoさんは書きました:
Key.addListener(enter_ltn, Delegate.create(func_A));

上記のように変更しましたが、結果は変わりませんでした…
また、[addListener]を[addEventListeher]に変更しようとしましたが、Keyクラスに[addEventListener]は使用できないとエラーが表示されてしまいます…。
(コンポーネントや、その他オブジェクトを押下するのではなく、Keyクラスで処理したいのです)


----------------
 

tato-tato
Åê¹ÆNo.39727
投稿日時: 2008-7-30 13:46
新米
居住地:
投稿: 7
使用環境:
XP Home(SP2)
10.1.3
8pro. + CS3
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
野中様、度々ありがとうございます。
ひろゆき様、いつもサイト拝見しております。

まずソースですが、下記のように変更し、求める結果が得られるようになりました。
先に、ご助言頂きました、あにぃ様、野中様、ひろゆき様、ありがとうございます。

-- ソース --
import mx.utils.Delegate;

class Test {
private var enter_ltn:Object;
public function Test() {

enter_ltn = new Object();
enter_ltn.onKeyDown = Delegate.create(this, funcZ);
function funcZ(){
if (Key.getCode() == Key.ENTER) {
trace("check_A");
funcA();
}
};
Key.addListener(enter_ltn);
}
private function funcA() {
trace("check_B");
}
}



>>野中様
スコープに問題があったのは理解できていたのですが、
Delegateの使用法を完全に誤ってました。。。
完全に私の読解力不足です。すみません。


>>ひろゆき様
「Delegateとスコープ」拝見しました。
疑問点を一つひとつ解消していく流れが、とても理解しやすかったです。


---

結果、[Delegate.create]を使用して思い通りの結果を得られるようになったのですが、
スコープについて未だ理解できずにいる部分があります。
今の私は、[enter_ltn]にあったスコープを、funcZをコールする時のみ[this(Testクラスのインスタンス)]に移動させる。と解釈しているのですが、
そうなると、あにぃ様にご助言頂きました際にでた、下記ソースで、[funcA]は[enter_ltn]の外にあるのに、[(this.)funcA]だけで何故アクセスできるのでしょうか。。。

class Test{
private var enter_ltn:Object;
public function Test(){
enter_ltn = new Object();
enter_ltn.onKeyDown = function(){
if(Key.getCode() == Key.ENTER){
trace("check_A")
funcA();
}
};
Key.addListener(enter_ltn);
function funcA(){
trace("check_B");
};
};
};


もっとスコープについて勉強するつもりですが、
もしできましたら切っ掛けになるワードなど教えて頂けませんでしょうか。

あと、本件とは関係の無いことですが、
ソース部分の、行頭に「タブ」や「スペース」を入力して
もっと読み易く書き込みたいのですが、何故かプレビュー時に省略されてしまいます。。。
皆様はどの様にして行頭の間隔を空けてらっしゃるのかご教授頂けませんでしょうか。。。
あにぃ
Åê¹ÆNo.39728
投稿日時: 2008-7-30 14:02
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
funcZがenter_ltnからTestに移動したとすれば、その中でのthisの参照はどこになるか考えてみましょう。おのずと答えがでるはずです。

引用:
あと、本件とは関係の無いことですが、
ソース部分の、行頭に「タブ」や「スペース」を入力して
もっと読み易く書き込みたいのですが、何故かプレビュー時に省略されてしまいます。。。
皆様はどの様にして行頭の間隔を空けてらっしゃるのかご教授頂けませんでしょうか。。。

投稿フォームの使い方
このへんを読みましょう^^


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

野中文雄
Åê¹ÆNo.39732
投稿日時: 2008-7-30 22:24
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: FlashLite2.0 - カスタムクラス内での、イベントリスナーの挙動
まず、thisの参照先を確かめるべきでしょう。キーワードは「Activationオブジェクト」です。

参考: FLASH-japan「関数をメインタイムライン上に集結させたいの
にゃあプロジェクト「Activationオブジェクトって何?
引用:
tato-tatoさんは書きました:
今の私は、[enter_ltn]にあったスコープを、funcZをコールする時のみ[this(Testクラスのインスタンス)]に移動させる。と解釈しているのですが、
そうなると、あにぃ様にご助言頂きました際にでた、下記ソースで、[funcA]は[enter_ltn]の外にあるのに、[(this.)funcA]だけで何故アクセスできるのでしょうか。。。
import mx.utils.Delegate;
class Test {
	private var enter_ltn:Object;
	private var myVar:String = "instance";
	public function Test() {
		var myVar:String = "local";
		var myFunc:Function = 
		Delegate.create(this, funcB);
		enter_ltn = new Object();
		enter_ltn.onKeyDown = function() {
			if (Key.getCode() == Key.ENTER) {
				trace("check_A");
				funcA();
				myFunc();
			}
		};
		Key.addListener(enter_ltn);
		function funcA() {
			// trace("check_B");
			trace([this, this.myVar]);
		}
	}
	private function funcB():Void {
		trace([this, this.myVar]);
	}
}

もっとスコープについて勉強するつもりですが、
もしできましたら切っ掛けになるワードなど教えて頂けませんでしょうか。



----------------
 

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops