Дострочное пересдача экзамена
|
Объекты и их использование
Работа с объектами string и selection
Объект String – один из наиболее часто используемых. Он располагает методами, удобными при построении и модифицировании строк – символьных последовательностей (в скриптах они заключаются в кавычки), содержащими информацию, понятную любому, кто умеет читать.
message = "No shoes, no service!"
Эта строка скрипта создает переменную с именем message, значением которой является строка. В данном случае мы можем считать, что эта переменная есть экземпляр объекта String – а значит, мы можем манипулировать ее значением, используя методы объекта String.
Рассмотрим несколько примеров.
Метод toUpperCase() объекта String меняет все буквы строки на заглавные. Например:
message = message.toUpperCase();
Этот скрипт изменил переменную message, и теперь он содержит строку "NO SHOES, NO SERVICE!". Можно достигнуть и противоположного эффекта – сделать все буквы строчными, для этого следует применить метод toLowerCase().
Заметим, что значение экземпляра текстового поля (текст в этом поле) тоже рассматривается как экземпляр объекта String. Так, если бы message было именем экземпляра текстового поля, то предыдущий скрипт следовало бы записать так:
message.text = message.text.toUpperCase();
Есть ли тут какие-либо преимущества? На самом деле, нет: все проекты разные, в одних случаях предпочтительнее пользоваться переменной, в других – именем текстового поля. Итак, экземпляр объекта String можно создать одним из следующих способов:
- Использовать конструктор, например: myNewStringObject = new String("Hello");. Для обращения к экземпляру объекта служит имя myNewStringObject.
- Присвоить переменной строковое значение. Для обращения к экземпляру объекта используется имя переменной.
- Создать текстовое поле. Для обращения к экземпляру объекта используется конструкция имя-ТекстовогоПоля.text.
Большинство проектов в этой книге содержит текстовые поля, так что вы, пожалуй, обнаружите, что мы чаще всего используем последний вариант.
Еще один полезный метод объекта String – indexOf() – позволяет найти в строке определенный (первый встретившийся) символ или последовательность символов. В результате возвращается число – индекс символа, то есть номер первого встреченного в строке совпавшего символа. Первый символ в строке имеет индекс 0, второй – индекс 1, и так далее. Если метод indexOf() не находит совпадения символа или группы символов, то возвращается значение -1. Вот пример использования метода indexOf():
message.text = "No shoes no service!"; firstS = message.text.indexOf("s");
Переменной firstS будет присвоено значение 3 – именно таков индекс первой встреченной в строке буквы s.
No shoes no service! ||||||| 0123456
Порой может быть полезно определить число символов в строке. Сделать это просто, поскольку всякий экземпляр объекта String имеет такое свойство, как длина – length. Длина строки часто применяется для проверки введенной пользователем в текстовое поле информации. Скажем, вы хотите, чтобы пользователь ввел в поле правильный почтовый индекс; при этом вы знаете, что индекс должен состоять из пяти символов. Тогда вы можете создать несложный скрипт для проверки:
zipCode.text = "27609"; zipLength = zipCode.text.length; if (zipLength == 5) { // Длина индекса верная } else { //Длина индекса неверна }
В первой строке задается текстовое значение, отображаемое в текстовом поле zipCode (мы предполагаем, что его ввел пользователь). В следующей строке создается переменная с именем zipLength и ей присваивается значение свойства length экземпляра zipCode.text – в данном случае 5, поскольку именно столько символов содержит поле zipCode. Последняя часть скрипта – оператор if, который должен содержать один набор действий на тот случай, если zipLength равно 5, и другой набор на случай, если это не так.
Объект Selection позволяет управлять различными аспектами текстового поля, находящегося в фокусе, в том числе выделенным текстом, получением и установкой текущей позиции курсора и так далее. Считается, что текстовое поле находится в фокусе, если пользователь установил в него курсор. Если ни одно из текстовых полей в фокусе не находится, то объект Selection не существует.
Итак, щелкнув в текстовом поле, пользователь устанавливает его в фокус. Однако вы можете отвергнуть выбор пользователя при помощи метода setFocus() – очень важная возможность, ведь в каждый момент времени существует только один объект Selection, и прочие его методы применяются к полю, находящемуся в фокусе (в следующем упражнении вы убедитесь, что далеко не всегда можно положиться на то, что пользователь выберет – и установит в фокус – нужное текстовое поле).
И еще об одном методе объекта Selection – он позволяет выделить порцию текста динамически, без участия пользователя. Этот метод (синтаксис Selection.setSelection(param1, param2) ) имеет два параметра: индекс символа, с которого начинается выделение и индекс символа, которым выделение заканчивается. Допустим, имеется текстовое поле, содержащее текст "Derek is the craziest person I know". Чтобы выделить слово craziest (мы предполагаем, что поле находится в фокусе), нужно написать так:
Selection.setSelection(13, 20);
В этом упражнении мы создадим простенький текстовый редактор, используя большую часть методов объектов String и Selection.
- Откройте файл wordProcessor1.fla из папки Lesson04/Assets.
В этом файле два слоя – Background и Buttons. Слой Background содержит изображение окна текстового редактора, а также текстовые поля. В слое Buttons находятся четыре кнопки, расположенные в верхней части окна редактора. На сцене три текстовых поля. Самое большое, в центре, представляет "текстовый документ". Имя экземпляра этого поля – inputField. Следующее поле, рядом с кнопкой Find, называется findField. При воспроизведении фильма пользователь сможет ввести в это поле символ или строку символов, с тем, чтобы они были найдены в поле inputField. Результат поиска будет отображен в третьем текстовом поле, в нижней части окна – оно называется status. В этом же текстовом поле будут отображаться результаты подсчета общего числа символов в документе. К кнопкам в верхней части окна мы присоединим различные скрипты, обеспечивающие работу нашего текстового редактора.
- Откройте панель действия, выделите кнопку Uppercase (c большой буквой A) и введите следующий скрипт:
on (release) { inputField.text = inputField.text.toUpperCase(); }
Flash интерпретирует этот скрипт так: "При отпускании этой кнопки перевести содержимое текстового поля inputField в верхний регистр". Иными словами, после нажатия этой кнопки все буквы в поле inputField станут заглавными.
- Выделите кнопку Lowercase (c маленькой a) и введите в панели Действия следующий скрипт:
on (release) { inputField.text = inputField.text.toLowerCase(); }
Этот скрипт похож на предыдущий; отличие в том, что в данном случае все символы в текстовом поле inputField переводятся в нижний регистр (делаются строчными).
- Выделите кнопку Character Count (c надписью "123") и введите следующий скрипт:
on (release) { status.text = "В документе " + inputField.length + " символов."; }
При выполнении этого скрипта в текстовом поле status будет отображено сообщение. Сообщение строится динамически. Определяется свойство Length текстового поля inputField и вставляется в середину сообщения, между словами "В документе" и "символов". Если документ содержит 50 символов, сообщение будет выглядеть так: "В документе 50 символов".
- Выделите кнопку Find (с изображением лупы) и введите следующий скрипт:
on(release) { result = inputField.text.indexOf(findField.text); if(findField.text != "" && result >= 0) { status.text = "Первый такой набор начинается с символа номер " + result; Selection.setFocus("_root.inputField"); Selection.setSelection(result, result + findField.text.length); } else { status.text = "Такой набор символов не найден."; } }
Этот скрипт – самый сложный в этом упражнении. Первая строка присваивает значение переменной result при помощи метода indexOf() объекта String. Скрипт ищет в текстовом поле inputField символ или символы, введенные в поле findField и выдает индекс первого символа найденной комбинации. Этот индекс и становится значением переменной result. Если же такая комбинация символов не найдена, result получает значение –1.
В следующей части скрипта применен оператор if, выполняющий один из двух наборов действий в зависимости от того, выполнено ли условие (точнее, даже два). Если значением поля findField не является пустая строка (это чтобы удостовериться, пользователь ввел хоть что-нибудь в это поле) и значение result больше или равно 0 (так будет, если введенная комбинация символов найдена в документе), выполняются три следующих действия. Если же хотя бы одно из условий не выполнено, оператор переходит к секции else, и тогда выполняется только одно действие, отображающее в поле status сообщение "Такой набор символов не найден".
Предположим, что оба условия выполнены и посмотрим, что же происходит в этом случае. Выполняются три действия из первой секции оператора if. Первое действие отображает в текстовом поле status сообщение, создаваемое динамически – к строке "Первый такой набор начинается с символа номер" добавляется значение result. Если, к примеру, result равно 7, получится сообщение "Первый такой набор начинается с символа номер 7". Следующие два действия используют методы объекта Selection, чтобы выделить в поле inputField найденную комбинацию символов. Как вы помните, текстовое поле должно получить фокус, прежде чем к нему можно будет применить методы объекта Selection. Поскольку мы хотим выделить текст в поле inputField, мы, с помощью следующей строки, устанавливаем фокус на это поле:
Selection.setFocus("_root.inputField");
В следующей строке скрипта с помощью другого метода объекта Selection выделяется порция текста в поле, имеющем фокус. Вот эта строка:
Selection.setSelection(result, result + findField.text.length);
Мы использовали два динамически полученных значения в качестве параметров этого метода, чтобы указать начало и конец выделения. Мы хотим, чтобы выделение начиналось с первого найденного символа, поэтому в качестве стартовой точки выделения используем значение result. Конечная точка выделения вычисляется путем сложения значения result и значения свойства length текстового поля findField. Как это все работает? Предположим, мы ввели в поле inputField текст "У меня есть собака". Затем вы ввели "собака" в поле findField и нажали кнопку Find. При выполнении скрипта result получит значение 12 (слово "собака" начинается с символа 12), а findField.text.length будет иметь значение 6 (текст в этом поле состоит из шести символов). С этими значениями строка скрипта выглядела бы так:
Selection.setSelection(12, 12+6);
или
Selection.setSelection(12, 18);
В результате в текстовом поле inputField будут выделены символы с 12 по 18 – они и составляют слово "собака".
- Выполните команду Управление > Проверить фильм (Control > Test Movie).
Введите что-нибудь в поле inputField и попробуйте нажать кнопки Uppercase и Lowercase. Нажмите кнопку Count Characters, чтобы подсчитать число символов в документе. Наконец, попробуйте использовать функцию поиска, введя символ или несколько в поле findField и нажав кнопку Find.
- Закройте тестовый фильм и сохраните свою работу в файле wordProcessor2.fla.
Как видите, использовать методы объектов String и Selection совсем несложно – мы думаем, вы будете очень часто применять их для проверки и форматирования данных строкового типа.