サイトトップ

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

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

ScrollBarコンポーネントのスクロールバーがアクティブにならない

ID: FN0303006 Product: Flash

Platform: All
Version: MX

1. 現象
ScrollBarを設定したダイナミックテキストまたはテキスト入力フィールドで、テキストが表示しきれていないにもかかわらず、スクロールバーがアクティブにならないことがあります。スクロールボックスは表示されず、スクロールアロー(矢印ボタン)も使用できません(テキストすべてが表示しきれているときの状態になります)。

2. 原因
テキストフィールド(TextField)に変数名を設定し、スクリプトでダイナミックにテキストを設定した場合に発生します。分量の多いテキストをTextFieldに設定した変数にスクリプトで代入した場合のほか、'MovieClip.loadVariables'メソッドを使って外部テキストファイルから変数に読込んだときに発生します。

たとえば、以下のスクリプトが典型的な例です。外部テキストファイルText.txt(ムービーと同階層に配置)には変数名myTextにテキストが設定してあり、メインのタイムラインには同名の変数を設定したTextFieldが配置されているものとします。

// [問題が発生するスクリプトの例]
// メインのタイムライン
// フレームアクション
// メインのタイムラインには変数名myTextを設定したダイナミックテキストを配置
this.loadVariables("Test.txt");

//テキストファイルText.txtの内容
myText=ここに量の多いテキストが入ります。

ScrollBarコンポーネントは、TextFieldオブジェクトを前提としてスクロールバーのコントロールを行っています。TextFieldのプロパティを使わずに変数に対して直接テキストを設定すると、ScrollBarコンポーネントがテキストの内容変更を認識することができません。そのため、最初TextFieldが空であれば、スクロールバーはアクティブになりません。この動作は、ScrollBarコンポーネントの仕様です。

3. 対処法
TextFieldにインスタンス名をつけ、'TextField.text'プロパティを使ってテキストを設定してください。TextFieldにはインスタンス名に加えて変数名も使用できますが、スクリプトに混乱を生じるおそれがありますので、変数名は削除することをお勧めします。

外部テキストファイルからテキストを読込んで設定している場合には、スクリプトの修正が必要になります。変数名を設定したTextFieldには、外部テキストをロードすると、同じ変数名の値(テキスト)は自動的に読込まれます。これに対して、'TextField.text'プロパティには、スクリプトで明示的にテキストを設定しなければなりません。そのためには、外部テキストファイルの読込みを待つ処理が必要になります。

'MovieClip.loadVariables'メソッドを使って、外部テキストファイルの読込み待ちを行うスクリプトについては、Macromediaテクニカルノート「外部テキストファイルを読込む 」をご参照ください。以下には、LoadVarsオブジェクトを使用したサンプルスクリプトを掲げます(なお、スクリプトの処理内容について、詳しくは「LoadVarsオブジェクトを使った外部テキストファイルの読込み」を併せてご参照ください)。

// [外部テキストの読込みを待ってTextFieldにテキストを設定するスクリプトの例]
// メインのタイムライン
// フレームアクション
// メインのタイムラインにはインスタンス名my_txtを設定したTextFieldを配置
myLoadVars = new LoadVars();
myLoadVars.onLoad = function(bSuccess) {   //[1]LoadVars.onLoadメソッドを定義
  if (bSuccess) {   //[2]ロードが問題なく完了したかを確認
    _root.my_txt.text = this.myText;   //[3]TextFieldのtextプロパティに変数myTextの値を設定
  }
};
myLoadVars.load("Test.txt");   //[4]外部テキストファイルの読込み実行

[注記] FScrollBarClass内の処理(中・上級者向け情報)
ScrollBarコンポーネントのメソッドは、FScrollBarClassに定義されています。ScrollBarコンポーネントのインスタンスがステージに現れて初期化されると、setScrollTargetメソッドが呼出されます。このsetScrollTargetメソッドの中に、以下のステートメントがあります。

this.textField.watch("text", this.callback);

'Object.watch'メソッドは、指定したプロパティが変更されたときに呼出すコールバック関数を設定します。上記のステートメントは、ScrollBarインスタンスを設定したTextFieldの'text'プロパティを変更すると、メソッドcallbackを呼出すように指定しています。callbackメソッドは、その'function'中でonTextChangedメソッドを実行する処理を行います。

したがって、ScrollBarインスタンスを設定したTextFieldの'text'プロパティを変更すると、onTextChangedメソッドが呼出されて、スクロールバーのアップデートなどテキスト変更に伴う処理が行われることになるのです。

_____

作成者: 野中文雄
作成日: 2003年3月17日
更新日: 2003年3月18日 注記「FScrollBarClass内の処理(中・上級者向け情報)」を追加


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