サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

アタッチしたMovieClip内のUIコンポーネントにtextが設定できない

ID: FN0312002 Product: Flash

Platform: All
Version: MX 2004

1. 現象
Flash MX 2004でLabelやTextArea、TextInputなどのUIコンポーネントが内包(ネスト)されたMovieClipを、'MovieClip.attachMovie()'メソッドで配置した場合、UIコンポーネントの'text'プロパティにテキストを設定することができません。

たとえば、以下のサンプルスクリプトでは、Labelインスタンスの'text'プロパティにテキストが設定されません。スクリプトは、メインのタイムライン('_root')のフレームアクションに設定します。ムービークリップシンボル内にはLabelインスタンスmyLabelを配置し、シンボルのリンケージ[識別子]として"mySymbol"を設定しておきます。myLabelのコンポーネントインスタンスパラメータ[text]には、デフォルトのまま"Label"と入力してあるものとします(図001)。

// _root: メインのタイムライン
// フレームアクション
_mc = this.attachMovie("mySymbol", "my_mc", 1);
trace(_mc.myLabel.text);  // 出力: undefined
_mc.myLabel.text = "test";

図001■ムービークリップシンボル内にネストしたLabelコンポーネントインスタンス

LabelインスタンスmyLabelのパラメータ[text]はデフォルトの"Label"のまま

テスト用に挿入した第2ステートメントの'trace'アクションで、結果として'undefined'が出力されていることにご注目ください。"Label"と設定してあるはずの'text'プロパティ自体が、参照できていないことがわかります。

なお、UIコンポーネントの代わりにTextFieldインスタンスを配置すれば、'TextField.text'プロパティは'MovieClip.attachMovie()'メソッドを呼出した直後でも設定可能です。また、UIコンポーネントを他のムービークリップシンボルにネストせず、直接'MovieClip.attachMovie()'メソッドで配置した場合にも、問題なく'text'プロパティに値を設定することができます。

2. 原因
'MovieClip.attachMovie()'メソッドを実行した直後に、ネストしたUIコンポーネントの'text'プロパティを設定しようとすると、発生する現象です。配置直後からタイミングを遅らせて、ボタンなどから処理を行えば、'text'プロパティは正しく設定することができます。

結論として、UIコンポーネントをネストしたムービークリップシンボルを'MovieClip.attachMovie()'メソッドで配置した直後では、コンポーネントインスタンスの'text'プロパティを設定するにはタイミングが早すぎるということになります。その理由は、UIコンポーネントの'text'が純粋な「プロパティ」ではなく、実質が「メソッド」であることによります[*1]。メソッドは、コンポーネントに定義された関数('function')です。したがって、「MovieClip.attachMovieで配置したMovieClipのfunctionが実行されない」のと、同様の状況[*2]が発生することになります。

*1 LabelやTextInput、TextAreaクラスでは、'text'プロパティは「黙示的なget/setメソッド」により定義されています。たとえば、Labelクラスを定義するLabel.asファイルの内容を見ると、行109〜116には以下のようにget/setメソッドが定義されています。

function get text():String
{
  return getText();
}
function set text(t:String):Void
{
  setText(t);
}

*2 UIコンポーネントのインスタンスを直接'MovieClip.attachMovie()'メソッドで配置した場合には、直後に'text'プロパティを設定することができます。これは、コンポーネントのクラス定義が基本的にシンボルの書出し時に行われているので、インスタンスの配置(生成)と同時にメソッドが利用可能になるためです。

しかし、他のムービークリップシンボルにネストした場合には、MovieClipの配置(生成)後に内包したコンポーネントインスタンスが初期化(生成)されるので、MovieClip内の準備時間が必要になるものと考えられます。

3. 対処法
'text'プロパティの設定は、'MovieClip.attachMovie()'メソッドを呼出した直後でなく、1フレーム待って行えばよいでしょう。'MovieClip.onEnterFrame'イベントハンドラメソッドを定義して、フレーム待ちを行うスクリプトサンプルは以下のとおりです。なお、このスクリプトの基本的な構成は、「MovieClip.attachMovieで配置したMovieClipのfunctionが実行されない」のサンプルと同じです[*3]。詳しくは、このノートをご参照ください。

// _root
// フレームアクション
_mc = this.attachMovie("mySymbol", "my_mc", 1);
this.onEnterFrame = function() {  // イベントハンドラメソッドを定義
  trace(_mc.myLabel.text);  // 出力: Label
  _mc.myLabel.text = "test";
  delete this.onEnterFrame;  // イベントハンドラメソッドの定義をクリア
};

*3 上記のサンプルスクリプトでは、'MovieClip.attachMovie()'メソッドの戻り値として、新たに作成されたMovieClipのパスを取得しています。Flash MX 2004の「ActionScript辞書」に、このメソッドが「新しく作成したインスタンスへの参照」を返すと明記されたためです。

Flash MXの「ActionScript辞書」は、戻り値を「なし」と記載していました。しかし、実際にはMXでも戻り値は存在し、Macromedia Flash Developer CenterではBranden Hall氏がFlash MXの記事としてこの戻り値に言及しています(「Macromedia Flash MX undercover 」)。

_____

作成者: 野中文雄
作成日: 2003年12月29日


Copyright © 2001-2003 Fumio Nonaka.  All rights reserved.