С такими большими текстами это невозможно (вы упомянули, что текст размером около 7 МБ).
Если вы посмотрите на источник mx: TextArea, он вставляет текст, просто устанавливая его текстовое свойство TextField для введенной вами строки:
Из TextArea.as вокруг строки 2050:
if (textChanged || htmlTextChanged)
{
// If the 'text' and 'htmlText' properties have both changed,
// the last one set wins.
if (isHTML)
textField.htmlText = explicitHTMLText;
else
textField.text = _text;
textFieldChanged(false, true)
textChanged = false;
htmlTextChanged = false;
}
Если вы создадите пример приложения с TextField и попытаетесь установить его текстовое свойство с большой строкой, вы получите тайм-ауты сценария. (Я получил таймаут, когда я попробовал его с длиной строки 1 МБ):
import flash.text.TextField;
tf = new TextField();
addChild(tf);
tf.multiline = true;
tf.wordWrap = true;
tf.width= 600
tf.height = 500
var str:String = "";
for (var i:int=0; i<100000; i++) {
str = str+"0123456789"
}
tf.text = str
Это самый простой способ отображения текста и времени ожидания. Flex постарается сделать с этим текстовым полем еще дюжину вещей, прежде чем выложить его ... поэтому он также сдается в текстах гораздо меньшего размера.
Единственное возможное решение - создать собственное текстовое поле и постепенно добавлять текст - Adobe рекомендует использовать TextField.appendText ():
import flash.text.TextField;
public function test(){
tf = new TextField();
addChild(tf);
tf.multiline = true;
tf.wordWrap = true;
tf.width= 600
tf.height = 500
addEventListener(Event.ENTER_FRAME,onEF);
}
private var cnt:int = 0;
private function onEF(event:Event):void{
if (cnt>200) return;
trace (cnt);
var str:String = "";
//pasting around 50K at once seems ideal.
for (var i:int=0; i<5000; i++) {
str = str+"0123456789"
}
tf.appendText(str);
cnt++;
}
Этот скрипт может добавить 10 МБ текста в TextField ... хотя после добавления 1 МБ он становится все медленнее (в конце итерации в конце потребовалось около 1 секунды). И если вы попытаетесь сделать что-нибудь с этим текстовым полем (например, изменение размера, изменение текста без appendText (), добавление его на сцену после его завершения ...), вы получите тайм-аут сценария.
Таким образом, полное решение состоит в том, чтобы захватить трюк обертки холста события вставки (решение Уильяма), а затем постепенно добавлять текст в пользовательский компонент, который использует appendText для добавления текста. (используйте flash.text.TextField и добавьте его на сцену с помощью mx_internal :: $ addChild ()). Я не проверял, можете ли вы удалить полученное чудовище с помощью removeChild, не вызывая таймаут сценария :).