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.
|