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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     存在するのにnull?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Telkun
Åê¹ÆNo.41159
投稿日時: 2009-1-7 18:43
半人前
居住地: 博多区
投稿: 37
使用環境:
WinXP-Pro,Flash CS4 Pro(Player10,AS3.0)
AIR1.5
存在するのにnull?
こんにちは。
同じ書式で書いても原因不明な警告が出るので質問します。

ステージ上のMC(stepForm)のクラスから見てRoot(ステージ)を 
 var Root:MovieClip=root as MovieClip;

で定義して、ステージ上にあるMCをstepFormのASファイル内で
 Root.mc0
 Root.mc1
   ・
   ・

としました。つまり、子→親→子で兄弟MCのパス定義です。これらはクリック動作のため、
以下の書き方でaddEventListener しています。
 Root.mc0.buttonMode=true;
 Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click); //クリックして動作

この書式では3個目(mc2)までは問題無かったのですが、4個目(mc3)以降は
 #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。

が出ます  全く同じ書式で、しかも「明らかに存在するMC」なのにnullになるのは何故でしょうか?
何度確かめても、試しに他のインスタンス名にしても同じ警告が出ます。

よろしく願います。
野中文雄
Åê¹ÆNo.41160
投稿日時: 2009-1-7 19:22
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 存在するのにnull?
まず、「としました」というのが、どうされたのかわかりかねます。[プロパティ]パネルでインスタンス名を入力したということでしょうか?

つぎに、当面の課題はインスタンスの存在を確かめることですから、trace()関数で[出力]するだけで十分でしょう。
引用:
Telkunさんは書きました:
ステージ上のMC(stepForm)のクラスから見てRoot(ステージ)を 
 var Root:MovieClip=root as MovieClip;

で定義して、ステージ上にあるMCをstepFormのASファイル内で
 Root.mc0
 Root.mc1
   ・
   ・

としました。つまり、子→親→子で兄弟MCのパス定義です。これらはクリック動作のため、
以下の書き方でaddEventListener しています。
// Root.mc0.buttonMode=true;
// Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click);	//クリックして動作
trace(Root.mc0);

Flashのバグでないとするならば、つぎのふたつが高い確率で「推測」されます。

[1] 問題のMovieClipは、少なくともステートメントの実行時に存在しない。
[2] どこかに「全く同じ」でない部分がある。

しかし、もう1度落着いてご質問の文面をお読みいただければおわかりいただけるとおり、上記の原因を探るための情報はほとんど提供されていません(「4個目(mc3)以降」のスクリプトや設定内容が、具体的に何も書かれていません)。

いわば「間違い探し」をしようというのですから、ふたつの絵を、ただし問題を絞込んだうえで、詳しく示していただく必要があります。
引用:
この書式では3個目(mc2)までは問題無かったのですが、4個目(mc3)以降は
 #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。

が出ます  全く同じ書式で、しかも「明らかに存在するMC」なのにnullになるのは何故でしょうか?


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

Telkun
Åê¹ÆNo.41161
投稿日時: 2009-1-7 20:47
半人前
居住地: 博多区
投稿: 37
使用環境:
WinXP-Pro,Flash CS4 Pro(Player10,AS3.0)
AIR1.5
Re: 存在するのにnull?
すいません、ご指摘の点を補足します。「?としました」の部分は

 Root.mc0.buttonMode=true;
 Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click); //クリックして動作

 Root.mc1.buttonMode=true;
 Root.mc1.addEventListener (MouseEvent.CLICK, mc1_click); //クリックして動作

という書式の繰り返し(コピペ)です。全てのインスタンス名は、[プロパティ]パネルで指定しています。
しかし、デバッグモードでプレビューすると、必ず下の部分で止まります

 Root.mc3.buttonMode=true; // デバッグはこの行を指す
 Root.mc3.addEventListener (MouseEvent.CLICK, mc3_click);

奇妙なことに 全く同じ条件で設置した他のMCと検証するため、stepFormのASファイル内で
 trace ("子MC: "+Root.mc3+", "+Root.mc2);
とすると 子MC: null, [object MovieClip] になるのですが、Root(親)のAS内で
 trace ("Root: "+this.mc3+", "+this.mc2); 
とした時には正しく Root: [object MovieClip], [object MovieClip] が表示されます。

実際、親側に
 this.mc3.buttonMode=true;
  this.mc3.addEventListener (MouseEvent.CLICK, mc3_click);

