問題
      TLFTextField.setTextFormat()メソッドは、第2および第3引数のインデックスでテキストの一部を定めて、TLFTextFieldインスタンスにTextFormatオブジェクトの書式が適用できます。
TLFTextFieldオブジェクト.setTextFormat(TextFormatオブジェクト, 開始インデックス, 終了インデックス)
しかし、Flash Professional CS5.5でつぎのフレームアクションを試すと、TLFTextFieldインスタンス(_txt)の中の指定した初めの2文字だけでなく、すべてのテキストにTextFormatオブジェクト(new_fmt)の書式が適用されてしまいます(図001左図)。
  
    | 
import fl.text.TLFTextField;// var _txt:TextField = new TextField();var _txt:TLFTextField = new TLFTextField();
var new_fmt:TextFormat = new TextFormat("_sans", 24, 0xFF0000);_txt.text = "test";_txt.setTextFormat(new_fmt, 0, 2);   // 初めの2文字を指定addChild(_txt); | 
図001■TLFTextFieldではテキストの一部にTextFormatが設定できない
  
    |  TLFTextFieldオブジェクト
 |  TextFieldオブジェクト
 | 
TLFTextFieldでなくTextFieldのインスタンスであれば、指定した範囲のテキストに正しく書式が設定されます。前掲フレームアクションで第2行目のインスタンス生成を、コメントアウトされているステートメントと置換えると、初めの2文字にTextFormatオブジェクトの書式が適用されます(前掲図001右図)。
原因
前述のとおり、TextFieldインスタンスならば、TLFTextField.setTextFormat()メソッドで指定した範囲のテキストにTextFormatオブジェクトの書式が適用できます。また、Flash Professional CS5で前掲フレームアクションを試すと、TLFTextFieldインスタンスであっても、指定した初めの2文字だけ書式が変わります。したがって、Flash Professional CS5.5のバグと評価します。なお、[パブリッシュ設定]で[Player]のバージョンを[Flash Player 10 & 10.1]に変えても問題は解消しません。
対処法
この問題に対処するには、先に現行の書式をTLFTextFieldインスタンスのテキストの一部に割当てます。前掲フレームアクションの例であれば、つぎのように第5行目の前に、TLFTextField.getTextFormat()メソッドで参照したTextFormatオブジェクトを、TLFTextFieldインスタンスのテキストの一部に適用します(図002)。TLFTextField.setTextFormat()メソッドに渡す第2および第3引数はともに0にして、テキストをひと文字も含まなくても構いません。
  
    | 
import fl.text.TLFTextField;var _txt:TLFTextField = new TLFTextField();var new_fmt:TextFormat = new TextFormat("_sans", 24, 0xFF0000);_txt.text = "test";// 先に現行の書式をテキストの一部に設定
 _txt.setTextFormat(_txt.getTextFormat(), 0, 0);
_txt.setTextFormat(new_fmt, 0, 2);addChild(_txt); | 
図002■現行書式を先にテキストの一部に割当てておくと正しく設定される

作成者: 野中文雄
      作成日: 2011年3月11日