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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     イベントハンドラを関数に??
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
pirotto
Åê¹ÆNo.32721
投稿日時: 2007-4-1 7:31
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
ひろゆきさん、野中さん回答ありがとうございます。回答いただいた件、現段階で全て理解出来ているとは言えないと思いますが自分自身問題点を再確認したく返答させて下さい。

==機種依存文字==
文字から想像し『』の事ではないかと思い込んでいました。実際googleで検索もしたのですが『』だと思い込んでいたこともあり『』がなかったため(当然ですが)掲示板やメールによって違った解釈があるのかと思い、自分の書いた文と照らし合わせずに投げ出してしまっていました。本質問内容と直接は関係ないと思いそこまで真剣に調べようとしなかったのも事実だと思います。大変失礼なことをしてしまったと思っています。申し訳ございませんでした。

=本スクリプトに関して=
typeof演算子の出力についてですが同じように検索などによって調べてはみたのですがはっきりしませんでした。
"a""book"などがstringになるという事は理解できるがobject、movieclipがどういったものをさすのかが分からないという意味でした。調べた範囲でインスタンス名をさすのかとも思ったのですが配列演算子をさすという事が分からず、インスタンスがない場合にもobjectと出力されるので混乱し、意味が分からないという表現になりました。
ただ、インスタンス名を指すという事であれば文字列と同じものが出力されるので、今回の使用方法に関してはどちらでも使用できるのかと思い同じものとして理解していいのかという表現になりました。
今回、[b+i]、["about"+this.i]が配列の作成でobjectになるという事は理解できたのですが、
if (hensuu ==
の後に続く値としてstringとobjectのどちらが適切かということが分かりません。出力して同じ値になるという事はどちらでもいいというふうに思えてしまいます。変数に代入されているのが文字列なので同じように文字列を入れないといけないという事でしょうか?よろしくお願いします。
野中文雄
Åê¹ÆNo.32722
投稿日時: 2007-4-1 8:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
この件から得られる教訓は、「思い込み」は排して、「事実」を確かめるのが大切だということです。
引用:
pirottoさんは書きました:
文字から想像し『』の事ではないかと思い込んでいました。

先の回答に引用した「データ型の取得」に解説されている「typeof 演算子が返す文字列:実習」の「12」と「13」はお読みになり、ご自分でも試してご覧になりましたか?
引用:
"a""book"などがstringになるという事は理解できるがobject、movieclipがどういったものをさすのかが分からないという意味でした。

前述「12」の例を使ったとします。以下のtarce()ステートメントの出力は、すべて異なるはずです。
trace(test_mc);  // 出力: インスタンスのパス
trace(test_mc._name);  // 出力: インスタンス名
trace(typeof test_mc);  // 出力: データのタイプ

「インスタンスがない」というのが、(データあるいは値が)何も存在しないことを指すのであれば、「objectと出力される」ことはないはずです。どのような場合をいわれているのでしょう。
引用:
調べた範囲でインスタンス名をさすのかとも思ったのですが配列演算子をさすという事が分からず、インスタンスがない場合にもobjectと出力されるので混乱し、意味が分からないという表現になりました。

「インスタンス名」は指しませんし、「文字列と同じものが出力される」ことはありません。
引用:
ただ、インスタンス名を指すという事であれば文字列と同じものが出力されるので、今回の使用方法に関してはどちらでも使用できるのかと思い同じものとして理解していいのかという表現になりました。

単純に文字列と、その文字列が格納された配列をtrace()ステートメントで出力した場合には、確かに同じ「文字」が「表示」されます。しかし、「値」は異なりますし、「どちらでもいい」ことにはなりません。

つぎのスクリプトも、前述「12」の例を使ってお試しください。
_root.about5 = test_mc;
trace(_root["about5"]);
hensuu = "about5";
test_string = "about5";
test_object = ["about5"];
trace(hensuu == test_string);
if (hensuu == test_string) {
	trace(true);
} else {
	trace(false);
}
trace(hensuu == test_object);
if (hensuu == test_object) {
	trace(true);
} else {
	trace(false);
}

[ムービープレビュー]時に、併せて[デバッグ]メニューで[変数のリストアップ]を行い、各値がどのように異なるかを確認されるとよいでしょう。
引用:
if (hensuu ==
の後に続く値としてstringとobjectのどちらが適切かということが分かりません。出力して同じ値になるという事はどちらでもいいというふうに思えてしまいます。どういった違いがあるのかがわかりません。よろしくお願いします。


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

pirotto
Åê¹ÆNo.32732
投稿日時: 2007-4-3 6:58
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
前回記載頂いた内容、スクリプトについて理解できるようになったと思います。確認指せて下さい。

引用:

_root.about5 = test_mc;
trace(_root["about5"]);
hensuu = "about5";
test_string = "about5";
test_object = ["about5"];
trace(hensuu == test_string);
if (hensuu == test_string) {
trace(true);
} else {
trace(false);
}
trace(hensuu == test_object);
if (hensuu == test_object) {
trace(true);
} else {
trace(false);
}

_root.about5 = test_mc;
 変数test_object にはムービークリップtest_mcを代入する。
trace(_root["about5"]);
 about5 のパスが出力される。
hensuu = "about5";
 変数hensuu に文字列about5を代入。
test_string = "about5";
 変数test_string に文字列about5を代入。
test_object = ["about5"];
 変数test_object にオブジェクトabout5を代入
 ([]を用いているため配列の作成となりタイプがobjectになる。)
trace(hensuu == test_string);
 hensuuが文字列、test_stringも文字列で両方ともabout5になるため同じものという事になりtrueが出力される。
if (hensuu == test_string) {
trace(true);
} else {
trace(false);
}
 同様にif式が成立するためtrueが出力される。
trace(hensuu == test_object);
 hensuuが文字列でtest_objectがオブジェクトの為、同じものではなく、falseが出力される。
if (hensuu == test_object) {
trace(true);
} else {
trace(false);
}
 同様にif式が成立しないためfalseが出力される。
===================
以上の事よりタイプが違うものは同じものと認識されないということが分かりました。どこか間違って解釈しているところはあるでしょうか?
そこで、forを使った元のスクリプトを直したところ無事作動左折事が出来ました。

for (i=1; i<=16; i++) {
  this["item"+i].id = i;
  this["item"+i].onEnterFrame = function() {
    if (item !== "about"+this.id) {
//trace("about"+this.i);
      this.gotoAndStop("before");
    } else {
      this.gotoAndStop("after");
    }
  } 
};

しかし2点ほどあやふやなままの箇所があるので質問続けさせて下さい。
一つ目は以前リンクを貼って頂いている「forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」の内容です。この箇所に関して完全に理解している分けではないのでしっくりきていません。ここはまだまだ勉強不足だと思うのでもう一度自分で読み返し、試行錯誤してみます。また、改めて質問させて頂くかもしれませんがよろしくおねがいします。
二つ目は、以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。これでもスクリプト自体問題はないみたいですが、なぜだか分からずしっくりきません。これは無視して大丈夫なのでしょうか?
色々書いてしまい、長くなってしまいましたがよろしくお願い致します。
ひろゆき
Åê¹ÆNo.32733
投稿日時: 2007-4-3 8:34
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: イベントハンドラを関数に??
引用:
trace(hensuu == test_string);
 hensuuが文字列、test_stringも文字列で両方ともabout5になるため同じものという事になりtrueが出力される。

両方とも"about5"になるため...
と表現する方が良さそうな気がしますが。


一旦決着がついたのであれば、マルチポスト先にも、きちんとフィードバックを行ってください。


引用:
以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。

onEnterFrameの動作


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

野中文雄
Åê¹ÆNo.32734
投稿日時: 2007-4-3 14:19
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
基本的に、その理解で結構だと思います。

ちなみに、いつもタイプが違えば等価とされない訳ではありません。けれど、データのタイプも意識して、スクリプトを書くことは大切です。なお、タイプまで厳密に比較したいときには、厳密な等価演算子===を使います。
var n = 1;
var n_str = "1";
trace(typeof n);
trace(typeof n_str);
trace(n == n_str);
trace(n === n_str);

引用:
pirottoさんは書きました:
以上の事よりタイプが違うものは同じものと認識されないということが分かりました。どこか間違って解釈しているところはあるでしょうか?

以下のドキュメントは、もう少し込入った別の内容を扱っています。ですから、データタイプの件をまずクリアしてから検討されるようお勧めしました。

テストの要領もおわかりになってきたでしょうから、いろいろと試してみてください。
引用:
一つ目は以前リンクを貼って頂いている「forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」の内容です。この箇所に関して完全に理解している分けではないのでしっくりきていません。ここはまだまだ勉強不足だと思うのでもう一度自分で読み返し、試行錯誤してみます。また、改めて質問させて頂くかもしれませんがよろしくおねがいします。

インスタンスの重ね順は、どうなっているでしょう?その順序を変えて、結果を確認してください。また、[パブリッ種設定]の[Flash]タブで、[ダウンロードの順序]を変更して、変化を確かめてみましょう。
引用:
二つ目は、以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。これでもスクリプト自体問題はないみたいですが、なぜだか分からずしっくりきません。これは無視して大丈夫なのでしょうか?


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

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

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