
- •Оглавление
- •Вступление
- •Глава 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. Полезные мелочи

•Включить функцию автоматических переносов. Чтобы это сделать, нужно присвоить значение true специальному свойству класса TextField wordWrap. По умолчанию пословного переноса не происходит — wordWrap равняется false.
Рис. 13.3. Созданное программно многострочное поле
Результат работы кода представлен на рис. 13.3 — вид этого текста оставляет желать лучшего. Очевидно, что его стоит выровнять по центру, а также задать другой стиль шрифта. Эти задачи вполне решаемы при помощи ActionScript благодаря наличию класса Text Format. О нем мы поговорим в разделе 13.6.
13.5.4. Ограничение на количество символов
Как правило, наличие в фильме полей ввода, предназначенных для задания пользователем некоторых параметров, подразумевает, что данные в них будут прописаны в определенном формате. Например, если в поле должен быть введен возраст, то это число не может быть длиннее 2 знаков (столетние бабушки редко пользуются Интернетом, поэтому их можно не учитывать), значение в поле веса не может превышать 3 знаков и т.д. Если пользователь — по ошибке или из баловства — введет в поле необоснованно длинное или излишне короткое значение, то в алгоритме может случиться сбой. Чтобы этого избежать, зачастую необходимо задавать ограничение на наибольшее или наименьшее количество знаков, которые могут быть введены в поле.
Предупредить введение в поле излишне длинного значения очень просто. Для этого нужно прописать максимально допустимое количество знаков в окошке Maximum Characters Инспектора Свойств поля (рис. 13.1, 20). По умолчанию в данном окошке отображается значение 0. Вопреки логике это означает, что ограничений на количество вводимых знаков не имеется. Минимальный лимит, который можно задать, составляет 1 знак, максимальный — 65535 (0xFFFF).
Ограничить количество символов, которые могут быть введены в поле типа Input, можно и программно. Для этого предназначено специальное свойство класса TextField maxChars. Его значением является максимально допустимое для введения число символов (от 1 до 65535). Если maxChars равно 0 (или null), то лимита на длину вводимой строки не существует (принятое по умолчанию значение). Пример:
this.createTextField("pole", 0, 100, 100, 30, 20);
pole.type="input", pole.border=true; |
// Делаем поле полем ввода и |
pole.maxChars=3; |
// активизируем отображение рамки |
// Ограничиваем число вводимых знаков тремя |
Ограничения на максимальное число символов не действуют, если текст выводится в поле про-
граммно, переопределением свойства text или переменной поля.
Не допустить введения пользователем слишком короткой строки также очень просто. Для этого, перед тем как обработать полученное из поля значение, нужно проверить, сколькими символами оно образовано. Если окажется, что их необоснованно мало, то необходимо отклонить заполненную форму, выведя сообщение с просьбой исправить ошибки.
Узнать, сколько символов имеется в строке, соответствующей текстовому полю, можно при помощи свойства length класса String. Однако имеется и альтернативный вариант решения этой задачи, связанный с использованием свойства length класса TextField. По особенностям своей работы эти свойства аналогичны, однако второе более производительно:
this.createTextField{"pole", 0, 200, 200, 100, 30);
pole.text = "\tПривет!", pole.border=true; |
|||
trace(pole.text.length); |
// |
Выводит: |
8 |
trace(pole.length); |
// |
Выводит: |
8 |
Обратите внимание, что отдельными знаками считаются и не визуализируемые символы — пробелы, знаки табуляции, переносы строки. Поэтому длина строки поля может быть ненулевой, даже если в нем ничего не отображается.
13.5.5. Поле паролей
Ушли в далекое прошлое те времена, когда Интернет был полностью открытой и лишенной какойлибо коммерческой составляющей средой, В настоящее время в сети имеется огромное количество платных ресурсов и ресурсов клубного типа. Чтобы получить к ним доступ, необходимо ввести в
специальные поля идентификатор пользователя и, главное, выданный при регистрации пароль. В целях безопасности текст в поле пароля никогда не отображается — вместо символов пароля выводятся знаки «*».
Flash позиционируется компанией Macromedia, прежде всего, как инструмент разработки сайтов. Поэтому не удивительно, что для полей ввода имеется особый режим поля паролей. Чтобы его задать для созданного вручную поля, нужно выбрать в меню, обозначенном на рис. 13.1 выноской 17, пункт Password. При этом все символы (в том числе и пробелы) вводимого текста будут отображаться как «*».
Режим поля паролей может быть активизирован и программно. Для этого нужно присвоить значение true особому свойству класса TextField password:
this.createTextField("pole", 0, 200, 200, 100, 30); pole.type="input",pole.border=true;
pole.password=true; // Включаем режим поля паролей
Режим паролей по умолчанию делает поле однострочным. В принципе, его можно сделать и многострочным, переопределив свойство multiline. Однако на практике пароли из нескольких строчек не встречаются.
13.5.6. Ограничение на вводимые символы
Чаще всего поступающая из полей ввода информация должна иметь строго определенный формат. Например, если в поле прописывается возраст, то соответствующая строка должна быть образована только цифрами. Если поле служит для задания имени, то во введенном в него тексте не должно быть знаков препинания, цифр и операторов. Если пользователь, желая побыстрее отделаться от заполнения некоторой формы или же ради эксперимента, введет в поле текст, абсолютно не связанный с запрашиваемым, то в алгоритме, в худшем случае, может произойти сбой или же, в лучшем случае, форма просто не выполнит свои функции по сбору информации. Наиболее типичный случай связан с введением вместо числового параметра строки из букв. При попытке исполь-
зовать эту величину в вычислениях будет получено значение NaN, которое с высокой долей вероятности блокирует дальнейшее выполнение кода.
Очевидно, что в качественно изготовленном проекте должна быть предусмотрена вероятность введения в формы некорректных параметров. Конечно, можно проводить анализ поступающих строк, отклоняя их, если они содержат недопустимые символы. Однако такой подход требует довольно сложного программирования и добавления дополнительных элементов интерфейса, в которых будут появляться сообщения о сделанных пользователем ошибках. Используя ActionScript, данную проблему можно решить гораздо проще, задав для поля список допустимых символов. Не входящие в него знаки попросту не будут вводиться. Служит для этого специальное свойство класса TextField restrict.
В наиболее общем случае в качестве значения свойство restrict принимает строку, содержащую последовательность символов, допустимых для ввода. Например, создадим поле, в которое можно будет добавлять только цифры и символ %:
this.createTextField("pole", 0, 200, 200, 100, 30); pole.type="input", pole.border=true;
pole.restrict="0123456789 %"; // Никакие другие символы вводиться
// не будут
Задавая допустимые символы, нужно помнить, что одна и та же буква, но в разном регистре, считается различным знаком. Также отдельным символом является и пробел.
Как правило, делать допустимыми для ввода приходится целые группы однотипных символов. Это могут быть буквы русского или латинского алфавита в одном или обоих регистрах, цифры от 0 до 9, служебные символы. Согласитесь, что прописать все буквы алфавита, не потеряв ни одной — это не так уж и просто. Поэтому свойство restrict может обрабатывать и условные обозначения последовательностей символов в виде «А-В», где А — первый знак в последовательности, В — замыкающий ее символ. Например, чтобы в поле можно было вводить цифры от 0 до 9 и русские буквы обоих регистров, нужно набрать:
pole.restrict="0-9a-aA-Я"; |
// Пробелами разделять последовательности |
|
//не нужно |
Важно понимать, что свойство restrict обрабатывает обозначения последовательностей отнюдь не логически. Все гораздо проще: определяются Unicode-коды открывающего и замыкающего символа и в задаваемую ими группу включаются все знаки, чьи коды имеют промежуточное значение. Так как символы национальных алфавитов сохраняют в Unicode традиционную последовательность, то оказывается реальным сделать вводимыми все буквы, всего лишь задав первую и последнюю. Впрочем, возможны и более изощренные варианты. Например, зная, что в Unicode кирилличные символы обоих регистров располагаются одним блоком, причем вначале находятся большие буквы, а затем малые, сделать их все вводимыми можно следующей строчкой:
pole, restrict="A-я";
В одной строке, присваиваемой restrict, можно совмещать как обозначения последовательностей, так и одинарные символы:
pole.restrict="a-z012345"; // Вводиться будут буквы от а до z и цифры
// от 0 до 5
Иногда проще задавать не все допустимые для введения символы, а лишь группу неприемлемых. Чтобы это сделать, нужно составить строку из недопустимых символов (можно использовать и обозначения последовательностей), начав ее символом « » Присвоив эту строку свойству restrict, вы сделаете соответствующие символы невводимыми. Например:
pole.restrict=""0-9 %"; // Вводимыми будут все символы, кроме цифр от 0 до 9
Можно одновременно сделать некоторые символы вводимыми, а некоторые — нет. Для этого в строке, присваиваемой свойству restrict, нужно вначале прописать символы, допустимые для ввода, затем поставить «А» и задать неприемлемые знаки. Такой сложный ход бывает необходим, например, если нужно сделать вводимым целый алфавит, за исключением нескольких букв:
pole.restrict="A-z^rR"; // Вводимыми будут латинские буквы обоих регистров, // кроме буквы r
Приведенная директива работает, поскольку присваиваемая свойству restrict строка анализируется слева направо. Поэтому символы алфавита вначале делаются вводимыми, и лишь затем часть из них исключается из списка знаков, допустимых для ввода.
Символы в строке свойства restrict могут быть заданы и при помощи их Unicode-кодов. Это может быть полезно, если проект создается на языке, символов алфавита которого у вас на клавиатуре нет. Например:
pole.restrict="\u0030-\u0039"; |
// Вводимыми будут цифры от 0 до 9 |
При задании свойства restrict символы «^» и «-» считаются служебными. Чтобы они могли быть также включены в список вводимых знаков (или исключены из него), их необходимо экранировать символом обратного слеша «\». Для этого предварительно должен быть экранирован сам символ
«\»:
pole.restrict="\\^\\-\\\\"; |
// Вводимыми будут символы "^", "-", "\" |
По умолчанию свойство restrict равняется null. Это означает, что никаких ограничений на вводимые символы не существует.
При программном переопределении свойства text или переменной поля ограничения свойства restrict не действуют. Поэтому таким образом можно вывести в поле совершенно любой текст.
Настройки, которая была бы прямым аналогом свойства restrict, на Инспекторе Свойств поля ввода нет. Однако ограничить количество доступных для введения символов можно и не применяя ActionScript. Для этого нужно, используя панель Character Options, вызываемую нажатием кнопки Character (рис. 13.1,11), встроить в фильм контуры необходимых символов. При этом поле по умолчанию будет использовать только их, следовательно, никакой другой символ ввести будет нельзя. Подробнее об особенностях встраивания шрифтов в swf-фильмы читайте в разделе 13,7.
13.5.7. Выделение текста поля
По умолчанию текст динамических полей является выделяемым. Это означает, что при наведении на текстовое поле указателя мыши его форма будет меняться со стрелки на I-курсор. Если щелкнуть по такому полю и, удерживая кнопку мыши нажатой, сместить указатель, участок текста окажется выделенным. Правый щелчок мыши по выделяемому полю вызовет контекстное меню с доступными командами Сору (Копировать) и Select All (Выделить все).
Если динамическое текстовое поле служит для отображения больших текстовых фрагментов, то возможность выделения текста просто необходима с точки зрения usability (удобства использования). Пользователь должен иметь возможность сохранить заинтересовавшую его информацию. Сделать же это, просто записав НТМL-страницу на диск, в случае Flash-сайтов можно далеко не всегда. Однако если динамическое текстовое поле является частью элемента интерфейса (например, надписью на кнопке), то возможность выделения текста может оказаться вредной. Так, при наведении указателя на кнопку, сверху которой находится динамическое поле с ее названием, его вид сменится не на очертания руки, а на «I». При щелчке по такой кнопке событие onPress не произойдет. Вместо этого выделится текст надписи.