と書くと正しく認識されます。つまり、親→子はOKですが特定の兄弟の参照は不可の状態です。
野中文雄
Åê¹ÆNo.41163
投稿日時: 2009-1-7 21:59
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 存在するのにnull?
どうしてもイベントリスナーを登録して試さなければ確かめられないことがあるのでしたら、その内容と理由をご説明ください。
引用:
Fumioは書きました:
つぎに、当面の課題はインスタンスの存在を確かめることですから、trace()関数で[出力]するだけで十分でしょう。
...[中略]...
// Root.mc0.buttonMode=true;
// Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click);	//クリックして動作
// 再修正
trace(parent, this, this.name, parent.getChildIndex(this));
// trace(Root.mc0);
trace(Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace(Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));

Flashのバグでないとするならば、つぎのふたつが高い確率で「推測」されます。

[1] 問題のMovieClipは、少なくともステートメントの実行時に存在しない
[2] どこかに「全く同じ」でない部分がある。

引用:
Telkunさんは書きました:
という書式の繰り返し(コピペ)です。全てのインスタンス名は、[プロパティ]パネルで指定しています。
しかし、デバッグモードでプレビューすると、必ず下の部分で止まります

 Root.mc3.buttonMode=true; // デバッグはこの行を指す
 Root.mc3.addEventListener (MouseEvent.CLICK, mc3_click);
...[中略]...
とすると 子MC: null, [object MovieClip] になるのですが、Root(親)のAS内で
// trace ("Root: "+this.mc3+", "+this.mc2);
trace(this.mc3, this.mc3.name, this.getChildIndex(this.mc3));
trace(this.mc2, this.mc2.name, this.getChildIndex(this.mc2));

とした時には正しく Root: [object MovieClip], [object MovieClip] が表示されます。


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

Telkun
Åê¹ÆNo.41164
投稿日時: 2009-1-8 0:20
半人前
居住地: 博多区
投稿: 37
使用環境:
WinXP-Pro,Flash CS4 Pro(Player10,AS3.0)
AIR1.5
Re: 存在するのにnull?
書いて頂いたTraceで有無を確認したところ、やはりインスタンスmc3は「存在していないことに
なっている」ようです。

また、別の方法として以下のようにChild一覧を作りました。
for (var id=0; id<Root.numChildren; id++) {
trace ("Child: "+Root.getChildAt(id));
}
for (id=0; id<Root.numChildren; id++) {
trace ("- Child: "+Root.getChildAt(id).name);
}

Root内のChild総数はテキストフィールドを含めて7個なので、2つのFor文の行数は同じ
7個になる筈ですが、
・上のFor文はObjectが5個とnullが2個
・下のFor文はObjectが5個のみ

でした。つまり、問題のMCの他にもう1つ「(ステートメントの実行時に)存在が認められていないもの
がある」ということの様です。

これらの「存在が認められていないもの」に共通するのは、他の5個の動作確認に後から追加
したもので、mc3とテキストフィールドです。

FlashCS3-Proでは、設置の順番によって存在が認められないということがあるのでしょうか?
野中文雄
Åê¹ÆNo.41166
投稿日時: 2009-1-8 4:14
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 存在するのにnull?
えーと、問題のインスタンスが「存在していないことになっている」というのは、すでに私の最初の回答で予測したはずです。そこから、まだほとんど進展がないということになります。

すでに今は、インスタンスが存在しない理由を探る段階です。ですから、その手がかりになりそうな値を、trace()関数の引数に追加したつもりです。その[出力]結果は、お知らせいただけないのでしょうか。
引用:
Fumioは書きました:
// 再修正
trace(parent, this, this.name, parent.getChildIndex(this));
// trace(Root.mc0);
trace(Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace(Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));

Flashのバグでないとするならば、つぎのふたつが高い確率で「推測」されます。

[1] 問題のMovieClipは、少なくともステートメントの実行時に存在しない
[2] どこかに「全く同じ」でない部分がある。
...[中略]...
// trace ("Root: "+this.mc3+", "+this.mc2);
trace(this.mc3, this.mc3.name, this.getChildIndex(this.mc3));
trace(this.mc2, this.mc2.name, this.getChildIndex(this.mc2));

引用:

Telkunさんは書きました:
書いて頂いたTraceで有無を確認したところ、やはりインスタンスmc3は「存在していないことになっている」ようです。

