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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     連番でたくさんあるボタンの処理を、カンタンに定義したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
larrabie
Åê¹ÆNo.40880
投稿日時: 2008-11-28 15:25
新米
居住地:
投稿: 3
使用環境:
連番でたくさんあるボタンの処理を、カンタンに定義したい
ボタンが30個あるとして、それぞれ[btn1]?[btn30]という名前だとします。
[btn1]をおしたときは関数myFuncに「1」の処理を、[btn5]をおしたときは「5」の処理をさせたいときに
AS2.0まではmyFuncに引数をわたしていたのですが
以下のように書いていたのですが、AS3.0ではどのようにするのでしょうか。


for(i=1; i<=30; i++){
this["btn"+i].onRelease = function(){
var namestr:String = this._name;
var id:String = namestr.length < 10 ? namestr.substr(1,1) : namestr.substr(1,2) ;
myFunc(id);
}
}

function myFunc(id){
trace(id);
}


こちらの記事がかなり近いのですが、最後の解決策となる
スーパークラスBaseClassにメソッドを定義して対処する事にします。
というところが具体的に分かりませんでした。。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8163&forum=20

ご教授いただけると幸いです。


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

Tonpoo (gaienboy改め)
Åê¹ÆNo.40881
投稿日時: 2008-11-28 17:23
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
gaienboyです。まんまバッチリの正解ではなくて申し訳ないですが、例えば
AS2.0の場合でも、以下のようにiの値をボタンに記録してあげれば、より簡単に
(?)その値を呼び出すことが出来ます。

for(var i:Number=1;i<=30;i++){
     this["btn"+i].myId = i;
     this["btn"+i].onRelease = function():Void{
          myFunc(this.myId);
     };
}


今回の場合も、これを応用すればうまくいくのではないでしょうか?

※ちなみに、AS2.0とAS3.0とのスクリプトの書き方の違いなどは理解なさってい
ますか?「_name」というMovieClipのプロパティもなくなり、クリックしたとき
のアクションの指定方法も「MovieClip.onRelease」は使えませんよ。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

野中文雄
Åê¹ÆNo.40885
投稿日時: 2008-11-29 1:05
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
「ボタン」が「30個」でなく、ひとつならおわかりになるのですか?ActionScript 3.0でも、「myFuncに引数をわた」すことは問題なくできます。

ひとつご注意として申し上げるなら、マウスイベントに設定した(コールバックまたはリスナー)関数内におけるthisの参照先が、ActionScript 3.0では2.0とは変わりました。そのため、関数が受取るイベントオブジェクトのcurrentTargetプロパティからDisplayObject.nameプロパティを取得すればよいと思います。

ところで、インスタンス名の文字数は4?5で10よりつねに小さいでしょうから、すべてのインスタンス名に共通な"btn"の"t"が必要なのですか?

