
- •Оглавление
- •Вступление
- •Глава 1. Язык сценариев. ActionScript: начальные сведения
- •Проект 1: Прыгающий мяч (программная анимация)
- •1.1. Среда разработки ActionScript: настройка и приемы работы
- •1.1.1. Различие между стандартной и профессиональной версиями Flash
- •1.1.2. Панель Actions
- •1.1.3. Режим упрощенного ввода кода. Панель Behaviors
- •1.1.4. Как упростить создание кода на панели Actions
- •1.1.5. Типы сценариев
- •1.1.6. Централизация кода
- •1.1.7. Инструменты работы с кодом
- •1.1.8. Настройки стиля кода
- •1.1.9. Сохранение ActionScript-кода
- •1.1.10. Функция trace() и панель Output
- •1.1.11. Справочная информация
- •1.2. Синтаксис ActionScript
- •1.2.1. Пробельные символы
- •1.2.2. Завершение предложений
- •1.2.3. Чувствительность к регистру
- •1.2.4. Зарезервированные слова ActionScript
- •1.2.5. Принципы присвоения имен
- •1.2.6. Комментарии
- •1.3. Основные понятия
- •1.3.2. ActionScript как скриптовый язык Flash-плейера
- •1.3.3. Интерпретатор ActionScript. Flash-ассемблер
- •1.3.4. Символы и экземпляры символов
- •1.3.5. Переменные
- •1.3.6. Функции
- •1.3.7. Условные предложения
- •1.3.8. Циклы
- •1.3.9. Массивы
- •1.3.10. Объектная модель ActionScript
- •1.3.11. Свойства _root, _parent, Leveln и ключевое слово this
- •1.3.12. Области видимости кода
- •1.3.1. ЕСМА-262 как основа ActionScript
- •Глава 2. Типы данных
- •2.3. Математические функции и константы. Объект Math
- •2.3.1. Особенности реализации математических функций
- •2.3.2. Возведение в степень и вычисление квадратного корня
- •2.3.3. Экспонента и натуральный логарифм
- •2.3.5. Случайные числа
- •2.3.6. Округление до целого числа
- •2.3.7. Сравнение пары чисел
- •2.3.8. Тригонометрические функции
- •2.3.9. Математические константы
- •2.4. Строки (тип string)
- •2.4.1. Создание строк
- •2.4.2. Элементарные операции со строками
- •2.4.3. Класс String
- •2.4.4. Определение длины строки. Свойство lengths
- •2.4.5. Соединение строк. Метод concat()
- •2.4.6. Выделение символа строки по индексу. Метод charAt()
- •2.4.7. Поиск в строке. Методы indexOf() и lastIndexOff()
- •2.4.8. Извлечение подстроки. Методы substring(), substr(), slice()
- •2.4.9. Преобразование строк в массивы. Метод split()
- •2.4.12. Преобразование строк в идентификаторы. Функция eval()
- •2.4.13. Текстовые поля
- •2.5. Кодировка символов. Уникод во Flash
- •2.5.1. Немного истории
- •2.5.2. Поддержка уникода Flash-плейером
- •2.5.3. Поддержка уникода средой разработки
- •2.5.4. Добавление символов уникода
- •2.6. Логические величины (тип boolean)
- •2.6.1. Класс Boolean
- •2.7. Тип undefined
- •2.8. Тип null
- •2.9. Объекты (тип object)
- •2.9.1. Атрибуты свойств
- •2.9.2. Изменение атрибутов свойств. Функция ASSetPropFlags()
- •2.10. Клипы (тип movieclip)
- •2.11. Преобразование типов данных
- •2.11.1. Правила преобразования типов
- •2.11.2. Автоматическое преобразование типов
- •2.12. Строгая типизация в ActionScript
- •Проект 2: Калькулятор
- •2.1. Определение типа объекта данных
- •2.2. Числа (тип number)
- •2.2.1. Виды чисел в ActionScript
- •2.2.2. Особенности представления чисел
- •2.2.3. Операции с числами
- •2.2.4. Класс Number — методы и свойства
- •2.2.5. Преобразование строк в числа. Функции parseInt() и parseFloat()
- •Глава 3. Переменные
- •3.1. Создание переменных
- •3.2. Особенности типизации переменных
- •3.3. Локальные переменные функций
- •3.4. Глобальные переменные
- •3.5. Особенности операции присваивания
- •3.6. Есть ли переменные в ActionScript?
- •3.7. Удаление переменных
- •Проект 3: Пружинный маятник
- •Глава 4. Функции
- •4.1. Создание функций
- •4.2. Вызов функций
- •4.3. Предложение return
- •4.4. Рекурсия
- •4.5. Особенности цепочки областей видимости функций
- •4.6. Объект arguments
- •4.6.1. Формальные параметры и объект arguments
- •4.6.2. Свойства объекта arguments
- •4.7. Особенности передачи в функции составных объектов данных
- •4.8. Функции как объекты
- •4.8.1. Класс Function
- •4.8.2. Свойство prototype
- •4.8.3. Методы вызова функции
- •4.9. Функции на стадии выполнения. Объект активации
- •Проект 4: Крестики-нолики
- •Глава 5. Операторы
- •5.1. Виды операторов
- •5.2. Иерархия операций
- •5.3. Сочетательность операций
- •5.4. Арифметические операторы
- •5.5. Операторы присваивания
- •5.5.1. Оператор =
- •5.5.2. Операторы присваивания с модификацией
- •5.5.3. Инкрементирование и декрементирование
- •5.6. Операторы равенства и сравнения
- •5.6.1. Операторы равенства
- •5.6.2. Операторы сравнения
- •5.7. Логические операторы
- •5.8. Условный оператор (?:)
- •5.9. Служебные операторы
- •5.9.1. Инициализаторы литералов
- •5.9.2. Оператор группирования
- •5.9.3. Операторы доступа к свойствам
- •5.9.4. Оператор вызова функции
- •5.9.5. Оператор new
- •5.9.6. Оператор super
- •5.9.7. Оператор delete
- •5.9.8. Оператор typeof
- •5.9.9. Оператор instanceof
- •5.9.10. Оператор void
- •5.9.11. Оператор «запятая»
- •5.10. Поразрядные операторы
- •5.10.1. Логические поразрядные операторы
- •5.10.2. Операторы поразрядного сдвига
- •Проект 5: 3D-конструктор
- •Глава 6. Предложения
- •6.1. Блок предложений
- •6.2. Предложения var и function
- •6.3. Предложения выражений и пустые предложения
- •6.4. Предложение return
- •6.5. Предложение with
- •6.6. Условные предложения
- •6.6.1. Предложение if
- •6.6.2. Предложение switch
- •6.7. Циклы
- •6.7.1. Циклы с предусловием (while и do—while)
- •6.7.2. Цикл с параметром (for)
- •6.7.4. Предложения break и continue
- •6.7.5. Ограничение на время выполнения кода
- •6.7.6. Циклы события onEnterFrame и временной диаграммы
- •6.7.7. Циклический вызов функций. Функция setInterval()
- •Проект 6: Тетрис
- •Глава 7. Массивы (класс Array)
- •7.1. Создание массивов
- •7.2. Извлечение и переопределение элементов массива
- •7.3. Длина массива. Свойство length
- •7.4. Добавление элементов в массив
- •7.5. Удаление элементов массива
- •7.6. Слияние массивов
- •7.7. Выделение фрагмента массива
- •7.8. Инверсия массива
- •7.9. Сортировка массива
- •7.10. Преобразование массива в строку
- •7.11. Многомерные массивы
- •7.13. Особенности реализации массивов в ActionScript
- •Проект 7: Пиксельное табло
- •Глава 8. События
- •8.1. Модель событий Генератор—Листенеры
- •8.1.1. Обработчики событий
- •8.1.2. Листенеры
- •8.2. Событийные методы
- •8.3. Модель событий Flash 5
- •8.4. Обновление экрана при событиях
- •Проект 8: Создаем события сами
- •Глава 9. Объектно-ориентированное программирование
- •9.2.1. Объекты
- •9.2.2. Свойства
- •9.2.3. Методы
- •9.2.4. Классы
- •9.2.5. Наследование
- •9.2.6. Создание надклассов и подклассов
- •9.2.7. Концепция создания надклассов Flash 6
- •9.2.8. Оператор super
- •9.2.9. Свойства и методы конструктора класса
- •9.2.10. Определение принадлежности объекта к классу
- •9.2.11. Цепочка областей видимости. Объект Global
- •9.3. Класс Object
- •9.3.1. Создание объектов класса Object
- •9.3.2. Метод registerClass(). Выделение экземпляров клипа в класс
- •9.3.3. Метод addProperty(). Свойства типа getter/setter
- •9.3.4. Методы watch() и unwatch(). События изменений свойств
- •9.3.5. Прочие методы класса Object
- •9.4.1. Создание классов
- •9.4.2. Задание наследуемых свойств и методов класса
- •9.4.3. Конструктор класса. Инициализация собственных свойств и методов объектов
- •9.4.4. Особенности задания методов в AciionScript2.0
- •9.4.5. Статичные члены класса
- •9.4.7. Динамические классы
- •9.4.8. Наследование
- •9.4.9. Интерфейсы
- •9.4.10. Свойства типа getter/setter
- •9.4.11. Выделение экземпляров символа в подкласс
- •9.4.12. Особенности контроля на этапе компиляции
- •9.4.13. Особенности импорта внешних классов
- •9.4.14. Пакеты
- •9.4.15. Встроенные классы. Директива intrinsic
- •Проект 9: Модель идеального газа
- •Глава 10. Клипы
- •10.1. Глобальные функции и свойства
- •10.2. Отличия клипов от объектов
- •10.2.1. Свойства клипов
- •10.3. Клипы как носители кода
- •10.3.1. Последовательность выполнения кода
- •10.3.2. Особенности использования свойств и методов класса MovieClip
- •10.4. Особенности основной временной диаграммы _root
- •10.5. Создание экземпляров клипов
- •10.5.1. Метод duplicateMovieClip()
- •10.5.3. Метод createEmptyMovieClip(). Создание пустого клипа
- •10.6. Виртуальные слои клипов
- •10.6.1. Изменение глубины клипа. Метод swapDepths()
- •10.7. Импорт внешних фильмов и изображений
- •10.7.2. Импорт внешних фильмов при помощи функций loadMovie() и loadMovieNum()
- •10.7.3. Импорт изображений
- •10.7.4. Импорт фильмов и изображений при помощи класса MovieClipLoader
- •10.7.5. Создание предзагрузчиков
- •10.7.6. Кэширование swf-фильмов
- •10.7.7. Изменение глубины основной временной диаграммы
- •10.7.8. Доступ из одного фильма к объектам другого
- •10.7.9. Обобщенные библиотеки
- •10.8. Имена экземпляров клипов
- •10.9. Ссылки на клипы
- •10.9.1. Свойство _lockroot
- •10.9.2. Определение пути к клипу
- •10.9.3. Инструмент Insert Target Path
- •10.10. Система координат клипов
- •10.10.1. Свойство _x и _y
- •10.10.2. Пересчет координат из одной системы в другую
- •10.10.3. Масштаб осей
- •10.10.4. Размер клипа
- •10.10.5. Границы клипа
- •10.10.6. Поворот системы координат
- •10.11. Прозрачность и видимость клипа
- •10.11.1. Свойство _alpha
- •10.11.2. Свойство _visible
- •10.12. Перемещаемые клипы. Метод startDrag()
- •10.12.1. Свойство _droptarget
- •10.13. Коллизии клипов. Метод hitTest()
- •10.13.1. Определение пересечения двух клипов
- •10.13.2. Определение принадлежности точки к клипу
- •10.13.3. Определение коллизии клипов с использованием поточечного перебора
- •10.14. Управление временной диаграммой
- •10.14.1. Начало и остановка проигрывания клипа
- •10.14.2. Переход на новый кадр
- •10.14.3. Определение номера проигрываемого кадра
- •10.15. Программные маски
- •10.16. Удаление экземпляров клипов и фильмов
- •10.16.1. Удаление экземпляров. Метод removeMovieClip()
- •10.16.2. Выгрузка содержимого экземпляров. Метод unloadMovie()
- •10.16.3. Выгрузка фильмов
- •10.17. События
- •10.17.1. Создание обработчиков событий в стиле Flash 5
- •10.17.2. Событие смены кадров (onEnterFrame)
- •10.17.3. Событие загрузки клипа (onLoad)
- •10.17.4. Событие выгрузки клипа (onUnload)
- •10.17.5. Событие поступления данных (onData)
- •10.17.6. События мыши (onMouseDown, onMouseUp, onMouseMove)
- •10.17.7. События клавиатуры (onKeyDown, onKeyUp)
- •10.17.8. «Кнопочные» события
- •10.17.9. События фокуса (onSetFocus, onKillFocus)
- •10.18. Программное рисование
- •10.18.1. Рисование прямыми отрезками
- •10.18.2. Рисование фрагментами парабол
- •10.18.3. Однородная заливка
- •10.18.4. Градиентная заливка
- •10.18.5. Удаление программной графики
- •10.19. Управление цветом клипов. Класс Color
- •10.19.1. Цветовые модели
- •10.19.2. Задание формулы цвета
- •10.19.3. Задание цвета клипа. Метод setRGB()
- •10.19.4. Цветовые трансформации. Метод setTransform()
- •Проект 10: Рисование 3D-объектов
- •Глава 11. Кнопки
- •11.1. Создание кнопок
- •11.2. Сходства и различия кнопок и клипов
- •11.3. События кнопок
- •11.3.1. Особенности событий кнопок
- •11.3.2. События кнопок в стиле Flash 5
- •11.4. Режим элемента меню
- •11.5. Вид указателя мыши
- •11.6. Отключение кнопок
- •11.7. Управление кнопками при помощи клавиатуры
- •11.7.1. Динамическое наведение фокуса
- •11.7.2. Свойство _focusrect
- •11.7.3. События onSetFocus и onKillFocus
- •11.7.4. Задание маршрута клавиатурного обхода
- •11.7.5. Особенности клавиатурного обхода и программного фокуса в случае клипов
- •11.8. Клипы как кнопки
- •Проект 11: Факел
- •Глава 12. Работа с мышью и клавиатурой
- •12.1. Работа с мышью
- •12.1.1. Определение координат указателя мыши
- •12.1.2. События мыши
- •12.1.3. Скрытие указателя мыши
- •12.1.4. Правая клавиша мыши
- •12.1.5. Определение выхода указателя мыши за пределы окна плейера
- •12.2. Контекстное меню
- •12.2.1. Настройка контекстного меню. Класс ContextMenu
- •12.2.2. Введение в контекстное меню собственных команд
- •12.3. Работа с клавиатурой
- •12.3.1. Особенности событий клавиатуры
- •12.3.2. События onKeyDown и onKeyUp
- •12.3.3. Определение кода нажатой клавиши. Метод getCode()
- •12.3.4. Определение кода введенного символа. Метод getAscii()
- •12.3.5. Проверка нажатия клавиши. Метод isDown()
- •12.3.6. Проверка активности специальных режимов. Метод isToggled()
- •Проект 12: Эластики
- •Глава 13. Работа с текстом
- •13.1. Создание текстовых полей
- •13.1.1. Создание текстовых полей при помощи инструмента Text
- •13.1.2. Переменная поля
- •13.1.3. Динамическое создание текстовых полей
- •13.2. Удаление текстовых полей
- •13.3. Текстовые поля как визуальные объекты
- •13.4. Задание и извлечение текста поля
- •13.5. Настройка текстового поля
- •13.5.1. Управление размером поля
- •13.5.2. Рамка и задний фон
- •13.5.3. Поля однострочные и многострочные
- •13.5.4. Ограничение на количество символов
- •13.5.5. Поле паролей
- •13.5.6. Ограничение на вводимые символы
- •13.5.7. Выделение текста поля
- •13.6. Настройка стиля текста. Класс TextFormat
- •13.6.1. Задание гарнитуры
- •13.6.2. Размер шрифта
- •13.6.3. Цвет шрифта
- •13.6.4. Начертание шрифта
- •13.6.5. Выключка
- •13.6.6. Подчеркнутый шрифт
- •13.6.7. Гиперссылки
- •13.6.8. Форматирование текста
- •13.6.9. Определение размерных параметров текста
- •13.7. Работа со шрифтами
- •13.7.1. Шрифты системные и встроенные
- •13.7.2. Ненаправленные гарнитуры
- •13.7.3. Особенности встраивания шрифтов
- •13.7.4. Встраивание в фильм целого шрифта
- •13.7.5. Встраивание глифов отдельных символов и последовательностей символов
- •13.7.6. Проблема читабельности при отображении мелкого текста
- •13.8. Событие onChanged
- •13.9. Прокрутка текстовых полей
- •13.10. Работа с фокусом
- •13.11. Форматирование текста при помощи HTML
- •13.11.5. Тег <FONT> ... </FONT>
- •13.11.10. Тег <TEXTFORMAT> ... <TEXTFORMAT>
- •13.11.11. Тег <SPAN> ... </SPAN>
- •13.11.13. Автоматическое удаление пробелов. Свойство condenseWhite
- •13.12. Форматирование текста с использованием каскадных таблиц стиля (CSS)
- •13.12.1. Основные положения технологии CSS
- •13.12.2. Создание объекта таблиц стиля
- •13.12.3. Применение объекта стиля к текстовому полю
- •13.12.4. Элементы CSS, поддерживаемые Flash-плейером
- •13.13. Работа с выделением. Объект Selection
- •13.13.1. Управление фокусом поля. Методы getFocus() и setFocus()
- •13.13.2. Событие изменения фокуса (onSetFocus)
- •13.13.4. Определение и задание положения курсора ввода
- •13.13.5. Динамическое задание выделения. Метод setSelection()
- •13.13.6. Динамическая замена выделенного текста. Метод replaceSel()
- •13.14. Работа со статичным текстом. Объект TextSnapshot
- •13.14.1. Создание объектов класса TextSnapshot
- •13.14.2. Считывание текста статичных полей
- •13.14.3. Поиск строки в статичном тексте
- •13.14.4. Программное выделение статичного текста
- •13.14.5. Определение ближайшего к точке символа статичного текста
- •13.15. Копирование текста в буфер обмена
- •13.16. Поддержка многоязычности. Панель Strings
- •Проект 13: Текстовые эффекты
- •Глава 14. Время и дата
- •14.1. Основные понятия теории измерения времени
- •14.2. Компьютерное время
- •14.3. Класс Date
- •14.3.1. Создание объектов класса Date
- •14.3.2. Методы класса Date
- •14.4. Определение времени, прошедшего с начала проигрывания фильма
- •Проект 14: Программные часы
- •Глава 15. Работа со звуком
- •15.1. Основные понятия теории цифрового звука
- •15.1.1. Частота дискретизации
- •15.1.2. Разрядность выборок
- •15.1.3. Количество каналов
- •15.1.4. Алгоритмы компрессии
- •15.1.5. Форматы хранения
- •15.2. Событийный (event) и потоковый (stream) звук
- •15.3. Операции со звуком без использования программирования
- •15.4. Создание объектов класса Sound
- •15.5. Динамическое присоединение звука. Метод attachSound()
- •15.6. Импортирование внешних МР3-файлов
- •15.6.1. Метод loadSound()
- •15.6.2. Отслеживание окончания загрузки. Событие onLoad
- •15.6.3. Создание предзагрузчиков для импортируемых звуков
- •15.7. Управление воспроизведением звуков
- •15.7.1. Запуск воспроизведения. Метод start()
- •15.7.3. Событие onSoundComplete
- •15.8. Свойства position и duration
- •15.9. Управление параметрами воспроизведения
- •15.9.1. Громкость звука
- •15.9.2. Баланс
- •15.9.3. Детальное управление стереозвучанием. Метод setTransform()
- •15.10. Чтение ID3-тегов МР3-звуков
- •Проект 15: МР3-плейер
- •Глава 16. Взаимодействие с локальным окружением
- •16.1. Взаимодействие с импортированными фильмами
- •16.2. Взаимодействие с плейером
- •16.2.1. Определение версии и типа плейера
- •16.2.2. Режимы масштабирования
- •16.2.3. Типы выравнивания
- •16.2.4. Определение размеров фильма и величины окна плейера
- •16.2.5. Событие onResize
- •16.2.6. Цвет фона
- •16.2.7. Качество отображения
- •16.2.8. Панель небезопасных настроек плейера
- •16.3. Дополнительные возможности автономного плейера
- •16.3.1. Проекторы
- •16.3.2. Функция fscommandf()
- •16.4. Взаимодействие между фильмами, проигрываемыми разными плейерами
- •16.4.1. Создание кода отправки данных
- •16.4.2. Создание кода получения данных
- •16.4.3. Пример использования класса LocalConnection
- •16.5. Взаимодействие с браузером
- •16.5.1. Теги <EMBED> и <OBJECT>
- •16.5.2. Передача данных из HTML-окружения при загрузке фильма
- •16.5.3. Решение проблемы кнопок навигации браузера
- •16.5.4. Передача команд браузеру. Функция getURL()
- •16.5.5. Взаимодействие с JavaScript при помощи функции fscommand()
- •16.5.6. Управление SWF-фильмом посредством JavaScript
- •16.5.7. Определение наличия в системе Flash-плейера нужной версии
- •16.6. Взаимодействие со средой разработки
- •16.6.1. Настройка панели Actions
- •16.6.2. Объект CustomActions
- •16.6.3. Взаимодействие с JSFL
- •16.7. Взаимодействие со средствами чтения с экрана
- •16.8. Получение информации об использующемся аппаратном и программном обеспечении
- •16.9. Сохранение данных на диске
- •16.9.1. Создание объектов SharedObject
- •16.9.2. Чтение данных из объектов SharedObject
- •16.9.3. Удаление sol-файлов
- •16.9.4. Серверные объекты SharedObject
- •16.9.5. Решение проблемы выделения цветом посещенных ссылок
- •16.10. Взаимодействие с принтером
- •16.10.1. Функции печати
- •16.10.2. Класс PrintJob
- •Проект 16: Создаем свой инструмент
- •Глава 17. Обмен текстовыми данными с сервером
- •17.1. Принципы сетевой безопасности Flash MX 2004
- •17.1.1. Правила определения идентичности доменов
- •17.1.2. Требование идентичности протоколов
- •17.1.3. Снятие ограничений на доступ к содержимому фильма
- •17.1.4. Снятие ограничений на доступ к внешним данным
- •17.1.5. Преодоление ограничений для сокетов
- •17.1.6. Создание приложений, отвечающих принципам безопасности
- •17.2. Загрузка текстовых данных с сервера
- •17.2.1. Создание файла сданными
- •17.2.2. Функция loadVariables()
- •17.2.3. Класс LoadVars
- •17.3. Взаимодействие с серверным скриптом
- •17.3.1. Запрос с выводом результата в браузере
- •17.3.2. Запрос с отправкой результата в фильм
- •17.3.3. Задание заголовков запроса
- •17.4. Работа с сокетами
- •17.4.1. Класс XMLSocket
- •17.4.2. Создание сокета-сервера
- •17.5. Работа с XML
- •17.5.1. Введение в ХМL
- •17.5.2. Объектная модель XML. DOM
- •17.5.3. Преобразование XML-текста в дерево объектов DOM
- •17.5.4. Обход дерева DOM
- •17.5.5. Создание и модификация XML-документа
- •17.5.6. Обмен XML-данными с сервером
- •Проект 17: Создаем сетевую игру
- •Дополнительные главы
- •Глава 18. Обмен с сервером сложными данными
- •Глава 19. Компоненты
- •Глава 20. Полезные мелочи
13.13. Работа с выделением. Объект Selection
Важнейшим и наиболее традиционным инструментом, облегчающим работу с текстовой информацией на компьютере, является выделение. Выделение (selection) позволяет объединить в целостный с точки зрения операций блок некоторую последовательность символов. Обозначается выделение за счет обмена оттенками между шрифтом и фоном строки. Выделенный текст может быть удален одним нажатием клавиши <BackSpace>, он может быть вырезан или скопирован в буфер, его можно заменить, выполнив вставку из буфера.
Основным применением технологии Flash является создание сайтов. Любая же информационная страница должна предоставлять возможность копирования из нее нужных сведений. Это особенно актуально в случае Flash-сайтов, которые нельзя сохранять, просто записывая на диск родительский HTML-документ. Кроме того, выделение чрезвычайно полезно при заполнении форм. Копируя информацию из одного поля в другое, удаляя сразу весь текст или определенный его фрагмент, выполняя замену одного участка текста на другой, прописать все необходимые сведения в анкете можно гораздо быстрее, нежели набирая и удаляя каждый символ по отдельности. Не обойтись без выделения, если необходимо организовать такую полезную возможность, как поиск на странице. Ввиду описанных причин, совсем не удивительно, что текстовые поля Flash полноценно поддерживают выделение.
Выделить фрагмент текста можно несколькими способами:
•Чтобы выделить участок текста от символа А до символа В, нужно щелкнуть мышью около А, а затем, удерживая левую кнопку зажатой, переместить указатель к В. Это наиболее универсальный подход к выделению.
•Выделить определенное слово можно, выполнив по нему двойной щелчок мышью.
•Чтобы выделить весь текст, необходимо нажать <Ctrl> + <A> или воспользоваться командой Select All контекстного меню поля.
•Выделить участок текста от символа А до В, используя одну лишь клавиатуру, можно, переместив курсор ввода от А до В при зажатой клавише <Shift>.
•Нажав сочетание <Shift> + <End>, вы выделите фрагмент текста от курсора ввода и до конца строки. Соответственно, чтобы выделить участок строки от ее начала и до курсора ввода, необходимо задействовать сочетание <Shift> + <Home>.
•Сочетание <Shift> + <Ctrl> + <End> выделяет фрагмент от курсора ввода и до конца текста. Чтобы выделить участок от начала текста и до курсора ввода, нужно задействовать сочетание
<Shift> + <Ctrl> + <Home>,
•Выделить участок текста можно программно при помощи метода Selection.setSelection(). О нем мы поговорим немного ниже.
В отличие от Word и других полноценных текстовых редакторов, во Flash невозможно выделить несколько разрозненных фрагментов, зажав клавишу <Ctrl>. В один момент времени может быть выделен только один участок текста и только водном поле.
Основные операции с выделенным текстом во Flash проводятся точно так же, как и, например, в Word или Блокноте:
•Чтобы скопировать выделенный текст в буфер, нужно нажать сочетание <Ctrl> + <С>. Также это можно сделать при помощи команды Сору контекстного меню текстового поля.
•Вырезать выделенный участок текста в буфер можно сочетанием <Ctrl> + <Х>. Также это по-
зволяет сделать команда Cut контекстного меню поля. Вырезать в буфер можно только фрагмент текста поля ввода. В случае динамического или статичного поля эта операция недоступна.
•Удалить фрагмент текста можно, нажав клавишу <BackSpace> или <Delete>. Кроме того, за ту же операцию отвечает команда Delete контекстного меню поля. Выполнить удаление участка текста можно, лишь если он принадлежит полю ввода.
•Чтобы заменить выделенный участок текста текстом из буфера обмена, нужно задействовать сочетание <Ctrl> + <V> или воспользоваться командой Paste контекстного меню поля. Программно заменить выделенный фрагмент произвольным текстом позволяет метод replaceSel()
класса TextField.
По умолчанию как поля ввода, так и динамические поля являются выделяемыми. Это не всегда приемлемо. О том, какие сложности при этом могут возникнуть и как можно сделать поле невыделяемым, подробно рассказывается в подразделе 13.5.7.
Чаще всего выделение создается и применяется пользователем вручную. Однако иногда необходимо иметь возможность выделить фрагмент текста программно, а также заменить выделенный текст нужной строкой. Кроме того, нередко бывает нужно знать, какой участок текста выделен. Например, если пользователь сделал ошибку при заполнении формы, выделением можно указать, где именно она была допущена. Если реализуется инструмент поиска на странице, найденная подстрока должна выделяться. При организации поиска с заменой по нажатию специальной кнопки найденная и выделенная подстрока должна замещаться нужным текстом. ActionScript позволяет с легкостью решать перечисленные задачи благодаря наличию особого объекта Selection. Данный объект хранит методы, позволяющие получать информацию о выделении, задавать его, а также помещать текстовое поле в фокус и определять, в каком поле находится выделение. Все эти возможности мы изучим в данном разделе.
13.13.1. Управление фокусом поля. Методы getFocus() и setFocus()
Методы объекта Selection применимы только к тому текстовому полю, которое в данный момент находится в фокусе. Поэтому прежде чем выделить участок текста, нужно убедиться, что курсор ввода располагается в нужном текстовом поле. Для этого необходимо воспользоваться методом Selection.getFocus(). В качестве результата данный метод возвращает строку с адресом объекта (это может быть текстовое поле, кнопка или клип), который на данный момент обладает фокусом ввода. Если текстовое поле не имеет собственного идентификатора, но зато с ним связана переменная (это возможно, если фильм создается в формате Flash 5), то мeтод getFocus() возвращает ее имя. Если ни один объект не имеет фокуса, то результат — null.
Если метод getFocus() покажет, что нужное поле не обладает фокусом ввода, его необходимо сделать выделенным программно. Для этого предназначен метод Selection.setFocus(object), где object
— объект (это может быть текстовое поле, кнопка или клип), на который нужно навести фокус. Если задача методом Selection.setFocus() была решена успешно, он возвращает true. Иначе возвращается false.
// Если pole не имеет фокуса ввода, наводим его программно if (Selection.getFocus()!=pole.toString()){
Selection.setFocus(pole);
}
Особенностью метода getFocus() является то, что в случае клипов и кнопок он реагирует лишь на так называемый «клавиатурный» фокус, который создается при помощи Tab-обхода или метода setFocus() и, главное, обозначается яркой желтой рамкой. Если же кнопка или клип выделяется простым щелчком мыши, то такой фокус метод getFocus() не улавливает. Наоборот, в случае текстовых полей фокус рассматриваемым методом регистрируется и тогда, когда поле было выделено вручную.
Поместить текстовое поле в фокус можно также, адресуя его при помощи связанной с ним переменной. Для этого ее имя строго в строковом представлении должно быть прописано в качестве параметра метода Selection.setFocus().
Чтобы уничтожить текущий фокус, методу Selection.setFocus() необходимо передать null.
Особенностью наведения фокуса на текстовое поле является то, что при этом весь его текст выделяется. Если необходимо, чтобы выделения текста не происходило, сразу же после задания фокуса нужно создать «пустое» выделение при помощи следующей строки:
Selection.setSelection(null,null);
13.13.2. Событие изменения фокуса (onSetFocus)
С событиями onSetFocus и onKillFocus, происходящими при получении объектом фокуса ввода и потере им его, мы уже встречались, когда изучали кнопки и Таb-обход текстовых полей. Данные события могут быть полезны, если нас интересует выделение какого-то конкретного поля. Если же важно знать о наведении фокуса на любой объект фильма, то они малоэффективны. В этом случае лучше использовать событие onSetFocus объекта Selection.
Событие onSetFocus объекта Selection происходит, если фокус ввода меняет целевой объект. Его обработчику передаются 2 параметра. Первый хранит ссылку на объект, потерявший фокус. Второй указывает на объект, фокус получивший. Если фокус наводится впервые или же объект теряет его без передачи другому объекту, то один из параметров обработчика onSetFocus будет равен null.
По умолчанию событие onSetFocus не имеет листенеров. Чтобы заставить объект «слушать» данное событие, ссылка на него должна быть добавлена в массив _listeners объекта Selection. Сделать это позволяет метод addListener():
var obj:Object =(); Selection.addListener(obj);
obj.onSetFocus = function(f1:TextField, f2:TextField):Void { trace("Потерял фокус "+f1+", Получил фокус "+f2);
};
Для удаления объекта из числа листенеров генератора событий предназначен метод removeListener (подробнее см. главу 8).
13.13.3.Определение границ выделения.
Методы getBeginlndex() и getEndIndex()
ActionScript позволяет определить, какая область текста является выделенной. Для этого служат методы Selection.getBeginIndex() и Selection.getEndIndex().
Метод Selection.getBeginIndex() возвращает индекс символа, начинающего выделенную последовательность. Индексация символов происходит с нуля. Если ни одно текстовое поле не имеет фокуса ввода, то результатом будет — 1. Если же поле с фокусом имеется, но в нем нет выделенных символов, то метод Selection.getBeginIndex() возвращает позицию курсора ввода (это значение также можно определить при помогли метода Selection.getCaretIndex()).
Метод Selection.getEndIndex() возвращает индекс символа, который располагается за последним символом выделенной последовательности. По своим особенностям методы getEndIndex() и getBeginIndex() абсолютно идентичны. Пример:
this.createTextField("pole", 0, 150, 150, 0, 0); pole.border=pole.autoSize=true, pole.type="input"; pole.text="Bыдeлeнный текст";
//При наведении на поле фокуса весь текст выделяется
Selection.setFocus(pole);
trace([Selection.getBeginIndex(), Selection.getEndIndex()]];
//Выводит: 0, 16
13.13.4. Определение и задание положения курсора ввода
Если текстовое поле располагается в фокусе, в его тексте будет находиться так называемый курсор ввода (caret). Он показывает, на какую позицию осуществится вставка текста из буфера обмена командой Paste. Также курсор ввода полезен, если навигация по тексту поля и его редактирование производится с использованием клавиатуры. При этом, например, нажатие клавиши <BackSpace> будет удалять символ, расположенный слева от курсора.
Традиционно курсор ввода отображается в виде мерцающей вертикальной риски. Частота мерцания курсора для большинства Windows-приложений определяется при помощи специальной настройки, задающейся вменю Клавиатура Панели Управления. Однако данная опция никак не влияет на частоту мерцания курсора ввода в текстовых полях Flash — она всегда постоянна, и изменить ее невозможно.
Курсор ввода отображается только в случае полей типа Input. Для динамических текстовых полей его наличие абсолютно бессмысленно: все равно изменить вручную текст в них невозможно. Впрочем, косвенными методами можно установить, что курсор ввода имеется и у полей типа Dynamic — просто он не визуализируется. Например: метод getCaretIndex() применим к полям обоих типов, адинамическое поле может быть прокручено при помощи клавиш движения.
Используя ActionScript, можно как определять положение курсора ввода, так и самостоятельно его задавать. Решить первую задачу позволяет метод Selection.getCaretIndex(). Он возвращает индекс символа, слева от которого располагается курсор. Если ни одно поле не имеет фокуса ввода, то результатом будет — 1. Если текстовое поле не содержит ни одного символа, то возвращается 0.
Чтобы задать положение курсора ввода, необходимо использовать метод Selection.setSelection(), передав его обоим параметрам одно и то же значение — индекс символа, перед которым должен быть расположен курсор. Например:
this.createTextField("pole", 0, 150, 150, 0, 0); pole.border=pole.autoSize=true, pole.type="input"; pole.text="Tyт \"\" будет курсор ввода. Его индекс = ";
Selection.setFocus(pole); |
// Помещаем поле в |
фокус |
|
Selection.setSelection (5,5); |
// Помещаем курсор |
ввода между кавычками |
|
pole.text+=Selection.getCaretIndex(); |
// Добавляем |
к тексту поля индекс курсора |
13.13.5. Динамическое задание выделения. Метод setSelection()
Самой важной для практики задачей из тех, которые позволяют решать методы объекта Selection, является динамическое выделение произвольного участка текста поля. Служит для этого особый метод setSelection(). Он принимает 2 параметра: первый определяет индекс символа, который начинает подлежащую выделению последователь гость, второй — соответствует индексу символа, перед которым выделяемый участок текста заканчивается.
Метод setSelection() выделяет фрагмент текста того поля, которое в данный момент располагается в фокусе. Поэтому, прежде чем его использовать, нужно проверить, необходимое ли поле активно. Сделать это можно при помощи метода getFocus(). Если окажется, что в фокусе находится иное поле (или активных полей нет в принципе), то фокус необходимо перевести на нужный элемент, используя метод setFocus().
При динамическом создании выделения курсор ввода автоматически перемещается к последнему выделенному символу.
Если выделяется участок текста, который располагается за пределами видимой области поля, то автоматически будет осуществлена прокрутка так, чтобы он отобразился. Это позволяет не беспокоиться о реализации соответствующего механизма дополнительно.
Типичным примером использования метода setSelection() является организация возможности поиска в текстовых полях фильма. Если ваш Flash-сайт содержит большие объемы текстовой информации, то создать соответствующий инструмент просто необходимо. Иначе у пользователя могут возникнуть сложности при работе с вашим ресурсом, обусловленные тем, что стандартная функция браузера по поиску на странице в случае Flash-сайта не работает.
Для тренировки мы создадим код, позволяющий осуществлять поиск в одном текстовом поле. При необходимости сделать его более универсальным не составит труда. Итак:
1.Создаем при помощи инструмента Text большое (приблизительно 200x200 пикселей) динамическое текстовое поле. Называем его pole.
2.Связываем с созданным полем текст (500—1000 знаков).
3.Создаем небольшое поле типа Input, в которое будет вводиться строка, которую нужно найти. Называем его str.
4.Добавляем в фильм кнопку, нажатие которой будет активизировать поиск. Называем ее but.
5.Основная идея алгоритма инструмента поиска следующая:
oПриводим текст поля и искомую строку к одному регистру при помощи метода toLowerCase() или toUpperCase(). Это необходимо сделать, чтобы строка находилась вне зависимости оттого, начинает ли она предложение ил и располагается в его середине.
oИщем необходимую строку, начиная от символа, которым был завершен прошлый поиск. Найти подстроку в строке позволяет метод indexOf() класса String.
oЕсли подстрока будет найдена, ее нужно выделить. Также в специальной переменной необходимо отметить, какой индекс имеет последний символ выделенной последовательности. Эта информация пригодится, если поиск будет продолжен.
oЕсли необходимая подстрока на участке поиска найдена не была, значит, до конца текста она больше не встречается. Это означает, что поиск нужно начать сначала.
Описанному алгоритму соответствует следующий код:
var index:Number = 0; // Индекс символа, на котором был завершен
//прошлый этап поиска
//Переменная, хранящая искомую строку
var stroke:String=""; function poisk():Void {
//Приводим текст поля и искомый текст к полному регистру var big_text:String = pole.text.toLowerCase();
var stroke:String = stroka.toLowerCase();
//Ищем подстроку stroka с позиции index
var search_res = big_text.indexOf(stroka, index);
// Если подстрока найдена, выделяем ее и переопределяем index if (search_res!= -1) {
index = search_res+stroka.length; Selection.setFocus(pole);
Selection.setSelection(search_res, search_res+stroka.length);
} else { // Если подстрока не найдена, начинаем поиск сначала index = 0; index = 0;
}