Динамическая замена выделенного текста. Метод replaceSel()

Довольно распространенной задачей, возникающей при разработке интерфейсов, является реализация механизма, который позволял бы динамически заменять выделенный участок текста другим. Наиболее типичный пример использования такого механизма — создание инструмента поиска с заменой. Подобный инструмент позволяет, в частности, автоматически переписывать письма расылки, заменяя условное имя именем конкретного получателя. Также он может быть полезен, если пользователю предстоит заполнить большую анкету, часть полей в которой предопределено. Кстати, инструмент поиска с заменой имеется и у панели Actions. Он позволяет быстро и аккуратно заменить в коде один идентификатор на другой.

Ранее, чтобы заменить выделенный участок текста, приходилось определять его границы, удалять из строки поля соответствующий фрагмент и помешать на его место необходимый текст. Начиная со Flash MX, справиться с этой задачей можно буквально при помощи одной строчки кода благодаря появлению метода replaceSel() класса TextField. Данный метод заменяет выделенный в поле текст на строку, переданную ему в качестве параметра.

Текст, введенный на место выделенного фрагмента при помощи метода replaceSel(), отображается в стиле, который используется полем по умолчанию, Поэтому, если стиль текста поля был задан программно при помощи метода setTextFormat() или же в нем была применена HTML-разметка, то вид нового фрагмента может серьезно отличаться от основного стиля.


Обойти эту сложность можно, соответствующим образом изменив принятый в поле по умолчанию стиль с использованием метода setNewTextFormat(). Решить ее, настроив стиль фрагмента при помощи тегов HTML, невозможно, так как метод replaceSel() не анализирует гипертекст,

Метод replaceSel() не может быть применен по отношению к полю, текст которого форматируется при помощи CS.

В качестве примера использования метода repaceSel() мы дополним созданный в предыдущем подразделе инструмент поиска в текстовом поле так, чтобы он мог осуществлять поиск с заменой.
Для этого:

• добавляем на рабочую область небольшое текстовое поле типа Input. В нем будет задаваться текст, замена выделенных фрагментов которым должна производиться. Называем его zam;

• создаем кнопку и называем ее zambut. По ее нажатию выделенный текст будет замещаться;

• на первый взгляд, чтобы решить поставленную задачу, достаточно добавить в код следующий обработчик:

zam_but.onPress = function():Void {
pole.replaceSel(zam.next);
};

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


Дело в том, что нажатие кнопки замены текста сопровождается переводом фокуса на нее. При этом выделение, естественно, пропадает. И когда вызывается метод replaceSel(), замещать уже нечего.

Необходимо как-то добиться того, чтобы нажатие кнопки не сопровождалось разрушением выделения. Увы, напрямую сделать это невозможно. Поэтому остается только одно: при нажатии кнопки zam_but искусственно восстанавливать пропавшее выделение. Сделать это, зная перед символом с каким индексом заканчивалась выделенная область (соответствующую информацию хранит переменная index) и сколько в нес входило символов (определить это позволяет переменная stroka), совсем несложно.

Важно предусмотреть, что нажать кнопку zam_but пользователь может и тогда, когда никакого выделения нет. Чтобы при этом не произошло замены текста, следует убедиться, что подлежащая замещению последовательность совпадает с текстом, хранимым переменной stroka.
В виде кода описанные выше шаги представляются так:

zam_but.onPress = function(): Void {
if (pole.text.substring(index-stroka.length, index).toLowerCase() ==
str.text.toLowerCase()) {
Selection,setFocus(pole);
Selection.setSelection(index-stroka.length, index);
pole.replaceSel(zam.text);
}
};

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Автоматическое удаление пробелов. Свойство condenseWhite
Встраивание в фильм целого шрифта
Динамическое задание выделения. Метод setSelection()
Задание и извлечение текста поля
Копирование текста в буфер обмена

Вернуться в раздел: Action Script / 13. Работа с текстом