サイトトップ

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

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

TextField.appendText()で\rの含まれたテキストが正しく追加できない

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

問題
ActionScript 3.0のTextField.appendText()メソッドは、TextField.textプロパティに設定されたテキストに、引数の文字列を追加します。処理結果は加算後代入演算子+=と同じものの、このメソッドを使った方が処理効率は高くなります。

しかし、TextField.appendText()メソッドに復帰文字"\r"[*1]の含まれた文字列を引数にして、TextField.textプロパティを設定した場合、引数の最後の文字が正しく設定されません。

たとえば、空のTextFieldインスタンスmy_txtに、TextField.appendText()メソッドで、つぎのように文字列を追加したとします[*2]

my_txt.appendText("0\r19");
my_txt.appendText("2\r38");
my_txt.appendText("45\r67");

するとつぎのように、TextField.appendText()メソッドに指定した引数の最後の文字が、TextFieldインスタンスのテキスト(TextField.textプロパティ)の最後に追加されてしまうようです(図001)。

0
12
345
6789

図001■TextField.appendText()の引数の最後の文字がTextFieldのテキストの最後に追加される
図001

[*1] 復帰文字"\r"や改行文字"\n"など、テキストとして表示されない特殊な文字については、[ヘルプ]の「エスケープ文字について」をご参照ください。

なおMacintoshでは、エスケープ文字は、円記号とは区別されるバックスラッシュを用いる必要があります(Windowsでは、両者のコードは同じです。「Flash 8/Mac OS Xで円記号がエスケープ文字として認識されない」をご参照ください)。

[*2] テスト用のスクリプトは以下のとおりです(スクリプト001)。空の新規Flashムービーのメインタイムラインに、第1フレームアクションとして記述します(前掲図001)。

スクリプト001■TextFieldインスタンスを作成してTextField.appendText()で\rの含まれた文字列を追加する

// フレームアクション: ActionScript 3.0
var my_txt:TextField = new TextField();
addChild(my_txt);
my_txt.autoSize = TextFieldAutoSize.LEFT;
my_txt.appendText("0\r19");
my_txt.appendText("2\r38");
my_txt.appendText("45\r67");


原因
TextField.appendText()メソッドで続けざまに文字列を加えた場合[*3]、すでに追加されたテキストに復帰文字"\r"があると、対象のテキストの最後の文字をその数だけ手前に見誤ってしまうようです[*4]

[*3] TextField.appendText()メソッドを連続して用いたときの問題です。すでにTextField.textプロパティに設定されているテキストに復帰文字"\r"があっても問題とはなりません。

理由のある動作とは考えられませんので、TextField.appendText()メソッドのバグだと思われます。

[*4] たとえば、つぎのステートメントを例に考えてみます。

my_txt.appendText("0\r1\r2\r9\r0");
my_txt.appendText("3\r8");
my_txt.appendText("456\r7");

最初のステートメントのTextField.appendText()メソッドで加えた文字列には、4つの復帰文字"\r"があります。したがって、つぎのステートメントのTextField.appendText()メソッドは、引数を前のステートメントの文字列の最後から(復帰文字を含めて)4文字目の復帰文字とその左の"2"との間に挿入します。

第2ステートメントでは、復帰文字がもうひとつ追加されて、都合5つになりました。ですから、第2ステートメントのTextField.appendText()メソッドで追加した最後の文字列"8"とその手前の復帰文字との間に、第3ステートメントの文字列が加わります。結果は、つぎのとおりです。

0
1
23
456
78
9
0

対処法
対処法としては、TextField.appendText()メソッドを連続して使わないことと、復帰文字"\r"以外を使う方法が考えられます。

[1] 文字列の連続した追加は変数に対して行う
第1は、String型の変数を宣言して、文字列の連続した追加は、その変数に行うことです。最後にひとつにまとまった変数の文字列を、TextField.appendText()メソッドでTextFieldインスタンスのテキストに加えます。

var _str:String = "";
_str += "0\r19";
_str += "2\r38";
_str += "45\r67";
my_txt.appendText(_str);

もっとも、この方法を採るのであれば、TextField.appendText()メソッドを使わないことも可能です。

var _str:String = my_txt.text;
_str += "0\r19";
_str += "2\r38";
_str += "45\r67";
my_txt.text = _str;

[2] 改行文字"\n"を使う
TextFieldインスタンス内のテキストの改行に、改行文字"\n"を用いる[*5]と、問題は発生しないようです。

my_txt.appendText("0\n19");
my_txt.appendText("2\n38");
my_txt.appendText("45\n67");

[*5] TextField.textプロパティに改行文字"\n"を設定しても、復帰文字"\r"に変換されます。

my_txt.text = "\n";
trace(my_txt.text.charCodeAt(0));   // 出力: 13
trace("\r".charCodeAt(0));   // 出力: 13

作成者: 野中文雄
作成日: 2007年12月21日


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