2

ユーザーが変更したときに、入力 TLF テキスト フィールドのテキストを変更する必要があります。たとえば、ユーザーが文字を追加または削除するたびに大文字にしようとしています:

import fl.text.TLFTextField;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.elements.TextFlow;

var myTLFTextField:TLFTextField = new TLFTextField();
addChild(myTLFTextField); 
myTLFTextField.x = 10;
myTLFTextField.y = 10;
myTLFTextField.width = 200
myTLFTextField.height = 100;
myTLFTextField.text = "This is my text";

var myFormat:TextLayoutFormat = new TextLayoutFormat();
myFormat.textIndent = 8;
myFormat.color = 0x336633;
myFormat.fontFamily = "Arial, Helvetica, _sans";
myFormat.fontSize = 24;

var myTextFlow:TextFlow = myTLFTextField.textFlow;
myTextFlow.hostFormat = myFormat;
myTextFlow.flowComposer.updateAllControllers();

//--

myTLFTextField.addEventListener(Event.CHANGE, this.onTextFieldChange);
function onTextFieldChange(event:Event):void
{
    myTLFTextField.text = myTLFTextField.text.toUpperCase();
}

前のコードは、ページの最初の例であるTLFTextField のドキュメント//--から取得したものです。

テキストを編集しようとすると大文字になりますが、その後テキスト フィールドが入力に応答しなくなり、出力に次のように表示されます。

TypeError: エラー #1009: null オブジェクト参照のプロパティまたはメソッドにアクセスできません。flashx.textLayout.container::TextContainerManager/getController() で flashx.textLayout.container::TextContainerManager/mouseDownHandler() で

行をコメントアウトするとaddEventListener、すべて正常に動作しているように見えます。

従来のテキスト フィールドで可能なように、ユーザー入力イベントで TLF テキスト フィールドのテキストを変更することはできないということですか?

4

3 に答える 3

0

なんで?TLFには問題があるからです。他の人が指摘したように、Event.CHANGE ハンドラー内で TLF テキストを変更すると、変更ハンドラーが 2 回呼び出されます。その時点で、物事は崩壊します。

@Abe が投稿したものに似た解決策を思いつきましたが、より一般的です。大文字のチェックに依存していません。TextEvent.TEXT_INPUT をリッスンしてから、テキスト入力ハンドラー内で Event.CHANGE リスナーを切り替えます。

import fl.text.TLFTextField;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.elements.TextFlow;
import flash.text.TextFieldType;
import flash.events.TextEvent;

var myTLFTextField:TLFTextField = new TLFTextField();
addChild(myTLFTextField); 
myTLFTextField.x = 10;
myTLFTextField.y = 10;
myTLFTextField.width = 500
myTLFTextField.height = 100;
myTLFTextField.text = "This is my text";
myTLFTextField.border = true;
myTLFTextField.multiline = true;
myTLFTextField.type = TextFieldType.INPUT;

var myFormat:TextLayoutFormat = new TextLayoutFormat();
myFormat.textIndent = 8;
myFormat.color = 0x336633;
myFormat.fontFamily = "Arial, Helvetica, _sans";
myFormat.fontSize = 24;

var myTextFlow:TextFlow = myTLFTextField.textFlow;
myTextFlow.hostFormat = myFormat;
myTextFlow.flowComposer.updateAllControllers();

myTLFTextField.addEventListener(TextEvent.TEXT_INPUT, onTextInput);

var selectionIndex:uint;
function onTextInput(e:TextEvent):void
{
    trace("onTextInput");
    selectionIndex = myTLFTextField.selectionEndIndex;
    myTLFTextField.addEventListener(Event.CHANGE, onTextChanged);
}

function onTextChanged(e:Event):void
{
    trace("onTextChanged");
    myTLFTextField.removeEventListener(Event.CHANGE, onTextChanged);

    // Do whatever you need to do here:
    myTLFTextField.text = myTLFTextField.text.toUpperCase();
    myTLFTextField.setSelection(selectionIndex + 1, selectionIndex + 1);
}
于 2013-04-25T03:11:31.290 に答える
0

今はコードを試すことができないので、これは大雑把な推測ですが、テキストを設定するとコントローラーが消えるようです。単純にこれを行うとどうなりますか:

private var m_dontupdate:Boolean;
function onTextFieldChange(event:Event):void
{
  if(m_dontupdate) return;
  m_dontupdate = true;
  myTLFTextField.text = myTLFTextField.text.toUpperCase();
  myTLFTextField.textFlow.flowComposer.updateAllControllers();
  m_dontupdate = false;
}

? (私は FB 4.7 を使用しており、TLFTextField がどこにも見つからないため、試すことができません)。

于 2013-04-22T12:30:10.300 に答える