その「別の方法」では、ステートメントにしてわずか3行の間に、Root.numChildrenの返す値が7から5に変わったというのですか?あと、「テキストフィールド」というのは、何か必要があるののでしょうか。問題を絞込むことも、最初にお願いしていたはずです。

差上げたアドバイスを試し、その結果を正確に教えていただくというコミュニケーションがはかれなければ、無駄な時間ばかりが過ぎる結果になってしまいます。
引用:
また、別の方法として以下のようにChild一覧を作りました。
for (var id=0; id<Root.numChildren; id++) {
	trace ("Child: "+Root.getChildAt(id));
}
for (id=0; id<Root.numChildren; id++) {
	trace ("- Child: "+Root.getChildAt(id).name);
}

Root内のChild総数はテキストフィールドを含めて7個なので、2つのFor文の行数は同じ
7個になる筈ですが、
・上のFor文はObjectが5個とnullが2個
・下のFor文はObjectが5個のみ


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

Telkun
Åê¹ÆNo.41168
投稿日時: 2009-1-8 13:31
半人前
居住地: 博多区
投稿: 37
使用環境:
WinXP-Pro,Flash CS4 Pro(Player10,AS3.0)
AIR1.5
Re: 存在するのにnull?
度々すいません  以下、Trace結果です。

---------
1)
trace(parent, this, this.name, parent.getChildIndex(this));
trace(Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace(Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));
の場合は、

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at StepFormStage_04b()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at AS_CalcMessenger_10b()

---------

2)
trace(this.mc3, this.mc3.name, this.getChildIndex(this.mc3));
trace(this.mc2, this.mc2.name, this.getChildIndex(this.mc2));
の場合は、

[object MovieClip] mc3 4
[object MovieClip] mc2 2

となっています。なお、Root.numChildrenによる検証は、2個のテキストフィールドを削除した状態で
Child: [object MovieClip]
Child: [object MovieClip]
Child: [object MovieClip]
Child: [object StepFormStage_04b]
Child: null
- Child: mc0
- Child: mc1
- Child: mc2
- Child: stepForm

となり、やはりmc3がnullかつ無名になっています。
野中文雄
Åê¹ÆNo.41170
投稿日時: 2009-1-8 16:47
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 存在するのにnull?
前回のtrace()関数の[出力]では、mc0とmc1の値はエラーなく表示されたのですよね。3つのステートメントをひとつずつ順に外して、どの行がエラーの原因なのかをご確認ください。
引用:
Telkunさんは書きました:
---------
1)
trace(parent, this, this.name, parent.getChildIndex(this));
trace(Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace(Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));

の場合は、

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。

以下のスクリプトに、stepForm、mc0、mc1の値を確かめるステートメントを、同様に(コピー&ペーストで)加えて、結果をお知らせください。おそらく、stepFormインスタンスについて、getChildIndex()メソッドが3を返すと予測します。
引用:
2)
trace(this.mc3, this.mc3.name, this.getChildIndex(this.mc3));
trace(this.mc2, this.mc2.name, this.getChildIndex(this.mc2));

の場合は、

[object MovieClip] mc3 4
[object MovieClip] mc2 2

なお、stepFormインスタンスのシンボルには、クラスを定義してあるのでしょうか?その場合には、プロパティやメソッドの属性指定、テスト用スクリプトの記述場所など、確認すべき要素が増えます。テスト用の最小限の構成にしたうえで、具体的なクラス定義をお示しください。


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

Telkun
Åê¹ÆNo.41171
投稿日時: 2009-1-8 18:47
半人前
居住地: 博多区
投稿: 37
使用環境:
WinXP-Pro,Flash CS4 Pro(Player10,AS3.0)
AIR1.5
Re: 存在するのにnull?
引用:
3つのステートメントをひとつずつ順に外して、どの行がエラーの原因なのかをご確認ください。

順に外しましたが、相変わらずnullになります。そこで、2つのRoot.numChildrenのFor文の内、Root.getChildAt(id).nameを無効にしたところ、エラーは消えました。

引用:
stepForm、mc0、mc1の値を確かめるステートメントを、同様に(コピー&ペーストで)加えて、結果をお知らせください。

この結果は以下の通りです。
[object MovieClip] mc3 4
[object MovieClip] mc2 2
[object MovieClip] mc1 1
[object MovieClip] mc0 0
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at AS_CalcMessenger_10b()

