サイトトップ

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

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

静止テキストがStaticTextインスタンスとして認識されない

ID: FN0709001 Product: Flash Platform: All Version: CS3/ActionScript 3.0

問題
静止テキストのインスタンスを取得しているにもかかわらず、StaticTextクラスのインスタンスとして認識されないことがあります。

たとえば、オンラインヘルプの[ActionScript 3.0のプログラミング] > [テキストの操作] > [静止テキストの操作]は、オーサリング時にタイムラインに配置された「静止テキストフィールドへの参照を作成するには、表示リスト内のアイテムに対して反復処理を行い、変数を割り当て」るよう説きます(スクリプト001)。

スクリプト001■タイムラインに配置された静止テキストの参照を取得する

for (var i = 0; i < this.numChildren; i++) {
  var displayitem:DisplayObject = this.getChildAt(i);
  // if (displayitem instanceof StaticText) {
  if (displayitem is StaticText) { // [*1]
    trace("a static text field is item " + i + " on the display list");
    var myFieldLabel:StaticText = StaticText(displayitem);
    trace("and contains the text: " + myFieldLabel.text);
  }
}

しかし、静止テキストがタイムラインに配置されている唯一のオブジェクトであっても、StaticTextインスタンスと認識されず、上記スクリプト001で何も[出力]されないことがあります。

[*1] ヘルプの例では、StaticTextインスタンスかどうかの判定に、instanceof演算子を用いています。しかし、ActionScript 3.0では、is演算子を使うことが推奨されます。


原因
静止テキストにデバイスフォントを使用すると、TextFieldインスタンスとして認識されるようです(図001)。

図001■静止テキストにデバイスフォントを設定するとTextFieldインスタンスと認識される
図001

TextFieldクラスは、InteractiveObjectを経由してDisplayObjectクラスを継承します。StaticTextクラスは直接DisplayObjectクラスを継承しますので、どらも互いに継承関係にはありません。したがって、TextFieldクラスのインスタンスとされれば、StaticTextクラスのプロパティやメソッドには一切アクセスできなくなります。

他方で、デバテスフォントの設定された静止テキストは、TextFieldインスタンスとしての振舞いを見せます。たとえば、StaticTextクラスであれば読取り専用のtextプロパティに、TextFieldの同名プロパティと同様に文字列の設定が可能になります。しかし、TextFieldインスタンスと認識される結果を仕様と考える理由は見出しがたく、サポートされる動作ではないでしょう。


対処法
静止テキストには、デバイスフォント以外のフォントを設定すべきでしょう。静止テキストを選択しながら、デバイスフォントを使う理由は、あまり考えられません。

もし、何らかの理由でデバイスフォントを使わなければならない場合には、選択不可に設定したダイナミックテキストで代用が可能だと思われます。


作成者: 野中文雄
作成日: 2007年9月22日


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