2013-04-17 4 views
2

Мне нужен текст в текстовом поле ввода TLF, которое нужно изменить, когда пользователь его изменит. Как, например, я пытаюсь сделать это прописным каждый раз, когда пользователь добавляет или удаляет символ:Почему этот код TLFTextField работает только один раз?

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(); 
} 

код, который идет перед //-- берется из , самых первого примера на этой странице.

При попытке редактировать текст, он стал прописным, но после того, что текстовое поле перестает отвечать на любой вход и выход говорит

TypeError: Error #1009: Cannot access a property or method of a null object reference. at flashx.textLayout.container::TextContainerManager/getController() at flashx.textLayout.container::TextContainerManager/mouseDownHandler()

Когда я закомментируйте addEventListener линию, все, как представляется, работайте отлично.

Означает ли это, что невозможно внести изменения в текст в текстовом поле TLF при вводе пользовательского ввода, как это возможно с классическими текстовыми полями?

+1

Может быть бесконечным циклом. Попробуйте проверить, действительно ли случай должен быть изменен в вашем обратном вызове; 'if (myTLFTextField.text.toUpperCase()! = myTLFTextField.text)' – Dave

+0

@Dave Ну, мой вопрос не в прописном (есть встроенная функция, чтобы держать текст в верхнем регистре в любом случае), но больше о внесении изменений в текст на пользователе входные события. Если вы попытаетесь внести изменения каким-либо другим способом, например добавить букву «A» в конец текста вместо того, чтобы сделать ее прописной, вы столкнетесь с такой же проблемой. – Pleo

+0

хорошо, но моя точка все еще стоит; может быть, что, изменив текст, вы вызываете обратный вызов, который меняет текст, который (...). Я не уверен, что это проблема, но вы можете проверить, нарушив этот цикл. Если окажется, что это проблема, вы можете попытаться изменить событие, которое вы слушаете, или использовать маркер переменной (например, если он уже включен в обратном вызове). – Dave

ответ

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 нигде не найдено).

+0

Если я прав, вам, возможно, придется ссылаться на myFormat и переустанавливать формат в 'onTextFieldChange' – Boris

+0

В отличие от оригинала, этот, по-видимому, вызывает бесконечный цикл с водопадом ошибок. Итак, это не сработало. – Pleo

+0

как с этим редактированием? – Boris

-1

Сначала вы делаете бесконечный цикл в прослушивании событий! Ваш код в обработчике событий вызывает его сам! TLF.text = VALUE производит событие, например TLF.dispatch (новое событие (событие.CHANGE));

So добавить прослушиватель событий к действиям пользователя без изменения текста!. для Key_Up

Второе - правильное форматирование кода, так что будет применяться к новому тексту:

myTLFTextField.text = NEW_VALUE; 

myTextFlow = myTLFTextField.textFlow; 
myTextFlow.hostFormat = myFormat; 

Edit: Для большей ясности я добавить полный код:

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

var myTLFTextField:TLFTextField = new TLFTextField(); 
addChild(myTLFTextField); 
myTLFTextField.x = 10; 
myTLFTextField.y = 10; 
myTLFTextField.width = 400; 
myTLFTextField.height = 100; 
myTLFTextField.text = "This is my text"; 
myTLFTextField.type = "input"; 
//allow user to wirte in filed 

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, wrongHandler); 
myTLFTextField.addEventListener(KeyboardEvent.KEY_UP, goodHandler); 
myTLFTextField.text = 'TEXT'; 
//this invoke CHANGE and trace '-' in console 

setTimeout(function(){ myTLFTextField.text = 'text';}, 500); 
//this invoke CHANGE and trace '-' in console 

function wrongHandler(event:Event):void 
{ 
    //myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    //myTextFlow = myTLFTextField.textFlow; 
    //myTextFlow.hostFormat = myFormat; 
    // above code will run infinity loop of changing text! test it by uncomment and comment KEY_UP listener! 
    trace('-'); // to see in console when and how many event was triggered 
} 

function goodHandler(event:Event):void 
{ 
    myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    myTextFlow = myTLFTextField.textFlow; // reasign formating 
    myTextFlow.hostFormat = myFormat; 
    var i:uint = myTLFTextField.text.length; 
    myTLFTextField.setSelection(i,i); // move carret to last sign 
    trace('+'); // to see in console when and how many event was triggered 
} 

Выход:

  1. -
  2. -

Выход после написания 'в' символ в поле:

  1. -
  2. -
  3. -
  4. -
  5. +
  6. -

Результат на этап: TEXTA

+0

Это не вызывает никаких бесконечных циклов. Это можно легко подтвердить, пытаясь изменить свойство «text» текстового поля сразу после добавления слушателя для события Event.CHANGE, функция 'onTextFieldChange' не вызывается, она вызывается только при вводе пользователя. – Pleo

+0

Вы ошибаетесь, на мой взгляд. См. Изменения в моем ответе. Код протестирован, поэтому не говорите, что это не сработает. – Konrad

+0

@Pleo Если вы не согласны с протестированным кодом, подтверждающим ваше право. – Konrad

0

Почему? Потому что у TLF есть проблемы. Как указывали другие, изменение текста TLF внутри обработчика Event.CHANGE приводит к тому, что обработчик изменений будет вызван во второй раз. В этот момент все ломается.

Я придумал решение, похожее на одно сообщение @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); 
} 
+0

Спасибо, но с этим кодом мигающая каретка исчезает все время и когда символ удаляется, изменение игнорируется. – Pleo

Смежные вопросы