サイトトップ

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

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

TextField.textプロパティをwatchすると既定値が取得できない

ID: FN0310002 Product: Flash

Platform: All
Version: MX and MX 2004

1. 現象
'TextField.text'プロパティを'Object.watch'メソッドで監視したとき、コールバック関数がプロパティの既定値を取得できません。

2. 原因
'Object.watch'メソッドは、監視するプロパティ値が変更されたとき、指定したコールバック関数を呼出します。コールバック関数は、監視中のプロパティ名とプロパティの既定値、そして設定されようとしている新規の値の計3つの引数を受取ります。ところが、'TextField.text'プロパティを監視対象とすると、第2引数の既定値が未定義値'undefined'になってしまいます。

この現象は、以下のサンプルスクリプトで確認することができます。メインのタイムラインにTextFieldインスタンスmy_txtを配置して、スクリプトは'_root'のフレームアクションに設定します。'Object.watch'メソッドの使い方については、「Object.watch」をご参照ください。

// _root
// 第1フレームアクション
// TextFieldインスタンス: _root.my_txt
this.my_txt.watch("text", function (property_str, oldValue, newValue) {
  // 3つの引数値を出力(第2引数はデータ型を確認)
  // 出力: text,undefined,<乱数値>
  trace([property_str, typeof oldValue, newValue]);
  return newValue;
});
// ステージをクリックするたびに乱数値をTextFieldに設定(動作確認用)
this.onMouseDown = function() {
  this.my_txt.text = Math.random();
};

ステージをクリックすると、[出力]ウィンドウに表示される第2引数がつねに'undefined'になります。この現象は、Flash MX 2004 Trial(英語版)でも確認されています。

3. 対処法
監視用のプロパティは別に定義し、その値をTextFieldインスタンスの'text'プロパティに設定する方法が考えられます。

以下のサンプルスクリプトは、TextFieldの監視用プロパティとしてmyTextを定義しました。そして、'Object.watch'メソッドに指定するコールバック関数の中で、myTextの値をそのTextFieldインスタンスの'text'プロパティに設定します。この例では、第2引数の既定値を、'text'プロパティに設定するとともに関数の値として返しています。したがって、プロパティ値は変更されず、プロテクトされた状態になります(コールバック関数の戻り値については、前出「Object.watch」参照)。

// _root
// 第1フレームアクション
// TextFieldインスタンス: _root.my_txt
this.my_txt.myText = this.my_txt.text="Test";   // プロパティの初期値設定
this.my_txt.watch("myText", function (property_str, oldValue, newValue) {
  // 3つの引数値を出力(確認用)
  trace([property_str, oldValue, newValue]);
   this.text = oldValue;   // 'text'プロパティに既定値設定
   return oldValue;   // 既定値を返す
});
// 別途定義したプロパティに乱数値を設定(動作確認用)
this.onMouseDown = function() {
  this.my_txt.myText = Math.random();
};

_____

作成者: 野中文雄
作成日: 2003年10月5日


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