なおstepFormシンボルのクラス定義の内、(長文を避けるため)コンストラクタ以下の抜粋は次のようになっています。
----
public function StepFormStage_04b () {
Root.mc0.buttonMode=true;
Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click);

Root.mc1.buttonMode=true;
Root.mc1.addEventListener (MouseEvent.CLICK, mc1_click);

Root.mc2.buttonMode=true;
Root.mc2.addEventListener (MouseEvent.CLICK, mc2_click);

Root.mc3.buttonMode=true;
Root.mc3.addEventListener (MouseEvent.CLICK, mc3_click);

for (var id=0; id<Root.numChildren; id++) {
trace ("Child: "+Root.getChildAt(id));
}
for (id=0; id<Root.numChildren; id++) {
trace ("- Child: "+Root.getChildAt(id).name);
}

trace ("Child側");
trace (parent, this, this.name, parent.getChildIndex(this));
trace (Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace (Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));
}

function mc0_click (mouseEvt:MouseEvent) {
}
function mc1_click (mouseEvt:MouseEvent) {
}
function mc2_click (mouseEvt:MouseEvent) {
}
function mc3_click (mouseEvt:MouseEvent) {
}
野中文雄
Åê¹ÆNo.41172
投稿日時: 2009-1-8 20:50
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 存在するのにnull?
まず、…… 何度も引用したはずですが、「問題を絞込まない」をよくお読みください。そして、これまでの私の回答も、もう1度読み直してください。

さてつぎに、ご回答の意味がわかりません。
trace(parent, this, this.name, parent.getChildIndex(this));
trace(Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
trace(Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));

「相変わらずnullに」なるというのは、上記「3つのステートメントをひとつずつ順に外して」もいずれも「null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません」というエラーが出るということですか?

さらにわからないのは、「For文の内、Root.getChildAt(id).nameを無効にしたところ、エラーは消え」たのですよね。でしたら、上記3つのステートメントは「エラーの原因」ではなく、[出力]結果が表示されたのではないのですか?その結果は、お教えいただけないのでしょうか。いずれにしても、「For文」は必要な情報を得る妨げとなっているようですから、すべて削除してください
引用:
Telkunさんは書きました:
順に外しましたが、相変わらずnullになります。そこで、2つのRoot.numChildrenのFor文の内、Root.getChildAt(id).nameを無効にしたところ、エラーは消えました。

以下のエラーについても、テスト用のステートメントをひとつずつ順に外して、どれが原因なのかをお確かめください。この[出力]から見ると、stepFormインスタンス分が表示されていないということですか?
引用:
この結果は以下の通りです。
[object MovieClip] mc3 4
[object MovieClip] mc2 2
[object MovieClip] mc1 1
[object MovieClip] mc0 0
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at AS_CalcMessenger_10b()

クラス定義は「抜粋」せず、全文をご掲載ください。前回お願いしたとおり、「テスト用の最小限の構成にした」のであれば、「長文」にはならないはずだからです。すでに、以下のようにお尋ねしていました。
引用:
Fumioは書きました:
どうしてもイベントリスナーを登録して試さなければ確かめられないことがあるのでしたら、その内容と理由をご説明ください。

とくに「理由」がないのでしたら、何度も申し上げたとおりそれらの処理は不要です。除いてしまえば、コンストラクタ内にはテスト用のステートメント数行しか残りません。他のメソッドも呼出す必要がありませんので、すべて削除してください。そうすれば、クラス定義すべてを掲げても、せいぜい十数行で収まるのではありませんか。
引用:
なおstepFormシンボルのクラス定義の内、(長文を避けるため)コンストラクタ以下の抜粋は次のようになっています。
public function StepFormStage_04b () {
	/* 削除!以下同様
	Root.mc0.buttonMode=true;
	Root.mc0.addEventListener (MouseEvent.CLICK, mc0_click);
	*/
	// ...[中略]...
	/* 削除!以下同様
	for (var id=0; id<Root.numChildren; id++) {
	// ...[中略]...
	trace ("Child側");
	trace (parent, this, this.name, parent.getChildIndex(this));
	trace (Root.mc0, Root.mc0.name, Root.getChildIndex(Root.mc0));
	trace (Root.mc1, Root.mc1.name, Root.getChildIndex(Root.mc1));
}
/* 削除!以下同様
function mc0_click (mouseEvt:MouseEvent) {


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

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

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