Macromedia Flash非公式テクニカルノート rootプロパティでメインタイムラインの関数にアクセスできない
問題
図001■メインタイムラインの関数が呼出される ステージに表示されているタイムラインからは、メインタイムラインはDisplayObject.rootプロパティで参照することができます。もちろん、メインタイムラインからDisplayObject.rootプロパティにより、自身を参照することも可能です。そこで、上記スクリプト001に修正を加えて、メインタイムラインに定義している関数を、DisplayObject.rootを参照したうえで、呼出してみましょう。 スクリプト002■メインタイムラインの関数をroot参照つきで呼出す
[ムービープレビュー]を行うと、デフォルトではつぎのようなエラーが表示されます(図001)[*1]。 1061: 未定義である可能性のあるメソッドxTestを、静的型flash.display:DisplayObjectの参照を使用して呼び出しました。 図002■root参照つきでメインタイムラインの関数を呼出すとコンパイルエラー
原因 「定義されていないメソッド」というのは、アクセスしているインスタンスにメソッド・関数が定義されていない。つまり[ActionScript 3.0コンポーネントリファレンスガイド]でそのクラスを調べてもそのメソッド・関数が掲載されていないということです。 ActionScript 3.0のデフォルトでは、このようにクラスに定義されていないプロパティやメソッドにアクセスすると、コンパイルエラーで警告してくれます。しかし、MovieClipインスタンスの場合、ユーザーはフレームアクションで自由に変数(プロパティ)や関数(メソッド)を定義することが可能です[*2]。 このようにユーザーがプロパティやメソッドを追加できるクラスは、ダイナミック(dynamic)なクラスと呼ばれます。MovieClipクラスはダイナミックなクラスで、[ActionScript 3.0コンポーネントリファレンスガイド]の[MovieClipクラス]を見ると、dynamicというキーワードが記載されています(図003)[*3]。 図003■MovieClipはダイナミック(dynamic)なクラス それでは、ダイナミックなクラスのインスタンスであるメインタイムラインに定義した関数が、なぜコンパイルエラーになるのでしょう? それは、rootがDisplayObjectクラスのプロパティだからです。[ActionScript 3.0コンポーネントリファレンスガイド]で[DisplayObjectクラス]を確認すると、下記のようにdynamicキーワードがありません。そのため、DisplayObjectクラスに定義されていないプロパティ(変数)やメソッド(関数)にアクセスしようとすると、コンパイルエラーが生じるのです。 クラス public class DisplayObject
対処法 [1] [strictモード]の解除 これらのエラーの一部は、strictモードでコードをコンパイルする場合にのみ検出されます。 したがって、[strictモード]を解除すれば、このコンパイルエラーは表示されません。そして、DisplayObject.rootプロパティの参照するメインタイムラインに、アクセス対象の関数が正しく定義されているかぎり、スクリプトは問題なく動作します。ただし、[strictモード]を解除した場合は、関数が定義されていなくてもエラーは発生しなくなります[*4]。 [strictモード]を解除するには、[ファイル]メニューの[パブリッシュ設定]で[Flash]タブを選択し、ActionScript 3.0の[設定]ボタンをクリックして、[ActionScript 3.0設定]ダイアログボックスを開きます(図004)。[strictモード]のチェックを外せば、このオプションが解除されます[*5]。 図004■[ActionScript 3.0設定]ダイアログボックスで[strictモード]を解除 [2] キャスト データ型を明示的に変換することは、一般に「キャスト」と呼ばれます。式の値を、あるクラスのデータ型にキャストするには、つぎのようなステートメントを記述します。 クラス(式); それでは、前のスクリプト002を書替えて、rootプロパティをMovieClipでキャストしてみます(スクリプト003)。すると、[strictモード]でもコンパイルエラーは発生せず、メインタイムラインに定義した関数が正しく呼出されます(図005)。 スクリプト003■root参照をMovieClipでキャストしてメインタイムラインの関数を呼出す
図005■MovieClipでキャストすると[strictモード]でも動作する
作成者: 野中文雄 Copyright © 2001-2007 Fumio Nonaka. All rights reserved. |
|||||||||||