Обходной путь для ошибки TextField в FP 10.3.183.5 и 10.3.183.7

У меня есть клиент, у которого большие проблемы с приложением AS2, которое мы разработали несколько лет назад.

Насколько я могу судить, это вызвано признанной ошибкой в ​​последних версиях Flash Player (см. http://forums.adobe.com/message/3859034 и https://bugbase.adobe.com/index.cfm?event=bug&id=2941694).

Это затрагивает две версии FP (10.3.183.5 и 10.3.183.7), и ошибка была исправлена ​​в 10.3.183.10.

Очевидно, что обновление Flash Player решит проблему, но мы все знаем, что пользователи не всегда делают это, и она получала электронные письма о проблеме.

Я собираюсь обновить ее код SWFObject для явного обнаружения для 10.3.183.10 и заставить ExpressInstall "поощрять" пользователей к обновлению, но я не знаю, произойдет ли это.

Я попробовал несколько из обходных путей, которые обнаружили поиски, но ни один не работает в моем случае.

Мне было интересно, если кто-нибудь нашел надежный способ исправить это?

3 ответа

Решение

Первым делом я бы попытался использовать textField.htmlText вместо textField.text и посмотреть, не решит ли это проблему (хотя я был бы удивлен, если бы это произошло).

Второй потенциальный способ исправить это (и это на самом деле не очень красиво) - это ручная переноска слов. Следующее в AS3, потому что это то, что я использую. Я оставлю это вам, чтобы преобразовать его в AS2, но я предполагаю, что это должно быть возможно и в AS2.

var text : String = "some text here";
var textField : TextField = new TextField();
textField.wordwrap  = false;
textField.multiline = false;
textField.autosize  = false;
textField.width     = MAX_TEXT_WIDTH;
//other formatting stuff

var words : Array  = text.split(" ");
var line  : String = words[0];
textField.text     = words[0];

var lines : Array = new Array();//will contain all lines
for(var i : int = 1; i < words.length; ++i)//start at second word
{
    textField.text += " " + words[i];//try adding another word to the line
    if(textField.textWidth > MAX_TEXT_WIDTH)//overflowed line
    {
        lines.push(line);
        line = words[i];
        textField.text = line;
    }
    else//doesn't overflow, line is still valid
    {
        lines += textField.text;
    }
}
lines.push(line);

var text : String = lines[0];
for(i = 1; i < lines.length; ++i)
{
    text += "\n" + lines[i];
}

textField.multiline = true;
textField.height = lines.length * HEIGHT_PER_LINE;//HEIGHT_PER_LINE can be found using getLineMetrics and 
                                                  //adding gutter pixels to the height - might have to 
                                                  //play a little with this
textField.text = text;

Не уверен, что это компилируется (это, вероятно, в любом случае не совместимо с AS2), но это должно дать общее представление. Сделайте перенос слов самостоятельно и посмотрите, работает ли это. Также убедитесь, что форматирование применяется к тексту при проверке textWidth. Я думаю, вам нужно вызывать setTextFormat (myTextFormat) каждый раз, когда вы меняете значение textField.text.

Я также видел, что, очевидно, многострочный может не работать в этой версии. В этом случае вам, возможно, придется создать новый объект TextField для каждой строки и сместить их значения y, чтобы он выглядел так, как будто это тот же TextField (надеюсь, вы не используете границы или фоны в своих textFields, если это так).)

Теперь, когда проблема устранена, вряд ли кто-нибудь потрудится найти обходной путь. Вероятно, предложенный вами метод SWFObject - это путь. Просто проверьте, находятся ли версии в пределах 10.3.183.5 и 10.3.183.7, и, если это так, отобразите ExpressInstall.

Окончательная версия AS, я думаю, работает лучше всего

the_textfield.autoSize = false;
the_textfield.multiline = false;
the_textfield.wordWrap = false;

var words : Array  = the_textfield.text.split(" ");
var line  : String = words[0];
the_textfield.text  = words[0];

var lines : Array = new Array();

for (var i : Number = 1; i < words.length; ++i) {
    the_textfield.text += " " + words[i];

    if (the_textfield.textWidth > SOME_WIDTH) {
        lines.push(line);
        line = words[i];
        the_textfield.text = line;
    } else {
        line += " " + words[i];
    }
}
lines.push(line);

var t : String = lines[0];
for (i = 1; i < lines.length; ++i) {
    t += "\n" + lines[i];
}

the_textfield.text = t;

the_textfield.autoSize = true;
the_textfield.multiline = true;
the_textfield.wordWrap = false;

В моем случае я должен был SOME_WIDTH, но текстовое поле было создано, и происходят некоторые странные изменения масштаба, поэтому я просто вычислил число эмпирически.

Другие вопросы по тегам