なお、「スーパークラスBaseClassにメソッドを定義」というのは、シンボルにクラス定義をした場合の話です。「最後の解決策」の手前までの、議論の経過はおわかりになったのでしょうか?
引用:
larrabieさんは書きました:
ボタンが30個あるとして、それぞれ[btn1]?[btn30]という名前だとします。
[btn1]をおしたときは関数myFuncに「1」の処理を、[btn5]をおしたときは「5」の処理をさせたいときに
AS2.0まではmyFuncに引数をわたしていたのですが
以下のように書いていたのですが、AS3.0ではどのようにするのでしょうか。
for(i=1; i<=30; i++){
	this["btn"+i].onRelease = function(){
		var namestr:String = this._name;
		var id:String = 
		namestr.length < 10 ? namestr.substr(1,1) : namestr.substr(1,2) ;
		// ...[後略]...

こちらの記事がかなり近いのですが、最後の解決策となる
スーパークラスBaseClassにメソッドを定義して対処する事にします。
というところが具体的に分かりませんでした。。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8163&forum=20


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

kingofkofs
Åê¹ÆNo.40889
投稿日時: 2008-11-29 13:50
新米
居住地: XIAMEN_CHINA
投稿: 6
使用環境:
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
for(var j=0;j<10;j++){
var btn=new btn()
btn.addEvetListener(MosueEvent.MOUSEDOWN,h)
btn.id=j
}

function h(e){
trace(e.target.id)
}

larrabie
Åê¹ÆNo.40891
投稿日時: 2008-11-29 14:10
新米
居住地:
投稿: 3
使用環境:
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
gaienboyさん、野中さん、こんにちわ。
レスありがとうございます。

質問の仕方がわるく大変失礼いたしました。
AS3でどこまで試したかを書かなかったので、まるで丸投げの質問のようになってしまってました。

実は、質問させていただいたあと、やりたいこととしては自己解決しました。
ですがこの場をのりきれればいいやというよりは、今後のために考え方から勉強していきたいので
おかしいところがありましたらご指摘いただけるとうれしいです。

まず、質問の段階では

for(var i:int = 1; i<=30; i++ ){
	this["btn"+i].addEventListener(MouseEvent.MOUSE_UP, myFunc); //←☆
}

function myFunc(e:MouseEvent):void{
	//
}

☆のところでmyFuncにiを引数で渡すにはどうしたらよいのだろう・・と思っていたのですが
引数でなくても、リスナーを呼んだオブジェクトの名前からmyFunc側で「i」を判別すればいいのでは?
という発想で

for(var i:int = 1; i<=30; i++ ){
	this["btn"+i].addEventListener(MouseEvent.MOUSE_UP, myFunc);
}

function myFunc(e:MouseEvent):void{
	var namestr:String = e.target.name;
	var id:String = (namestr.length < 5) ? namestr.substr(3,1) : namestr.substr(3,2);
	trace(id);
}

とし、btnXをおしたときmyFuncがXにひもづいた処理をするということができるようになりました。

これは野中さんのおっしゃっている
引用:

ひとつご注意として申し上げるなら、マウスイベントに設定した(コールバックまたはリスナー)関数内におけるthisの参照先が、ActionScript 3.0では2.0とは変わりました。そのため、関数が受取るイベントオブジェクトのcurrentTargetプロパティからDisplayObject.nameプロパティを取得すればよいと思います。

に当てはまりますでしょうか。

また、引き合いに出させていただいた以前のスレッドではClass自体が1?100で自動生成されるため
引数を受け取れない(今回の私のパターンとは違う)という認識であっていますでしょうか。


今回のパターンで☆のところで引数を渡すやり方、今後別の機会でもはまりそうなのでできれば教えていただけたらと思います。

また、AS2の書き方の方でいただいたご指摘ですが
>gaienboyさん
この書き方のほうが短くてシンプルですね。参考にさせていただきます。
なんとなくnameをsubstrでちょんぎるか、nameの数字のまえに_をいれてsplitするやりかたがくせになっていました。

>野中さん
引用:
ところで、インスタンス名の文字数は4?5で10よりつねに小さいでしょうから、すべてのインスタンス名に共通な"btn"の"t"が必要なのですか?

数値ところどころおかしかったです。。(汗)すみません。


いろいろとありがとうございます。
よろしくお願いいたします。


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

larrabie
Åê¹ÆNo.40892
投稿日時: 2008-11-29 14:34
新米
居住地:
投稿: 3
使用環境:
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
kingofkofsさん こんにちわ。

レスありがとうございます。
いま長々と前の投稿を書いていたら時間がなくなってしまったので
あとで試して、またお返事させていただきます。


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

kingofkofs
Åê¹ÆNo.40893
投稿日時: 2008-11-29 14:44
新米
居住地: XIAMEN_CHINA
投稿: 6
使用環境:
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
si ko si no nihongo o benkyo si de
zenbu ni wakaつ de wa nai

it seems that you have understood? 解決?
野中文雄
Åê¹ÆNo.40894
投稿日時: 2008-11-29 14:55
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
結論として、「自己解決」された方法で結構だと思います。4点ほど補足しておきます。

第1に、ActionScript 2.0のイベントハンドラメソッドも3.0のイベントリスナーも、コールバックまたはリスナー関数に引数は渡せません。→「イベントハンドラメソッドで引数渡し

第2に、MovieClipインスタンスを用いる場合には、Event.targetEvent.currentTargetプロパティでは参照先インスタンスは異なる場合があります。イベントリスナーを登録したインスタンスの参照は、後者で取った方がよいでしょう。→F-siteセミナー「イベントを制する者、ActionScript 3.0を制す

第3に、「以前のスレッド」は、スーパークラスに引数を渡したいというご質問でした。その点で、今回の「パターンとは違う」ことになります。

第4に、ActionScript 3.0では、ボタン(SimpleButton)インスタンスには変数が追加できません。MovieClipインスタンスとはこの点が異なりますので、注意する必要があります。
引用:
larrabieさんは書きました:
	this["btn"+i].addEventListener(MouseEvent.MOUSE_UP, myFunc); //←☆
	//...[後略]...

☆のところでmyFuncにiを引数で渡すにはどうしたらよいのだろう・・と思っていたのですが
引数でなくても、リスナーを呼んだオブジェクトの名前からmyFunc側で「i」を判別すればいいのでは?
...[中略]...
function myFunc(e:MouseEvent):void{
	var namestr:String = e.target.name;
	//...[後略]...

...[中略]...
また、引き合いに出させていただいた以前のスレッドではClass自体が1?100で自動生成されるため
引数を受け取れない(今回の私のパターンとは違う)という認識であっていますでしょうか。
...[中略]...
この書き方のほうが短くてシンプルですね。参考にさせていただきます。
なんとなくnameをsubstrでちょんぎるか、nameの数字のまえに_をいれてsplitするやりかたがくせになっていました。


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

野中文雄
Åê¹ÆNo.40895
投稿日時: 2008-11-29 15:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
S/he said that s/he would try your suggestion later because of no time today. Then s/he will reply.
引用:
kingofkofsさんは書きました:
it seems that you have understood? 解決?

P.S. In your code, the class "btn" should be defined as a dynamic one, otherwise the public property "id" should be declared, shouldn't it?


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

kingofkofs
Åê¹ÆNo.40897
投稿日時: 2008-11-29 20:05
新米
居住地: XIAMEN_CHINA
投稿: 6
使用環境:
Re: 連番でたくさんあるボタンの処理を、カンタンに定義したい
S/he said that s/he would try your suggestion later because of no time today. Then s/he will reply.

so u de su ga

P.S. In your code, the class "btn" should be defined as a dynamic one, otherwise the public property "id" should be declared, shouldn't it?

yes ,btn extends from MovieClip ,so it's not a static class
the public property "id" not be declared will be ok
p.s. (my poor English)

if the btn is in stage already(draged into stage from lib)
and has instance name ...like.. btn1..btn2..btnx
we can use "getChildByName()"


for(var i:int = 1; i<=30; i++ ){
var _mc=stage.getChildByName("btn"+i) as MovieClip
_mc.addEventListener(MouseEvent.MOUSE_UP, myFunc);
}

function myFunc(e:MouseEvent):void{
var namestr:String = e.target.name;
var id:String = (namestr.length < 5) ? namestr.substr(3,1) : namestr.substr(3,2);
trace(id);
}

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

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